From 57d4b6b350dc0e8f2a89e4f5f570ed3452551d85 Mon Sep 17 00:00:00 2001 From: Rob Hogan Date: Mon, 2 Mar 2026 10:35:06 -0800 Subject: [PATCH 001/595] Update Metro to 0.84.2 (#55854) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55854 Notably, fixes a regression where `metro-config` (and therefore `react-native/metro-config` did not ship types, leaving untyped `metro.config.js`. https://github.com/facebook/metro/releases/tag/v0.84.2 Changelog: [General][Changed]: Update Metro to ^0.84.2 Reviewed By: cortinico Differential Revision: D94901986 fbshipit-source-id: 02dc26ef0b8dcc67040d4d66dd22ef30d39a5bbf --- package.json | 4 +- packages/community-cli-plugin/package.json | 8 +- packages/metro-config/package.json | 4 +- packages/react-native/package.json | 4 +- yarn.lock | 223 +++++++++------------ 5 files changed, 106 insertions(+), 137 deletions(-) diff --git a/package.json b/package.json index 1d113816778..3c9036a2df8 100644 --- a/package.json +++ b/package.json @@ -98,8 +98,8 @@ "markdownlint-cli2": "^0.17.2", "markdownlint-rule-relative-links": "^3.0.0", "memfs": "^4.38.2", - "metro-babel-register": "^0.83.3", - "metro-transform-plugins": "^0.83.3", + "metro-babel-register": "^0.84.2", + "metro-transform-plugins": "^0.84.2", "micromatch": "^4.0.4", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index 957b9a0d89f..7725043fa76 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -34,13 +34,13 @@ "@react-native/dev-middleware": "0.85.0-main", "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.84.0", - "metro-config": "^0.84.0", - "metro-core": "^0.84.0", + "metro": "^0.84.2", + "metro-config": "^0.84.2", + "metro-core": "^0.84.2", "semver": "^7.1.3" }, "devDependencies": { - "metro-resolver": "^0.84.0" + "metro-resolver": "^0.84.2" }, "peerDependencies": { "@react-native-community/cli": "*", diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index 92be7eff445..530f533dcaf 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -37,7 +37,7 @@ "dependencies": { "@react-native/js-polyfills": "0.85.0-main", "@react-native/metro-babel-transformer": "0.85.0-main", - "metro-config": "^0.84.0", - "metro-runtime": "^0.84.0" + "metro-config": "^0.84.2", + "metro-runtime": "^0.84.2" } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 40467bdf641..f647c796e4c 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -179,8 +179,8 @@ "hermes-compiler": "0.0.0", "invariant": "^2.2.4", "memoize-one": "^5.0.0", - "metro-runtime": "^0.84.0", - "metro-source-map": "^0.84.0", + "metro-runtime": "^0.84.2", + "metro-source-map": "^0.84.2", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", diff --git a/yarn.lock b/yarn.lock index 5342c5629ce..4fa58c9e049 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,7 +54,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.25.0", "@babel/generator@^7.28.0", "@babel/generator@^7.29.0", "@babel/generator@^7.29.1", "@babel/generator@^7.7.2": +"@babel/generator@^7.28.0", "@babel/generator@^7.29.0", "@babel/generator@^7.29.1", "@babel/generator@^7.7.2": version "7.29.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== @@ -1028,7 +1028,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.0", "@babel/template@^7.25.9", "@babel/template@^7.27.2", "@babel/template@^7.28.6", "@babel/template@^7.3.3": +"@babel/template@^7.25.9", "@babel/template@^7.27.2", "@babel/template@^7.28.6", "@babel/template@^7.3.3": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== @@ -1037,7 +1037,7 @@ "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/traverse@^7.25.3", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.29.0": +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.8", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== @@ -3024,13 +3024,6 @@ babel-plugin-replace-ts-export-assignment@^0.0.2: resolved "https://registry.yarnpkg.com/babel-plugin-replace-ts-export-assignment/-/babel-plugin-replace-ts-export-assignment-0.0.2.tgz#927a30ba303fcf271108980a8d4f80a693e1d53f" integrity sha512-BiTEG2Ro+O1spuheL5nB289y37FFmz0ISE6GjpNCG2JuA/WNcuEHSYw01+vN8quGf208sID3FnZFDwVyqX18YQ== -babel-plugin-syntax-hermes-parser@0.32.0: - version "0.32.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz#06f7452bf91adf6cafd7c98e7467404d4eb65cec" - integrity sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg== - dependencies: - hermes-parser "0.32.0" - babel-plugin-syntax-hermes-parser@0.33.3: version "0.33.3" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz#07602f8163cc7e63c4ec17d47467f2a3c5db70e9" @@ -5150,11 +5143,6 @@ hermes-estree@0.25.1: resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== -hermes-estree@0.32.0: - version "0.32.0" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.32.0.tgz#bb7da6613ab8e67e334a1854ea1e209f487d307b" - integrity sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ== - hermes-estree@0.33.3: version "0.33.3" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.33.3.tgz#6d6b593d4b471119772c82bdb0212dfadabb6f17" @@ -5167,13 +5155,6 @@ hermes-parser@0.25.1, hermes-parser@^0.25.1: dependencies: hermes-estree "0.25.1" -hermes-parser@0.32.0: - version "0.32.0" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.32.0.tgz#7916984ef6fdce62e7415d354cf35392061cd303" - integrity sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw== - dependencies: - hermes-estree "0.32.0" - hermes-parser@0.33.3: version "0.33.3" resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.33.3.tgz#da50ababb7a5ab636d339e7b2f6e3848e217e09d" @@ -6703,10 +6684,10 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-register@^0.83.3: - version "0.83.3" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.83.3.tgz#2b8b3802b375b13d29ad41c09c4e41acae402a73" - integrity sha512-EjV03GKnJC9uS7/287L0/Fsn60GxI7TcgjeEqdqjz5JDmihRj+JVUJkAEp3ims9RdAlSud0OpjRJDjC3JFLW8Q== +metro-babel-register@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.84.2.tgz#180fb50e158040b49303ee4d1bf40e46293bcfbc" + integrity sha512-GDToA2s3egLO8rZv9Lj11lQBimkUT0rgl20d8qd8Z98khaRUGVtNjFVs88JQZzHjU8xpudFGbXuHiyztEMS9eg== dependencies: "@babel/core" "^7.25.2" "@babel/plugin-proposal-export-namespace-from" "^7.18.9" @@ -6715,65 +6696,65 @@ metro-babel-register@^0.83.3: "@babel/preset-typescript" "^7.24.7" "@babel/register" "^7.24.6" babel-plugin-replace-ts-export-assignment "^0.0.2" - babel-plugin-syntax-hermes-parser "0.32.0" + babel-plugin-syntax-hermes-parser "0.33.3" babel-plugin-transform-flow-enums "^0.0.2" escape-string-regexp "^1.0.5" flow-enums-runtime "^0.0.6" -metro-babel-transformer@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.84.0.tgz#58244905979809640d814e5bed267e2384c5203b" - integrity sha512-91uPQECjnYBNwyCJwsriG18N9HaQ0VcxGb7A0iWBsrNF49wbRblokm7YBz31O5r9cix0DxH2BiwreNWPP5q65w== +metro-babel-transformer@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.84.2.tgz#deeacd8169cb95fa79b2d1e52e7c84a2f5a44aa7" + integrity sha512-UZqjh1VMRDm0WasifM0aN+JreCn3CW0BaPoZgDXb0xOMFSF9dKZJsKhcrpzkjL1+qwmHFYjlhGiQ+tvXdSx+OQ== dependencies: "@babel/core" "^7.25.2" flow-enums-runtime "^0.0.6" hermes-parser "0.33.3" nullthrows "^1.1.1" -metro-cache-key@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.84.0.tgz#47c6d862ea60c112c7a7920cc965c6fd709ae927" - integrity sha512-hREMJDJQ3MZW8dXco06HcmhoET6eJjvaPAml3eScTZsp5XBWhknocEiR5zlqx3zKhs3x3K7DK2C8f0uf9X3h0A== +metro-cache-key@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.84.2.tgz#6744a65548b54494c95bd2c07f29e4f87dac0315" + integrity sha512-+yJxLYu5nhKp7jZD6wtx4dMoSqLzK6MeYVkjMaUgjuh2Lu8DwGrxRnbmIVnn5Z9AQOs/K4eOWmuD7N2p64UCMw== dependencies: flow-enums-runtime "^0.0.6" -metro-cache@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.84.0.tgz#923fb7f1078e5b08980df2fe91e78d41291203cc" - integrity sha512-qIjsTdzWDZMJrztup4u0AnokxIee73fbti2MkV7MgSQ85zSIUSgjV3++oCaQ2m+qzhy+XCasG3n51B+avVDMhw== +metro-cache@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.84.2.tgz#43cca15afd618467bb2dee0c9e31f52a882224f0" + integrity sha512-jPX2fwOc/MmP2KRScSg2jFtVN9BTd+QN6j/3qZ+HIbEAsePLONozbKR2kCIBGvVeBTe7js48WXziI4+AdfwfFQ== dependencies: exponential-backoff "^3.1.1" flow-enums-runtime "^0.0.6" https-proxy-agent "^7.0.5" - metro-core "0.84.0" + metro-core "0.84.2" -metro-config@0.84.0, metro-config@^0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.84.0.tgz#ca8a1e9deb92e041a64a6e3b85ead97a6a14b979" - integrity sha512-wXhIQebmW8jyNr2xht1tKFRio9hSThpYzkiDBBMggk/LYw/6KbaUyl1EKJmpm5M/KJ4XwrhL3yTTMi2MqfWaDw== +metro-config@0.84.2, metro-config@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.84.2.tgz#486bc7f64d3b6a4a325c4bedf654c8f2e4181d6f" + integrity sha512-ze7IgJwLJoXoTxeXW86xqqKoxXjE0gZg5w8kW2mawaWLSfuvI0KgVaaERXgoVuWl+DQU2q22tIeAEdsCyUZvBQ== dependencies: connect "^3.6.5" flow-enums-runtime "^0.0.6" jest-validate "^29.7.0" - metro "0.84.0" - metro-cache "0.84.0" - metro-core "0.84.0" - metro-runtime "0.84.0" + metro "0.84.2" + metro-cache "0.84.2" + metro-core "0.84.2" + metro-runtime "0.84.2" yaml "^2.6.1" -metro-core@0.84.0, metro-core@^0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.84.0.tgz#91270d60a91cbde96b067c9146c6fe0ce95a3737" - integrity sha512-HWDvRDFTNcNZqgSs2DQX379BAJHYdE6bsX4SNQztz9KUqDx5egrQPzIahtYP5irP/RbksTqKbGeXtJxVz2557A== +metro-core@0.84.2, metro-core@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.84.2.tgz#8c9ea2a3aa4d4db7639b1bbf4b17fc0b46e35a04" + integrity sha512-s9Ko372nzfbu5Y2uhWDlB/g3E6mba3Es95QzF/8IwNM4ynZgqM9rfnU0PR54onGvDGDfj44jbooSxaA1D09rDA== dependencies: flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.84.0" + metro-resolver "0.84.2" -metro-file-map@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.84.0.tgz#ddc1bf955a764e22ae84e525fd7fb37490798b28" - integrity sha512-euSnhAgRaaZdK1bdcPiez0MPErg+a0h6rrop+xcQI0mNQEm1GT6R5h+yycfMMQvPkZnfzpPkhjH+pr/x7BK4WQ== +metro-file-map@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.84.2.tgz#3d8c60771b1cb757a2ff8c3ba82fc5a6d04dd47d" + integrity sha512-ZgX1lXO9YJCgTY6OSuwvRcHdhXjAFd1DdYC4g2B+d7yAtLUW1/OqwTLpW6ixl1zqZDDQSDSYZXDsN7DL2IumBw== dependencies: debug "^4.4.0" fb-watchman "^2.0.0" @@ -6785,60 +6766,60 @@ metro-file-map@0.84.0: nullthrows "^1.1.1" walker "^1.0.7" -metro-minify-terser@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.84.0.tgz#93c8be2b7f7feb55110e8064d77939ea8d849d47" - integrity sha512-STWICiHB3Lywl+K5eOl7Xm8/5+S9ch1YLXinXN0hDijq3SOh2UTGspxUZhWmqOvkDt/nd8dG/zSJO7JfcisV5A== +metro-minify-terser@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.84.2.tgz#f1a0a46f83ddaeb1e73dd08f362c0daaad01c87b" + integrity sha512-1TNGPN4oUose+XSHsdDUvcvPHQxKP5lZNbiS6UteTXX+6zFNu+IzxqSokyrDoj9BSjVbdClrB3okuI+Fpls3LA== dependencies: flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-resolver@0.84.0, metro-resolver@^0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.84.0.tgz#d0deca4dd575bc770b48768ee8999e1d950bbf8f" - integrity sha512-RTzim9q3rTz5AsRB/RBsTvy+GqHt6LzlIHx8YERv7eGDLjjr291tX2+2g//wbn/uNR/nLtdzJ08FfW1s6qZo/Q== +metro-resolver@0.84.2, metro-resolver@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.84.2.tgz#9ddefcdfc244f503b77573aacdcdbf947e94b7b3" + integrity sha512-2i6OQJIv18+olvLnmcM20uhi1T729+25izZozqOugSaV0YGzMV/EXkYFqxkXC9iNsantGcI/w9PgaI89wLK6JQ== dependencies: flow-enums-runtime "^0.0.6" -metro-runtime@0.84.0, metro-runtime@^0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.84.0.tgz#6d6f20a48e1334816af74f63e8bdaa95598322bb" - integrity sha512-PJfD4arkFJrdnmJwrela+my+IgJIXSshA2gI3QiOWCzujBZX6XvsT0tKSwzw3FNMfU10OllO0X5tPcdTGTesjg== +metro-runtime@0.84.2, metro-runtime@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.84.2.tgz#0f6846d72a040780c39575983a51d674d4e5f335" + integrity sha512-NzzORY2+mmN3tLhsZ7N4GDOBERusalyM1o1k36euulUIEe8UkDhwzcsRexvxKaSkrGLiRQ9PYDLp9uxPkQ+A0Q== dependencies: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-source-map@0.84.0, metro-source-map@^0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.84.0.tgz#1391e8ad7952f54c56c87f49e8883db159cc1f4e" - integrity sha512-09CAPDBWO7gveW4GdLbWQJObxNrkElL5LQATG2xsU8wE7/TZgHc/MhEs8hm73ZC8lnIvCn5V7VS5lNlE6Od+Ww== +metro-source-map@0.84.2, metro-source-map@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.84.2.tgz#19ccc64c1d586ec9dbc8031327e7b65a14b08197" + integrity sha512-m6rRVBefzaAyn6dBk5GOabVchCQ3VIS1/MhCj61dJB5cqLOOx34BV3DRFwnDBkuPw2RR/LUoul0U1sixlS9VQg== dependencies: "@babel/traverse" "^7.29.0" "@babel/types" "^7.29.0" flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.84.0" + metro-symbolicate "0.84.2" nullthrows "^1.1.1" - ob1 "0.84.0" + ob1 "0.84.2" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.84.0.tgz#18c42ecc3108b4790f5554b1b76fcc8579e1748d" - integrity sha512-JehuiPnqtS5I2luZdk7UHUY7bjNY/4xX1cJ8ezXWutTitiLp489Fsx+aErDTVoWcAx15lrjWa8IpTwoR0JLtZg== +metro-symbolicate@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.84.2.tgz#da54c2edb7db535392ddf77c565b52b609f66101" + integrity sha512-o0RY49012YcGE1E4GsZtgzFCBPeoxlASzIsD5CNOTmAoKDIroHfTFFiYCGPLCGwRwQjMaCChhoH0TZCjAyyCKA== dependencies: flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.84.0" + metro-source-map "0.84.2" nullthrows "^1.1.1" source-map "^0.5.6" vlq "^1.0.0" -metro-transform-plugins@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.84.0.tgz#484f1abc85134d28513eb80b5164323f0fd0fe35" - integrity sha512-B/5eGY4w9YA7wZ5DkWYsW4ZQ/6KkPH97A/F9s6Jj2s9f586p3tGa2sbsm8WXFXNk26tprHda8EOaO6dNSw/TmA== +metro-transform-plugins@0.84.2, metro-transform-plugins@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.84.2.tgz#b0eb7eff77d16b33b76349976dd19d33c3ca9c38" + integrity sha512-/821YLQv4PgD1NOruzPkr0r3HDALXqwCEECewyEQZ5hmSb8jzf1VdEpf3F8fx8zI4/5dHY/rARDVVuHCEb/Xrg== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.29.1" @@ -6847,41 +6828,29 @@ metro-transform-plugins@0.84.0: flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-plugins@^0.83.3: - version "0.83.3" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz#2c59ba841e269363cf3acb13138cb992f0c75013" - integrity sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A== - dependencies: - "@babel/core" "^7.25.2" - "@babel/generator" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.3" - flow-enums-runtime "^0.0.6" - nullthrows "^1.1.1" - -metro-transform-worker@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.84.0.tgz#8d278f7023bdfd2c0bda07cfc571932af4c47494" - integrity sha512-5fwkH5SrrM4RvASbZMQmA0SCiSWeseNbOE99etYjGrns/yFLxO7+oyGPQcoMNo3hMQlQ2Vyd2UcKNc+D81xSew== +metro-transform-worker@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.84.2.tgz#7843ce4e50bacb8f3d9a13a4c55b072625ed42bd" + integrity sha512-aR09svo3WC7OTYk5YB0VY0iSXOGrPdfmQWIxG8ADD2cKf/B95VR+y4GgVUbqB31buNvgtU+iCx9186i/YaNGlw== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.29.1" "@babel/parser" "^7.29.0" "@babel/types" "^7.29.0" flow-enums-runtime "^0.0.6" - metro "0.84.0" - metro-babel-transformer "0.84.0" - metro-cache "0.84.0" - metro-cache-key "0.84.0" - metro-minify-terser "0.84.0" - metro-source-map "0.84.0" - metro-transform-plugins "0.84.0" + metro "0.84.2" + metro-babel-transformer "0.84.2" + metro-cache "0.84.2" + metro-cache-key "0.84.2" + metro-minify-terser "0.84.2" + metro-source-map "0.84.2" + metro-transform-plugins "0.84.2" nullthrows "^1.1.1" -metro@0.84.0, metro@^0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.84.0.tgz#06f5588f3da643cbfbf94d528ec4dd91f85e5a96" - integrity sha512-Dy3KZphEH0xUO3rxRSwrCdge2vVjBAbSlPAKcL8qRnNEBlHz/3jPbmbb2fs9BVOrqBTi8EVDu/jdpCdWvg1ygA== +metro@0.84.2, metro@^0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.84.2.tgz#edc12b614a482013039174780130eb20e701faac" + integrity sha512-Qw7sl+e34cf/0LYEvDfVPiWvXmkvpuVgFqjzhPCc9Mw30NsvRFYZEH6I9zEHlpjugIveV+Jzdqt3YSPMU+Hx/w== dependencies: "@babel/code-frame" "^7.29.0" "@babel/core" "^7.25.2" @@ -6904,18 +6873,18 @@ metro@0.84.0, metro@^0.84.0: jest-worker "^29.7.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.84.0" - metro-cache "0.84.0" - metro-cache-key "0.84.0" - metro-config "0.84.0" - metro-core "0.84.0" - metro-file-map "0.84.0" - metro-resolver "0.84.0" - metro-runtime "0.84.0" - metro-source-map "0.84.0" - metro-symbolicate "0.84.0" - metro-transform-plugins "0.84.0" - metro-transform-worker "0.84.0" + metro-babel-transformer "0.84.2" + metro-cache "0.84.2" + metro-cache-key "0.84.2" + metro-config "0.84.2" + metro-core "0.84.2" + metro-file-map "0.84.2" + metro-resolver "0.84.2" + metro-runtime "0.84.2" + metro-source-map "0.84.2" + metro-symbolicate "0.84.2" + metro-transform-plugins "0.84.2" + metro-transform-worker "0.84.2" mime-types "^3.0.1" nullthrows "^1.1.1" serialize-error "^2.1.0" @@ -7393,10 +7362,10 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.84.0: - version "0.84.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.84.0.tgz#345f38bbd684004fdd3cc12b2c16e8157b1d5fbb" - integrity sha512-NBpmKuboMBiWd1V6U6ISIqLg8Az5BHARnKdS/k8IS7spNt931++4BflqI/TMt4otQ387Q5PFB1fzSLRNPC3HZA== +ob1@0.84.2: + version "0.84.2" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.84.2.tgz#e5ca33ff4cdda57218197c662f377baf79529d64" + integrity sha512-JID0ti8tDRQZJdQ3l+UeVAsKP+dW5Ucmktes/J9FwqP5KarafoTMqWvw4LRKrMtA7yWT3r/+E2w5wapd89GToA== dependencies: flow-enums-runtime "^0.0.6" From dd6980cd229c29f49a8c0deba3b4ea2a1e53f68e Mon Sep 17 00:00:00 2001 From: Laura Macaluso Date: Mon, 2 Mar 2026 11:38:05 -0800 Subject: [PATCH 002/595] Add Fantom integration test for TouchableHighlight (#55856) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55856 Changelog: [Internal] TouchableHighlight was the only Touchable component without a Fantom integration test. Both TouchableOpacity and TouchableWithoutFeedback already had itests. This adds one for TouchableHighlight to complete the Fantom coverage for the Touchable family. Tests cover: rendering, accessibility props (via accessibilityPropsSuite), style application, activeOpacity, onPress callback, disabled state, children rendering, and ref instance/tagName. Reviewed By: sammy-SC Differential Revision: D94915558 fbshipit-source-id: 5f8ef3039a2f8a4983ee5e26e7f300797f33d61d --- .../__tests__/TouchableHighlight-itest.js | 246 ++++++++++++++++++ .../__tests__/TouchableHighlight-test.js | 90 ------- .../TouchableHighlight-test.js.snap | 174 ------------- 3 files changed, 246 insertions(+), 264 deletions(-) create mode 100644 packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js delete mode 100644 packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-test.js delete mode 100644 packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap diff --git a/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js b/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js new file mode 100644 index 00000000000..5073c21afe5 --- /dev/null +++ b/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js @@ -0,0 +1,246 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + * @oncall react_native + */ + +import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment'; + +import type {AccessibilityProps, HostInstance} from 'react-native'; + +import * as Fantom from '@react-native/fantom'; +import * as React from 'react'; +import {createRef} from 'react'; +import {Text, TouchableHighlight, View} from 'react-native'; +import accessibilityPropsSuite from 'react-native/src/private/__tests__/utilities/accessibilityPropsSuite'; +import ensureInstance from 'react-native/src/private/__tests__/utilities/ensureInstance'; +import ReactNativeElement from 'react-native/src/private/webapis/dom/nodes/ReactNativeElement'; + +describe('', () => { + describe('props', () => { + describe('rendering', () => { + it('renders as a view with accessible="true"', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect(root.getRenderedOutput({props: ['accessible']}).toJSX()).toEqual( + , + ); + }); + }); + + component ComponentWithAccessibilityProps(...props: AccessibilityProps) { + return ( + + Touchable + + ); + } + + accessibilityPropsSuite(ComponentWithAccessibilityProps); + + describe('style', () => { + it('applies style props', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root + .getRenderedOutput({ + props: ['width', 'height', 'backgroundColor'], + }) + .toJSX(), + ).toEqual( + , + ); + }); + }); + + describe('activeOpacity', () => { + it('does not render explicit opacity when using default', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect(root.getRenderedOutput({props: ['opacity']}).toJSX()).toEqual( + , + ); + }); + + it('renders with custom style opacity', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect(root.getRenderedOutput({props: ['opacity']}).toJSX()).toEqual( + , + ); + }); + }); + + describe('onPress', () => { + it('triggers callback when the element is pressed', () => { + const elementRef = createRef(); + const onPressCallback = jest.fn(); + + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + const element = ensureInstance(elementRef.current, ReactNativeElement); + Fantom.dispatchNativeEvent(element, 'click'); + + expect(onPressCallback).toHaveBeenCalledTimes(1); + }); + }); + + describe('disabled', () => { + it('cannot be pressed when disabled', () => { + const elementRef = createRef(); + const onPressCallback = jest.fn(); + + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + const element = ensureInstance(elementRef.current, ReactNativeElement); + Fantom.dispatchNativeEvent(element, 'click'); + + expect(onPressCallback).toHaveBeenCalledTimes(0); + }); + + it('sets accessibilityState disabled to true', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + }); + }); + + describe('children', () => { + it('renders children inside the touchable', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + Press me + , + ); + }); + + expect(root.getRenderedOutput({props: ['accessible']}).toJSX()).toEqual( + + Press me + , + ); + }); + }); + }); + + describe('ref', () => { + describe('instance', () => { + it('is an element node', () => { + const elementRef = createRef(); + + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect(elementRef.current).toBeInstanceOf(ReactNativeElement); + }); + + it('uses the "RN:View" tag name', () => { + const elementRef = createRef(); + + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + const element = ensureInstance(elementRef.current, ReactNativeElement); + expect(element.tagName).toBe('RN:View'); + }); + }); + }); +}); diff --git a/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-test.js b/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-test.js deleted file mode 100644 index 338e22cdd3a..00000000000 --- a/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-test.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict-local - * @format - */ - -'use strict'; - -import Text from '../../../Text/Text'; -import View from '../../View/View'; -import TouchableHighlight from '../TouchableHighlight'; -import * as React from 'react'; - -const render = require('@react-native/jest-preset/jest/renderer'); - -describe('TouchableHighlight', () => { - it('renders correctly', async () => { - const instance = await render.create( - - Touchable - , - ); - - expect(instance.toJSON()).toMatchSnapshot(); - }); - - it('has displayName', () => { - expect(TouchableHighlight.displayName).toEqual('TouchableHighlight'); - }); -}); - -describe('TouchableHighlight with disabled state', () => { - it('should be disabled when disabled is true', async () => { - expect( - await render.create( - - - , - ), - ).toMatchSnapshot(); - }); - - it('should be disabled when disabled is true and accessibilityState is empty', async () => { - expect( - await render.create( - - - , - ), - ).toMatchSnapshot(); - }); - - it('should keep accessibilityState when disabled is true', async () => { - expect( - await render.create( - - - , - ), - ).toMatchSnapshot(); - }); - - it('should overwrite accessibilityState with value of disabled prop', async () => { - expect( - await render.create( - - - , - ), - ).toMatchSnapshot(); - }); - - it('should disable button when accessibilityState is disabled', async () => { - expect( - await render.create( - - - , - ), - ).toMatchSnapshot(); - }); -}); diff --git a/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap b/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap deleted file mode 100644 index 35c845e9749..00000000000 --- a/packages/react-native/Libraries/Components/Touchable/__tests__/__snapshots__/TouchableHighlight-test.js.snap +++ /dev/null @@ -1,174 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`TouchableHighlight renders correctly 1`] = ` - - - Touchable - - -`; - -exports[`TouchableHighlight with disabled state should be disabled when disabled is true 1`] = ` - - - -`; - -exports[`TouchableHighlight with disabled state should be disabled when disabled is true and accessibilityState is empty 1`] = ` - - - -`; - -exports[`TouchableHighlight with disabled state should disable button when accessibilityState is disabled 1`] = ` - - - -`; - -exports[`TouchableHighlight with disabled state should keep accessibilityState when disabled is true 1`] = ` - - - -`; - -exports[`TouchableHighlight with disabled state should overwrite accessibilityState with value of disabled prop 1`] = ` - - - -`; From 26953d8343abb2ea05fe86857c2016a4fadb48b7 Mon Sep 17 00:00:00 2001 From: Alan Lee <42583872+alanleedev@users.noreply.github.com> Date: Mon, 2 Mar 2026 14:17:08 -0800 Subject: [PATCH 003/595] Update HERMES_V1_VERSION_NAME to 250829098.0.11 (#55857) Summary: update hermes v1 version name ## Changelog: [General][Changed] - Make React Native consume 250829098.0.11 [IOS] [FIXED] - Fix crash in RCTWebSocketModule when delegate callbacks fire after module invalidation Pull Request resolved: https://github.com/facebook/react-native/pull/55858 Test Plan: This is a race condition during module teardown that is difficult to reproduce deterministically — it surfaces in production Crashlytics reports (< 0.1% of sessions). The fix is a nil guard matching the defensive pattern already present in didFailWithError:. Reviewed By: javache Differential Revision: D95056045 Pulled By: cipolleschi fbshipit-source-id: 02d715dfdf1816b5366ec077849d560133a857c8 --- .../React/CoreModules/RCTWebSocketModule.mm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTWebSocketModule.mm b/packages/react-native/React/CoreModules/RCTWebSocketModule.mm index 27f53f88dd8..20d4b948033 100644 --- a/packages/react-native/React/CoreModules/RCTWebSocketModule.mm +++ b/packages/react-native/React/CoreModules/RCTWebSocketModule.mm @@ -166,6 +166,9 @@ - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message NSString *type; NSNumber *socketID = [webSocket reactTag]; + if (!socketID) { + return; + } id contentHandler = _contentHandlers[socketID]; if (contentHandler) { message = [contentHandler processWebsocketMessage:message forSocketID:socketID withType:&type]; @@ -178,18 +181,25 @@ - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message } } - [self sendEventWithName:@"websocketMessage" body:@{@"data" : message, @"type" : type, @"id" : webSocket.reactTag}]; + [self sendEventWithName:@"websocketMessage" body:@{@"data" : message, @"type" : type, @"id" : socketID}]; } - (void)webSocketDidOpen:(SRWebSocket *)webSocket { + NSNumber *socketID = [webSocket reactTag]; + if (!socketID) { + return; + } [self sendEventWithName:@"websocketOpen" - body:@{@"id" : webSocket.reactTag, @"protocol" : webSocket.protocol ? webSocket.protocol : @""}]; + body:@{@"id" : socketID, @"protocol" : webSocket.protocol ? webSocket.protocol : @""}]; } - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error { NSNumber *socketID = [webSocket reactTag]; + if (!socketID) { + return; + } _contentHandlers[socketID] = nil; _sockets[socketID] = nil; NSDictionary *body = @@ -203,6 +213,9 @@ - (void)webSocket:(SRWebSocket *)webSocket wasClean:(BOOL)wasClean { NSNumber *socketID = [webSocket reactTag]; + if (!socketID) { + return; + } _contentHandlers[socketID] = nil; _sockets[socketID] = nil; [self sendEventWithName:@"websocketClosed" From a19d98e5428f710716486b064c3b0589355c5641 Mon Sep 17 00:00:00 2001 From: Fabrizio Duroni Date: Tue, 3 Mar 2026 08:19:57 -0800 Subject: [PATCH 031/595] loadBundleFromServer test: remove legacy Jest timers, increased coverage and improved assertions (#55863) Summary: This PR removes the dependency on Jest legacy fake timers from the `loadBundleFromServer` test suite. Together with https://github.com/facebook/react-native/issues/55757, this should remove the last usages of `jest.useFakeTimers({legacyFakeTimers: true});` in the codebase. In this PR in particular, instead of migrating to modern timers, I refactored the `addListener` mock to use a Promise based approach. By leveraging microtask scheduling, the tests simulate asynchronous functions flushed after the execution of the `sendRequest` without relying on timers. In addition, I also improved the tests in other areas: * improved readability by extracting a constant for the request id, used in both `sendRequest` and `addListener` mocks * improved errors assertions to explicitly verify the errors are thrown (before the refactoring these tests could still be green if no error was thrown, because the expectations were only in the catch clause that could be skipped) * improved the tests that verify the successful bundle load: * spit long test in ad hoc isolated ones * added listeners registration and cleanup verification to improve the coverage * added more fine-grained check for the `sendRequest` parameters I tried to separate all the changes above in specific commit so that the review can check the incremental improvements I applied with the refactoring steps. ## Changelog: [GENERAL] [CHANGED] - loadBundleFromServer test: remove legacy Jest timers, increased coverage and improved assertions Pull Request resolved: https://github.com/facebook/react-native/pull/55863 Test Plan: * Ran loadBundleFromServer-test and verified all tests cases passed * Ran the React Native test suite to ensure all tests pass * Verified test correctness by intentionally breaking production code after fixing the tests (eg. remove observer/change listener code) Reviewed By: cortinico Differential Revision: D95034650 Pulled By: vzaidman fbshipit-source-id: f6ae7cbc95ccfe606c1054c9044bf733e41bc2f9 --- .../__tests__/loadBundleFromServer-test.js | 119 ++++++++++-------- 1 file changed, 70 insertions(+), 49 deletions(-) diff --git a/packages/react-native/Libraries/Core/Devtools/__tests__/loadBundleFromServer-test.js b/packages/react-native/Libraries/Core/Devtools/__tests__/loadBundleFromServer-test.js index b8101af7f71..92827be1d97 100644 --- a/packages/react-native/Libraries/Core/Devtools/__tests__/loadBundleFromServer-test.js +++ b/packages/react-native/Libraries/Core/Devtools/__tests__/loadBundleFromServer-test.js @@ -10,8 +10,11 @@ 'use strict'; -// TODO(legacy-fake-timers): Fix these tests to work with modern timers. -jest.useFakeTimers({legacyFakeTimers: true}); +import { + LoadBundleFromServerError, + LoadBundleFromServerRequestError, +} from '../loadBundleFromServer'; +import invariant from 'invariant'; jest.mock('../../../Utilities/HMRClient'); @@ -36,6 +39,8 @@ jest.mock('../../../Utilities/DevLoadingView', () => ({ default: loadingViewMock, })); +const REQUEST_ID = 1; + const sendRequest = jest.fn( ( method, @@ -49,32 +54,31 @@ const sendRequest = jest.fn( callback, withCredentials, ) => { - callback(1); + callback(REQUEST_ID); }, ); +const removeListener = jest.fn(); +const addListener = jest.fn((name, fn) => { + if (name === 'didReceiveNetworkData') { + void Promise.resolve().then(() => fn([REQUEST_ID, mockDataResponse])); + } else if (name === 'didCompleteNetworkResponse') { + void Promise.resolve().then(() => fn([REQUEST_ID, mockRequestError])); + } else if (name === 'didReceiveNetworkResponse') { + void Promise.resolve().then(() => fn([REQUEST_ID, null, mockHeaders])); + } + return {remove: removeListener}; +}); + jest.mock('../../../Network/RCTNetworking', () => ({ __esModule: true, default: { sendRequest, - addListener: jest.fn((name, fn) => { - if (name === 'didReceiveNetworkData') { - setImmediate(() => fn([1, mockDataResponse])); - } else if (name === 'didCompleteNetworkResponse') { - setImmediate(() => fn([1, mockRequestError])); - } else if (name === 'didReceiveNetworkResponse') { - setImmediate(() => fn([1, null, mockHeaders])); - } - return {remove: () => {}}; - }), + addListener, }, })); let loadBundleFromServer: (bundlePathAndQuery: string) => Promise; -const { - LoadBundleFromServerError, - LoadBundleFromServerRequestError, -} = require('../loadBundleFromServer'); let mockHeaders: {'Content-Type': string}; let mockDataResponse; @@ -91,13 +95,16 @@ test('loadBundleFromServer will throw for JSON responses', async () => { mockDataResponse = JSON.stringify({message: 'Error thrown from Metro'}); mockRequestError = null; - try { - await loadBundleFromServer('/Fail.bundle?platform=ios'); - } catch (e) { - expect(e).toBeInstanceOf(LoadBundleFromServerError); - expect(e.message).toBe('Could not load bundle'); - expect(e.cause).toBe('Error thrown from Metro'); - } + const error: mixed = await loadBundleFromServer( + '/Fail.bundle?platform=ios', + ).catch(e => e); + + invariant( + error instanceof LoadBundleFromServerError, + 'Expected a LoadBundleFromServerError', + ); + expect(error.message).toBe('Could not load bundle'); + expect(error.cause).toBe('Error thrown from Metro'); }); test('loadBundleFromServer will throw LoadBundleFromServerError for request errors', async () => { @@ -105,16 +112,19 @@ test('loadBundleFromServer will throw LoadBundleFromServerError for request erro mockDataResponse = ''; mockRequestError = 'Some error'; - try { - await loadBundleFromServer('/Fail.bundle?platform=ios'); - } catch (e) { - expect(e).toBeInstanceOf(LoadBundleFromServerRequestError); - expect(e.message).toBe('Could not load bundle'); - expect(e.cause).toBe('Some error'); - } + const error: mixed = await loadBundleFromServer( + '/Fail.bundle?platform=ios', + ).catch(e => e); + + invariant( + error instanceof LoadBundleFromServerRequestError, + 'Expected a LoadBundleFromServerRequestError', + ); + expect(error.message).toBe('Could not load bundle'); + expect(error.cause).toBe('Some error'); }); -test('loadBundleFromServer will request a bundle if import bundles are available', async () => { +test('loadBundleFromServer successfully requests a bundle (root bundle)', async () => { mockDataResponse = '"code";'; mockHeaders = {'Content-Type': 'application/javascript'}; mockRequestError = null; @@ -126,19 +136,27 @@ test('loadBundleFromServer will request a bundle if import bundles are available expect(sendRequest.mock.calls).toEqual([ [ 'GET', - expect.anything(), + 'asyncRequest', 'localhost:8042/Banana.bundle?platform=ios&dev=true&minify=false&unusedExtraParam=42&modulesOnly=true&runModule=false', - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), + {}, + '', + 'text', + true, + 0, + expect.any(Function), + true, ], ]); - sendRequest.mockClear(); + expect(addListener).toHaveBeenCalledTimes(4); + expect(removeListener).toHaveBeenCalledTimes(addListener.mock.calls.length); +}); + +test('loadBundleFromServer successfully requests a bundle (subdir bundle)', async () => { + mockDataResponse = '"code";'; + mockHeaders = {'Content-Type': 'application/javascript'}; + mockRequestError = null; + await loadBundleFromServer( '/Tiny/Apple.bundle?platform=ios&dev=true&minify=false&unusedExtraParam=42&modulesOnly=true&runModule=false', ); @@ -146,17 +164,20 @@ test('loadBundleFromServer will request a bundle if import bundles are available expect(sendRequest.mock.calls).toEqual([ [ 'GET', - expect.anything(), + 'asyncRequest', 'localhost:8042/Tiny/Apple.bundle?platform=ios&dev=true&minify=false&unusedExtraParam=42&modulesOnly=true&runModule=false', - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), - expect.anything(), + {}, + '', + 'text', + true, + 0, + expect.any(Function), + true, ], ]); + + expect(addListener).toHaveBeenCalledTimes(4); + expect(removeListener).toHaveBeenCalledTimes(addListener.mock.calls.length); }); test('shows and hides the loading view around a request', async () => { From 9ec7db552fe3ae239d2d13c6c423ad903600440c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Tue, 3 Mar 2026 08:33:27 -0800 Subject: [PATCH 032/595] Add support for parsing interfaces (#55770) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55770 This diff adds support for parsing Objective-C interfaces in the C++ API snapshot parser. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94071995 fbshipit-source-id: b1b89d520a489be7c4a0e790874dd9f7b518df35 --- .../manual_test/.doxygen.config.template | 2 +- scripts/cxx-api/parser/main.py | 76 ++++++++++++++++++- scripts/cxx-api/parser/scope.py | 51 +++++++++++++ scripts/cxx-api/parser/snapshot.py | 25 ++++++ .../snapshot.api | 2 + .../should_handle_interface_empty/test.h | 10 +++ .../snapshot.api | 7 ++ .../test.h | 18 +++++ .../snapshot.api | 5 ++ .../test.h | 14 ++++ .../snapshot.api | 5 ++ .../test.h | 14 ++++ 12 files changed, 226 insertions(+), 3 deletions(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_empty/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_empty/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/test.h diff --git a/scripts/cxx-api/manual_test/.doxygen.config.template b/scripts/cxx-api/manual_test/.doxygen.config.template index 9a4e9b94f37..80290595ec9 100644 --- a/scripts/cxx-api/manual_test/.doxygen.config.template +++ b/scripts/cxx-api/manual_test/.doxygen.config.template @@ -2442,7 +2442,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" ${PREDEFINED} # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/parser/main.py b/scripts/cxx-api/parser/main.py index 515f26704f2..2db54b9f26a 100644 --- a/scripts/cxx-api/parser/main.py +++ b/scripts/cxx-api/parser/main.py @@ -8,7 +8,6 @@ import os import re from enum import Enum -from pprint import pprint from doxmlparser import compound, index @@ -21,7 +20,7 @@ TypedefMember, VariableMember, ) -from .scope import ProtocolScopeKind, StructLikeScopeKind +from .scope import InterfaceScopeKind, ProtocolScopeKind, StructLikeScopeKind from .snapshot import Snapshot from .template import Template from .utils import Argument, extract_qualifiers, parse_qualified_path @@ -608,6 +607,66 @@ def create_protocol_scope(snapshot: Snapshot, scope_def: compound.CompounddefTyp ) +def create_interface_scope(snapshot: Snapshot, scope_def: compound.CompounddefType): + """ + Create an interface scope in the snapshot (Objective-C @interface). + """ + interface_name = scope_def.compoundname + + interface_scope = snapshot.create_interface(interface_name) + base_classes = get_base_classes(scope_def, base_class=InterfaceScopeKind.Base) + interface_scope.kind.add_base(base_classes) + interface_scope.location = scope_def.location.file + + for section_def in scope_def.sectiondef: + kind = section_def.kind + parts = kind.split("-") + visibility = parts[0] + is_static = "static" in parts + member_type = parts[-1] + + if visibility == "private": + pass + elif visibility in ("public", "protected"): + if member_type == "attrib": + for member_def in section_def.memberdef: + if member_def.kind == "variable": + interface_scope.add_member( + get_variable_member(member_def, visibility, is_static) + ) + elif member_type == "func": + for function_def in section_def.memberdef: + interface_scope.add_member( + get_function_member(function_def, visibility, is_static) + ) + elif member_type == "type": + for member_def in section_def.memberdef: + if member_def.kind == "enum": + create_enum_scope(snapshot, member_def) + elif member_def.kind == "typedef": + interface_scope.add_member( + get_typedef_member(member_def, visibility) + ) + else: + print( + f"Unknown section member kind: {member_def.kind} in {scope_def.location.file}" + ) + else: + print( + f"Unknown interface section kind: {kind} in {scope_def.location.file}" + ) + elif visibility == "property": + for member_def in section_def.memberdef: + if member_def.kind == "property": + interface_scope.add_member( + get_property_member(member_def, "public", is_static) + ) + else: + print( + f"Unknown interface visibility: {visibility} in {scope_def.location.file}" + ) + + def build_snapshot(xml_dir: str) -> Snapshot: """ Reads the Doxygen XML output and builds a snapshot of the C++ API. @@ -628,12 +687,23 @@ def build_snapshot(xml_dir: str) -> Snapshot: doxygen_object = compound.parse(detail_file, silence=True) for compound_object in doxygen_object.compounddef: + # Check if this is an Objective-C interface by looking at the compound id + # Doxygen reports ObjC interfaces as kind="class" but with id starting with "interface" + is_objc_interface = ( + compound_object.kind == "class" + and compound_object.id.startswith("interface") + ) + # classes and structs are represented by the same scope with a different kind if ( compound_object.kind == "class" or compound_object.kind == "struct" or compound_object.kind == "union" ): + # Handle Objective-C interfaces separately + if is_objc_interface: + create_interface_scope(snapshot, compound_object) + continue class_scope = ( snapshot.create_struct_like( compound_object.compoundname, StructLikeScopeKind.Type.CLASS @@ -781,6 +851,8 @@ def build_snapshot(xml_dir: str) -> Snapshot: pass elif compound_object.kind == "protocol": create_protocol_scope(snapshot, compound_object) + elif compound_object.kind == "interface": + create_interface_scope(snapshot, compound_object) else: print(f"Unknown compound kind: {compound_object.kind}") diff --git a/scripts/cxx-api/parser/scope.py b/scripts/cxx-api/parser/scope.py index 99935fb92c5..18880f12374 100644 --- a/scripts/cxx-api/parser/scope.py +++ b/scripts/cxx-api/parser/scope.py @@ -202,6 +202,57 @@ def to_string(self, scope: Scope) -> str: return result +class InterfaceScopeKind(ScopeKind): + class Base: + def __init__( + self, name: str, protection: str, virtual: bool, refid: str + ) -> None: + self.name: str = name + self.protection: str = protection + self.virtual: bool = virtual + self.refid: str = refid + + def __init__(self) -> None: + super().__init__("interface") + self.base_classes: [InterfaceScopeKind.Base] = [] + + def add_base( + self, base: InterfaceScopeKind.Base | [InterfaceScopeKind.Base] + ) -> None: + if isinstance(base, list): + for b in base: + self.base_classes.append(b) + else: + self.base_classes.append(base) + + def to_string(self, scope: Scope) -> str: + result = "" + + bases = [] + for base in self.base_classes: + base_text = [base.protection] + if base.virtual: + base_text.append("virtual") + base_text.append(base.name) + bases.append(" ".join(base_text)) + + inheritance_string = " : " + ", ".join(bases) if bases else "" + + result += f"{self.name} {scope.get_qualified_name()}{inheritance_string} {{" + + stringified_members = [] + for member in scope.get_members(): + stringified_members.append(member.to_string(2)) + stringified_members = natsorted(stringified_members) + result += ("\n" if len(stringified_members) > 0 else "") + "\n".join( + stringified_members + ) + + result += "\n}" + + return result + + class TemporaryScopeKind(ScopeKind): def __init__(self) -> None: super().__init__("temporary") diff --git a/scripts/cxx-api/parser/snapshot.py b/scripts/cxx-api/parser/snapshot.py index 5677653c665..87664bc8490 100644 --- a/scripts/cxx-api/parser/snapshot.py +++ b/scripts/cxx-api/parser/snapshot.py @@ -7,6 +7,7 @@ from .scope import ( EnumScopeKind, + InterfaceScopeKind, NamespaceScopeKind, ProtocolScopeKind, Scope, @@ -109,6 +110,30 @@ def create_protocol(self, qualified_name: str) -> Scope[ProtocolScopeKind]: current_scope.inner_scopes[scope_name] = new_scope return new_scope + def create_interface(self, qualified_name: str) -> Scope[InterfaceScopeKind]: + """ + Create an interface in the snapshot. + """ + path = parse_qualified_path(qualified_name) + scope_path = path[0:-1] + scope_name = path[-1] + current_scope = self.ensure_scope(scope_path) + + if scope_name in current_scope.inner_scopes: + scope = current_scope.inner_scopes[scope_name] + if scope.kind.name == "temporary": + scope.kind = InterfaceScopeKind() + else: + raise RuntimeError( + f"Identifier {scope_name} already exists in scope {current_scope.name}" + ) + return scope + else: + new_scope = Scope(InterfaceScopeKind(), scope_name) + new_scope.parent_scope = current_scope + current_scope.inner_scopes[scope_name] = new_scope + return new_scope + def create_enum(self, qualified_name: str) -> Scope[EnumScopeKind]: """ Create an enum in the snapshot. diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_empty/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_empty/snapshot.api new file mode 100644 index 00000000000..d34dd4d4b97 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_empty/snapshot.api @@ -0,0 +1,2 @@ +interface RCTEmptyInterface { +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_empty/test.h b/scripts/cxx-api/tests/snapshots/should_handle_interface_empty/test.h new file mode 100644 index 00000000000..dd07ab5f1ea --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_empty/test.h @@ -0,0 +1,10 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTEmptyInterface + +@end diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/snapshot.api new file mode 100644 index 00000000000..a76ddd4246e --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/snapshot.api @@ -0,0 +1,7 @@ +interface RCTBaseInterface { + public virtual void baseMethod(); +} + +interface RCTChildInterface : public RCTBaseInterface { + public virtual void childMethod(); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/test.h b/scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/test.h new file mode 100644 index 00000000000..d431b5357c7 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_inheritance/test.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTBaseInterface + +- (void)baseMethod; + +@end + +@interface RCTChildInterface : RCTBaseInterface + +- (void)childMethod; + +@end diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api new file mode 100644 index 00000000000..09d8acf7014 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api @@ -0,0 +1,5 @@ +interface RCTInterfaceWithMethod { + public virtual NSString * getTitle(); + public virtual void doSomething(); + public virtual void processValue:withName:(int value, NSString * name); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/test.h b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/test.h new file mode 100644 index 00000000000..d889dbf2117 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/test.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTInterfaceWithMethod + +- (void)doSomething; +- (NSString *)getTitle; +- (void)processValue:(int)value withName:(NSString *)name; + +@end diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api new file mode 100644 index 00000000000..b5649f46485 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api @@ -0,0 +1,5 @@ +interface RCTInterfaceWithProperty { + public @property (assign) BOOL enabled; + public @property (copy) NSString * title; + public @property (weak) id delegate; +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/test.h b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/test.h new file mode 100644 index 00000000000..e000d1845b6 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/test.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTInterfaceWithProperty + +@property (nonatomic, copy) NSString *title; +@property (nonatomic, assign) BOOL enabled; +@property (nonatomic, weak) id delegate; + +@end From 055fb7a8197a6f0fda89bce95e0f618f1dcfabcf Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Tue, 3 Mar 2026 09:22:51 -0800 Subject: [PATCH 033/595] Add missing viewtransition subdirectory to Fantom tester CMakeLists (#55887) Summary: The ViewTransitionModule commit (f81f73e5a02) added `react_renderer_viewtransition` as a dependency of `react_renderer_scheduler`, but did not update the Fantom tester's `CMakeLists.txt` to include the `react/renderer/viewtransition` subdirectory. This causes the Fantom tester build to fail with: ``` /usr/bin/ld: cannot find -lreact_renderer_viewtransition: No such file or directory ``` This adds `add_react_common_subdir(react/renderer/viewtransition)` to the Fantom tester CMakeLists. Changelog: [Internal] Pull Request resolved: https://github.com/facebook/react-native/pull/55887 Test Plan: - `run_fantom_tests` CI should pass with this fix. Reviewed By: cipolleschi Differential Revision: D95066938 Pulled By: cortinico fbshipit-source-id: aeda33365d9967fa7a3e07ac57c4a86863f20243 --- private/react-native-fantom/tester/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/private/react-native-fantom/tester/CMakeLists.txt b/private/react-native-fantom/tester/CMakeLists.txt index 235f744e620..a44f5a4a624 100644 --- a/private/react-native-fantom/tester/CMakeLists.txt +++ b/private/react-native-fantom/tester/CMakeLists.txt @@ -105,6 +105,7 @@ add_react_common_subdir(react/renderer/scheduler) add_react_common_subdir(react/renderer/telemetry) add_react_common_subdir(react/renderer/textlayoutmanager) add_react_common_subdir(react/renderer/uimanager) +add_react_common_subdir(react/renderer/viewtransition) add_react_common_subdir(react/renderer/uimanager/consistency) add_react_common_subdir(react/runtime) add_react_common_subdir(react/runtime/hermes) From c4a982920d2caeb6fc58b35151609421ccb99267 Mon Sep 17 00:00:00 2001 From: Andrew Datsenko Date: Tue, 3 Mar 2026 09:28:25 -0800 Subject: [PATCH 034/595] Add LLVM coverage conversion to LCOV format (#55860) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55860 Changelog: [Internal] This diff adds the ability to convert LLVM coverage JSON output to LCOV format for C++ code coverage in react-native-fantom. Key additions: - `convertLLVMCoverage.js`: Converts LLVM coverage data (segments, branches, functions) to LCOV format lines - `types.flow.js`: Flow type definitions for LLVM coverage data structures - Test utilities and fixtures for validating the conversion with real coverage data from various C++ files (AppSettings.cpp, Class.h, DevSettingsModule.h, NativeFantom.cpp/h, RawPropsKey.cpp) This enables reporting C++ code coverage from Fantom tests in a standard format that can be consumed by coverage tools. Reviewed By: sammy-SC Differential Revision: D90135000 fbshipit-source-id: 3b22250c4b1665748b6ccb4feb79cc1c20ec7fa6 --- .../__test_utils__/loadLLVMCoverage.js | 96 + .../resources/AppSettings.cpp.functions.json | 572 + .../resources/AppSettings.cpp.json | 611 + .../resources/AppSettings.cpp.lcov.json | 67 + .../resources/AppSettings.cpp.source | 79 + .../resources/Class.h.functions.json | 33560 ++++++++++++++++ .../__test_utils__/resources/Class.h.json | 6605 +++ .../resources/Class.h.lcov.json | 602 + .../__test_utils__/resources/Class.h.source | 75 + .../DevSettingsModule.h.functions.json | 20 + .../resources/DevSettingsModule.h.json | 52 + .../resources/DevSettingsModule.h.lcov.json | 14 + .../resources/DevSettingsModule.h.source | 60 + .../resources/NativeFantom.cpp.functions.json | 980 + .../resources/NativeFantom.cpp.json | 948 + .../resources/NativeFantom.cpp.lcov.json | 254 + .../resources/NativeFantom.cpp.source | 319 + .../resources/NativeFantom.h.functions.json | 407 + .../resources/NativeFantom.h.json | 383 + .../resources/NativeFantom.h.lcov.json | 47 + .../resources/NativeFantom.h.source | 149 + .../resources/RawPropsKey.cpp.functions.json | 475 + .../resources/RawPropsKey.cpp.json | 725 + .../resources/RawPropsKey.cpp.lcov.json | 78 + .../resources/RawPropsKey.cpp.source | 72 + .../coverage/__tests__/FantomCoverage-test.js | 113 + .../runner/coverage/convertLLVMCoverage.js | 345 + .../runner/coverage/types.flow.js | 56 + private/react-native-fantom/runner/runner.js | 2 +- private/react-native-fantom/runtime/setup.js | 3 +- 30 files changed, 47766 insertions(+), 3 deletions(-) create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/loadLLVMCoverage.js create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.functions.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.lcov.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.source create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.functions.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.lcov.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.source create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.functions.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.lcov.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.source create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.functions.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.lcov.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.source create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.functions.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.lcov.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.source create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.functions.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.lcov.json create mode 100644 private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.source create mode 100644 private/react-native-fantom/runner/coverage/__tests__/FantomCoverage-test.js create mode 100644 private/react-native-fantom/runner/coverage/convertLLVMCoverage.js create mode 100644 private/react-native-fantom/runner/coverage/types.flow.js diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/loadLLVMCoverage.js b/private/react-native-fantom/runner/coverage/__test_utils__/loadLLVMCoverage.js new file mode 100644 index 00000000000..ea429271107 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/loadLLVMCoverage.js @@ -0,0 +1,96 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +import type {LLVMFileData, LLVMFunctionData} from '../convertLLVMCoverage'; + +export type LLVMCoverage = { + file: LLVMFileData, + functions: Array, + lcov: string[], +}; + +export default function loadLLVMCoverage( + name: + | 'AppSettings.cpp' + | 'Class.h' + | 'DevSettingsModule.h' + | 'NativeFantom.h' + | 'NativeFantom.cpp' + | 'RawPropsKey.cpp', +): LLVMCoverage { + match (name) { + 'AppSettings.cpp' => { + return { + // $FlowExpectedError[untyped-import] + file: require('./resources/AppSettings.cpp.json') as LLVMFileData, + functions: + // $FlowExpectedError[untyped-import] + require('./resources/AppSettings.cpp.functions.json') as Array, + // $FlowExpectedError[untyped-import] + lcov: require('./resources/AppSettings.cpp.lcov.json') as string[], + }; + } + 'Class.h' => { + return { + // $FlowExpectedError[untyped-import] + file: require('./resources/Class.h.json') as LLVMFileData, + functions: + // $FlowExpectedError[untyped-import] + require('./resources/Class.h.functions.json') as Array, + // $FlowExpectedError[untyped-import] + lcov: require('./resources/Class.h.lcov.json') as string[], + }; + } + 'DevSettingsModule.h' => { + return { + // $FlowExpectedError[untyped-import] + file: require('./resources/DevSettingsModule.h.json') as LLVMFileData, + functions: + // $FlowExpectedError[untyped-import] + require('./resources/DevSettingsModule.h.functions.json') as Array, + // $FlowExpectedError[untyped-import] + lcov: require('./resources/DevSettingsModule.h.lcov.json') as string[], + }; + } + 'NativeFantom.cpp' => { + return { + // $FlowExpectedError[untyped-import] + file: require('./resources/NativeFantom.cpp.json') as LLVMFileData, + functions: + // $FlowExpectedError[untyped-import] + require('./resources/NativeFantom.cpp.functions.json') as Array, + // $FlowExpectedError[untyped-import] + lcov: require('./resources/NativeFantom.cpp.lcov.json') as string[], + }; + } + 'NativeFantom.h' => { + return { + // $FlowExpectedError[untyped-import] + file: require('./resources/NativeFantom.h.json') as LLVMFileData, + functions: + // $FlowExpectedError[untyped-import] + require('./resources/NativeFantom.h.functions.json') as Array, + // $FlowExpectedError[untyped-import] + lcov: require('./resources/NativeFantom.h.lcov.json') as string[], + }; + } + 'RawPropsKey.cpp' => { + return { + // $FlowExpectedError[untyped-import] + file: require('./resources/RawPropsKey.cpp.json') as LLVMFileData, + functions: + // $FlowExpectedError[untyped-import] + require('./resources/RawPropsKey.cpp.functions.json') as Array, + // $FlowExpectedError[untyped-import] + lcov: require('./resources/RawPropsKey.cpp.lcov.json') as string[], + }; + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.functions.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.functions.json new file mode 100644 index 00000000000..103056eac41 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.functions.json @@ -0,0 +1,572 @@ +[{ + "branches": [ + [ + 39, + 7, + 39, + 15, + 1, + 0, + 0, + 0, + 4 + ], + [ + 39, + 19, + 39, + 34, + 1, + 0, + 0, + 0, + 4 + ] + ], + "count": 1, + "filenames": [ + "private/react-native-fantom/tester/src/AppSettings.cpp" + ], + "name": "_ZN8facebook5react11AppSettings4initEiPPc", + "regions": [ + [ + 38, + 47, + 46, + 2, + 1, + 0, + 0, + 0 + ], + [ + 39, + 7, + 39, + 15, + 1, + 0, + 0, + 0 + ], + [ + 39, + 7, + 39, + 34, + 1, + 0, + 0, + 0 + ], + [ + 39, + 19, + 39, + 34, + 1, + 0, + 0, + 0 + ], + [ + 39, + 35, + 39, + 36, + 1, + 0, + 0, + 3 + ], + [ + 39, + 36, + 44, + 4, + 1, + 0, + 0, + 0 + ], + [ + 40, + 1, + 41, + 28, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [ + [ + 52, + 7, + 52, + 34, + 1, + 0, + 0, + 0, + 4 + ], + [ + 56, + 7, + 56, + 32, + 1, + 0, + 0, + 0, + 4 + ], + [ + 60, + 7, + 60, + 31, + 0, + 1, + 0, + 0, + 4 + ], + [ + 64, + 7, + 64, + 33, + 1, + 0, + 0, + 0, + 4 + ], + [ + 65, + 9, + 65, + 36, + 0, + 1, + 0, + 0, + 4 + ], + [ + 67, + 16, + 67, + 46, + 0, + 1, + 0, + 0, + 4 + ], + [ + 69, + 16, + 69, + 44, + 1, + 0, + 0, + 0, + 4 + ], + [ + 71, + 16, + 71, + 44, + 0, + 0, + 0, + 0, + 4 + ] + ], + "count": 1, + "filenames": [ + "private/react-native-fantom/tester/src/AppSettings.cpp" + ], + "name": "_ZN8facebook5react11AppSettings12initInternalEv", + "regions": [ + [ + 48, + 34, + 77, + 2, + 1, + 0, + 0, + 0 + ], + [ + 51, + 1, + 51, + 1, + 0, + 0, + 0, + 2 + ], + [ + 52, + 7, + 52, + 34, + 1, + 0, + 0, + 0 + ], + [ + 52, + 35, + 52, + 36, + 1, + 0, + 0, + 3 + ], + [ + 52, + 36, + 54, + 4, + 1, + 0, + 0, + 0 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ], + [ + 56, + 7, + 56, + 32, + 1, + 0, + 0, + 0 + ], + [ + 56, + 33, + 56, + 34, + 1, + 0, + 0, + 3 + ], + [ + 56, + 34, + 58, + 4, + 1, + 0, + 0, + 0 + ], + [ + 59, + 1, + 59, + 1, + 0, + 0, + 0, + 2 + ], + [ + 60, + 7, + 60, + 31, + 1, + 0, + 0, + 0 + ], + [ + 60, + 32, + 60, + 33, + 0, + 0, + 0, + 3 + ], + [ + 60, + 33, + 62, + 4, + 0, + 0, + 0, + 0 + ], + [ + 63, + 1, + 63, + 1, + 0, + 0, + 0, + 2 + ], + [ + 64, + 7, + 64, + 33, + 1, + 0, + 0, + 0 + ], + [ + 64, + 34, + 64, + 35, + 1, + 0, + 0, + 3 + ], + [ + 64, + 35, + 76, + 4, + 1, + 0, + 0, + 0 + ], + [ + 65, + 9, + 65, + 36, + 1, + 0, + 0, + 0 + ], + [ + 65, + 37, + 65, + 38, + 0, + 0, + 0, + 3 + ], + [ + 65, + 38, + 67, + 6, + 0, + 0, + 0, + 0 + ], + [ + 67, + 6, + 67, + 12, + 1, + 0, + 0, + 3 + ], + [ + 67, + 12, + 75, + 6, + 1, + 0, + 0, + 0 + ], + [ + 67, + 16, + 67, + 46, + 1, + 0, + 0, + 0 + ], + [ + 67, + 47, + 67, + 48, + 0, + 0, + 0, + 3 + ], + [ + 67, + 48, + 69, + 6, + 0, + 0, + 0, + 0 + ], + [ + 69, + 6, + 69, + 12, + 1, + 0, + 0, + 3 + ], + [ + 69, + 12, + 75, + 6, + 1, + 0, + 0, + 0 + ], + [ + 69, + 16, + 69, + 44, + 1, + 0, + 0, + 0 + ], + [ + 69, + 45, + 69, + 46, + 1, + 0, + 0, + 3 + ], + [ + 69, + 46, + 71, + 6, + 1, + 0, + 0, + 0 + ], + [ + 71, + 6, + 71, + 12, + 0, + 0, + 0, + 3 + ], + [ + 71, + 12, + 75, + 6, + 0, + 0, + 0, + 0 + ], + [ + 71, + 16, + 71, + 44, + 0, + 0, + 0, + 0 + ], + [ + 71, + 45, + 71, + 46, + 0, + 0, + 0, + 3 + ], + [ + 71, + 46, + 73, + 6, + 0, + 0, + 0, + 0 + ], + [ + 73, + 6, + 73, + 12, + 0, + 0, + 0, + 3 + ], + [ + 73, + 12, + 75, + 6, + 0, + 0, + 0, + 0 + ] + ] +}] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.json new file mode 100644 index 00000000000..6d0685b1717 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.json @@ -0,0 +1,611 @@ +{ + "branches": [ + [ + 39, + 7, + 39, + 15, + 1, + 0, + 0, + 0, + 4 + ], + [ + 39, + 19, + 39, + 34, + 1, + 0, + 0, + 0, + 4 + ], + [ + 52, + 7, + 52, + 34, + 1, + 0, + 0, + 0, + 4 + ], + [ + 56, + 7, + 56, + 32, + 1, + 0, + 0, + 0, + 4 + ], + [ + 60, + 7, + 60, + 31, + 0, + 1, + 0, + 0, + 4 + ], + [ + 64, + 7, + 64, + 33, + 1, + 0, + 0, + 0, + 4 + ], + [ + 65, + 9, + 65, + 36, + 0, + 1, + 0, + 0, + 4 + ], + [ + 67, + 16, + 67, + 46, + 0, + 1, + 0, + 0, + 4 + ], + [ + 69, + 16, + 69, + 44, + 1, + 0, + 0, + 0, + 4 + ], + [ + 71, + 16, + 71, + 44, + 0, + 0, + 0, + 0, + 4 + ] + ], + "expansions": [], + "filename": "private/react-native-fantom/tester/src/AppSettings.cpp", + "segments": [ + [ + 38, + 47, + 1, + true, + true, + false + ], + [ + 39, + 7, + 1, + true, + true, + false + ], + [ + 39, + 15, + 1, + true, + false, + false + ], + [ + 39, + 19, + 1, + true, + true, + false + ], + [ + 39, + 34, + 1, + true, + false, + false + ], + [ + 39, + 36, + 1, + true, + true, + false + ], + [ + 40, + 1, + 0, + false, + true, + false + ], + [ + 41, + 28, + 1, + true, + false, + false + ], + [ + 46, + 2, + 0, + false, + false, + false + ], + [ + 48, + 34, + 1, + true, + true, + false + ], + [ + 51, + 1, + 0, + false, + true, + false + ], + [ + 51, + 1, + 1, + true, + false, + false + ], + [ + 52, + 7, + 1, + true, + true, + false + ], + [ + 52, + 34, + 1, + true, + false, + false + ], + [ + 52, + 36, + 1, + true, + true, + false + ], + [ + 54, + 4, + 1, + true, + false, + false + ], + [ + 55, + 1, + 0, + false, + true, + false + ], + [ + 55, + 1, + 1, + true, + false, + false + ], + [ + 56, + 7, + 1, + true, + true, + false + ], + [ + 56, + 32, + 1, + true, + false, + false + ], + [ + 56, + 34, + 1, + true, + true, + false + ], + [ + 58, + 4, + 1, + true, + false, + false + ], + [ + 59, + 1, + 0, + false, + true, + false + ], + [ + 59, + 1, + 1, + true, + false, + false + ], + [ + 60, + 7, + 1, + true, + true, + false + ], + [ + 60, + 31, + 1, + true, + false, + false + ], + [ + 60, + 32, + 0, + true, + false, + true + ], + [ + 60, + 33, + 0, + true, + true, + false + ], + [ + 62, + 4, + 1, + true, + false, + false + ], + [ + 63, + 1, + 0, + false, + true, + false + ], + [ + 63, + 1, + 1, + true, + false, + false + ], + [ + 64, + 7, + 1, + true, + true, + false + ], + [ + 64, + 33, + 1, + true, + false, + false + ], + [ + 64, + 35, + 1, + true, + true, + false + ], + [ + 65, + 9, + 1, + true, + true, + false + ], + [ + 65, + 36, + 1, + true, + false, + false + ], + [ + 65, + 37, + 0, + true, + false, + true + ], + [ + 65, + 38, + 0, + true, + true, + false + ], + [ + 67, + 6, + 1, + true, + false, + true + ], + [ + 67, + 12, + 1, + true, + true, + false + ], + [ + 67, + 16, + 1, + true, + true, + false + ], + [ + 67, + 46, + 1, + true, + false, + false + ], + [ + 67, + 47, + 0, + true, + false, + true + ], + [ + 67, + 48, + 0, + true, + true, + false + ], + [ + 69, + 6, + 1, + true, + false, + true + ], + [ + 69, + 12, + 1, + true, + true, + false + ], + [ + 69, + 16, + 1, + true, + true, + false + ], + [ + 69, + 44, + 1, + true, + false, + false + ], + [ + 69, + 46, + 1, + true, + true, + false + ], + [ + 71, + 6, + 0, + true, + false, + true + ], + [ + 71, + 12, + 0, + true, + true, + false + ], + [ + 71, + 16, + 0, + true, + true, + false + ], + [ + 71, + 44, + 0, + true, + false, + false + ], + [ + 71, + 46, + 0, + true, + true, + false + ], + [ + 73, + 6, + 0, + true, + false, + true + ], + [ + 73, + 12, + 0, + true, + true, + false + ], + [ + 75, + 6, + 1, + true, + false, + false + ], + [ + 77, + 2, + 0, + false, + false, + false + ] + ], + "summary": { + "branches": { + "count": 20, + "covered": 9, + "notcovered": 11, + "percent": 45 + }, + "functions": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "instantiations": { + "count": 2, + "covered": 2, + "percent": 100 + }, + "lines": { + "count": 33, + "covered": 25, + "percent": 75.757575757575751 + }, + "regions": { + "count": 26, + "covered": 19, + "notcovered": 7, + "percent": 73.076923076923066 + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.lcov.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.lcov.json new file mode 100644 index 00000000000..b956264280a --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.lcov.json @@ -0,0 +1,67 @@ +[ + "SF:private/react-native-fantom/tester/src/AppSettings.cpp", + "FN:38,_ZN8facebook5react11AppSettings4initEiPPc", + "FN:48,_ZN8facebook5react11AppSettings12initInternalEv", + "FNDA:1,_ZN8facebook5react11AppSettings4initEiPPc", + "FNDA:1,_ZN8facebook5react11AppSettings12initInternalEv", + "FNF:2", + "FNH:2", + "DA:38,1", + "DA:39,1", + "DA:42,1", + "DA:43,1", + "DA:44,1", + "DA:45,1", + "DA:46,1", + "DA:48,1", + "DA:49,1", + "DA:50,1", + "DA:52,1", + "DA:53,1", + "DA:54,1", + "DA:56,1", + "DA:57,1", + "DA:58,1", + "DA:60,1", + "DA:61,0", + "DA:62,0", + "DA:64,1", + "DA:65,1", + "DA:66,0", + "DA:67,1", + "DA:68,0", + "DA:69,1", + "DA:70,1", + "DA:71,1", + "DA:72,0", + "DA:73,0", + "DA:74,0", + "DA:75,0", + "DA:76,1", + "DA:77,1", + "BRDA:39,0,0,1", + "BRDA:39,0,1,0", + "BRDA:39,1,2,1", + "BRDA:39,1,3,0", + "BRDA:52,0,0,1", + "BRDA:52,0,1,0", + "BRDA:56,0,0,1", + "BRDA:56,0,1,0", + "BRDA:60,0,0,0", + "BRDA:60,0,1,1", + "BRDA:64,0,0,1", + "BRDA:64,0,1,0", + "BRDA:65,0,0,0", + "BRDA:65,0,1,1", + "BRDA:67,0,0,0", + "BRDA:67,0,1,1", + "BRDA:69,0,0,1", + "BRDA:69,0,1,0", + "BRDA:71,0,0,-", + "BRDA:71,0,1,-", + "BRF:20", + "BRH:9", + "LF:33", + "LH:25", + "end_of_record" +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.source b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.source new file mode 100644 index 00000000000..58c19298a05 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/AppSettings.cpp.source @@ -0,0 +1,79 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "AppSettings.h" +#include +#include +#include + +static constexpr int DEFAULT_WINDOW_WIDTH = 1280; +static constexpr int DEFAULT_WINDOW_HEIGHT = 720; + +DEFINE_uint32(windowWidth, DEFAULT_WINDOW_WIDTH, "Application window width"); +DEFINE_uint32(windowHeight, DEFAULT_WINDOW_HEIGHT, "Application window height"); +DEFINE_string(bundlePath, "", "Default path to the application's bundle"); +DEFINE_uint32(inspectorPort, 0, "React Native inspector port"); +DEFINE_string( + featureFlags, + "", + "JSON representation of the common feature flags to set for the app"); +DEFINE_string( + minLogLevel, + "", + "Minimum log level to be used by the app. One of: [info, warning, error, fatal]"); + +namespace facebook::react { + +unsigned int AppSettings::windowWidth{DEFAULT_WINDOW_WIDTH}; +unsigned int AppSettings::windowHeight{DEFAULT_WINDOW_HEIGHT}; +std::string AppSettings::defaultBundlePath{}; +std::optional AppSettings::inspectorPort{}; +std::optional AppSettings::dynamicFeatureFlags; +int AppSettings::minLogLevel{google::GLOG_INFO}; + +void AppSettings::init(int argc, char** argv) { + if (argc > 0 && argv != nullptr) { + // Don't exit app on unknown flags, as some of those may be provided when + // debugging via XCode: + gflags::AllowCommandLineReparsing(); + gflags::ParseCommandLineFlags(&argc, &argv, false); + } + initInternal(); +} + +void AppSettings::initInternal() { + windowWidth = FLAGS_windowWidth; + windowHeight = FLAGS_windowHeight; + + if (!FLAGS_featureFlags.empty()) { + dynamicFeatureFlags = folly::parseJson(FLAGS_featureFlags); + } + + if (!FLAGS_bundlePath.empty()) { + defaultBundlePath = FLAGS_bundlePath; + } + + if (FLAGS_inspectorPort != 0) { + inspectorPort = FLAGS_inspectorPort; + } + + if (!FLAGS_minLogLevel.empty()) { + if (FLAGS_minLogLevel == "info") { + minLogLevel = google::GLOG_INFO; + } else if (FLAGS_minLogLevel == "warning") { + minLogLevel = google::GLOG_WARNING; + } else if (FLAGS_minLogLevel == "error") { + minLogLevel = google::GLOG_ERROR; + } else if (FLAGS_minLogLevel == "fatal") { + minLogLevel = google::GLOG_FATAL; + } else { + LOG(ERROR) << "Invalid min log level: " << FLAGS_minLogLevel; + } + } +} + +} // namespace facebook::react diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.functions.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.functions.json new file mode 100644 index 00000000000..071c17647fd --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.functions.json @@ -0,0 +1,33560 @@ +[{ + "branches": [], + "count": 30, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_12NativeFantomEiJdddddEJdddSt8optionalIdES5_EEET_RNS_3jsi7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 30, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 30, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 30, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 30, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 30, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 30, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 30, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 30, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 30, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 30, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 30, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 30, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESG_INS0_8RawEvent8CategoryEESG_IbEEJNS_3jsi5ValueENSQ_6StringESG_ISR_ESG_IdESP_EEET_RNSQ_7RuntimeEMT0_FT1_SX_DpT2_ERKS4_INS0_11CallInvokerEEPSY_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEEJNS_3jsi5ValueENSC_6ObjectEEEET_RNSC_7RuntimeEMT0_FT1_SH_DpT2_ERKS4_INS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEEddEJNS_3jsi5ValueEddEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_12NativeFantomESt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EEJiEJdEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_12NativeFantomES4_JRKSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS6_INS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 63, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 63, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 63, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 63, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 63, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 63, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 63, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 63, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 27, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_12NativeFantomENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJiNS0_31NativeFantomRenderFormatOptionsIbbEEEJdNS3_6ObjectEEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 27, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 27, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 27, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 27, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 27, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 27, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 27, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 27, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 27, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 27, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 27, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 27, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 1, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 1, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 1, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 1, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 1, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 1, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 1, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 1, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi8FunctionENS0_12NativeFantomES4_JSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKS6_INS0_11CallInvokerEEPSE_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt8optionalINS0_16HighResTimeStampEEEJS4_IdEEEET_RNS_3jsi7RuntimeEMT0_FT1_SB_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSC_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalIS9_ESE_EEEJNS_3jsi6StringENSI_6ObjectEEEET_RNSI_7RuntimeEMT0_FT1_SN_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSO_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEiJRNS_3jsi7RuntimeEdddddEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESJ_INS0_8RawEvent8CategoryEESJ_IbEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEddEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomESt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EEJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENS_3jsi6ObjectEJRNS4_7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEiNS0_31NativeFantomRenderFormatOptionsIbbEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENS_3jsi8FunctionEJRNS4_7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt8optionalINS0_16HighResTimeStampEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalISC_ESH_EEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17ImageLoaderModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_17ImageLoaderModuleES4_JEJEEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS3_6StringEEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS3_6ObjectEEJNS3_6StringESI_EEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJbEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJNS3_6StringEdEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS3_6ObjectEJRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISD_EEEJNS3_5ArrayEEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS_3jsi6ObjectEJRNS4_7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS8_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJbEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS_3jsi6ObjectEJRNS4_7RuntimeERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISE_EEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_14AppStateModuleENS0_31NativeAppStateAppStateConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJRKNS0_13AsyncCallbackIJNS0_22NativeAppStateAppStateINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEENS_3jsi8FunctionEEJSH_SH_EEET_RNSG_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 1, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_16DeviceInfoModuleENS0_35NativeDeviceInfoDeviceInfoConstantsINS0_33NativeDeviceInfoDimensionsPayloadISt8optionalINS0_30NativeDeviceInfoDisplayMetricsIddddEEESB_S8_INS0_37NativeDeviceInfoDisplayMetricsAndroidIdddddEEESE_EES8_IbESG_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 1, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 1, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 1, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 1, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 1, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 1, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 1, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 1, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 1, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 1, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 1, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 1, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJbEJbEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_23PlatformConstantsModuleENS0_54NativePlatformConstantsAndroidPlatformConstantsAndroidIbSt8optionalIbENS0_55NativePlatformConstantsAndroidReactNativeVersionAndroidIiiiS7_IiEEEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESH_SH_SH_S7_ISH_ESH_SH_SH_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_23PlatformConstantsModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_16SourceCodeModuleENS0_35NativeSourceCodeSourceCodeConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorINS0_33NativeExceptionsManagerStackFrameISt8optionalIiESC_IS9_ESD_S9_SC_IbEEESaISG_EEiEJNS_3jsi6StringENSJ_5ArrayEdEEET_RNSJ_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJRKNS0_36NativeExceptionsManagerExceptionDataINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_ESC_SC_St6vectorINS0_33NativeExceptionsManagerStackFrameISB_IiESC_SF_SA_SB_IbEEESaISH_EEibSB_ISt13unordered_mapISA_SA_St4hashISA_ESt8equal_toISA_ESaISt4pairIKSA_SA_EEEEEEEJNS_3jsi6ObjectEEEET_RNSY_7RuntimeEMT0_FT1_S12_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS13_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleENS0_31NativeAppStateAppStateConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJNS0_22NativeAppStateAppStateINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16DeviceInfoModuleENS0_35NativeDeviceInfoDeviceInfoConstantsINS0_33NativeDeviceInfoDimensionsPayloadISt8optionalINS0_30NativeDeviceInfoDisplayMetricsIddddEEES9_S6_INS0_37NativeDeviceInfoDisplayMetricsAndroidIdddddEEESC_EES6_IbESE_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_23PlatformConstantsModuleENS0_54NativePlatformConstantsAndroidPlatformConstantsAndroidIbSt8optionalIbENS0_55NativePlatformConstantsAndroidReactNativeVersionAndroidIiiiS5_IiEEEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESF_SF_SF_S5_ISF_ESF_SF_SF_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_23PlatformConstantsModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16SourceCodeModuleENS0_35NativeSourceCodeSourceCodeConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorINS0_33NativeExceptionsManagerStackFrameISt8optionalIiESF_ISC_ESG_SC_SF_IbEEESaISJ_EEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeERKNS0_36NativeExceptionsManagerExceptionDataINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISD_ESF_SF_St6vectorINS0_33NativeExceptionsManagerStackFrameISE_IiESF_SI_SD_SE_IbEEESaISK_EEibSE_ISt13unordered_mapISD_SD_St4hashISD_ESt8equal_toISD_ESaISt4pairIKSD_SD_EEEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalISt6vectorIS9_SaIS9_EEENS_3jsi6ObjectEiEJNSJ_6StringESC_INSJ_5ArrayEESK_dEEET_RNSJ_7RuntimeEMT0_FT1_SQ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSR_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJNS_3jsi6StringEdEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJdNS_3jsi6StringEdEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalISt6vectorISC_SaISC_EEENS4_6ObjectEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_jRKSt6vectorISt4pairIS9_S9_ESaISE_EERKNS0_4http4BodyESB_bjbEJNS_3jsi6StringESO_dNSN_5ArrayENSN_6ObjectESO_bdbEEET_RNSN_7RuntimeEMT0_FT1_ST_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSU_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJjEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNS0_13AsyncCallbackIJbEEEEJNS_3jsi8FunctionEEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESE_jRKSt6vectorISt4pairISC_SC_ESaISH_EERKNS0_4http4BodyESE_bjbEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeEjEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJbEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_20DevLoadingViewModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESD_SC_IbEEJNS_3jsi6StringESC_IdESH_SE_EEET_RNSF_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_20DevLoadingViewModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_20DevLoadingViewModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESG_SF_IbEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_20DevLoadingViewModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_12LogBoxModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_12LogBoxModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_9NativeDOMEdJNS_3jsi5ValueES5_EJS5_S5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt6vectorINS3_5ValueESaIS7_EEJS7_EJS7_EEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJS4_NS3_6StringEEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JS4_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIbNS0_9NativeDOMEbJNS_3jsi5ValueEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJiiiiEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 4, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJddddEEJSt10shared_ptrIKNS0_10ShadowNodeEEbEJNS3_5ValueEbEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 4, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 4, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 4, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 4, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 4, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 4, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 4, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 4, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 4, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 4, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 4, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 4, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJiiEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJddEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 1, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_9NativeDOMENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSC_INS0_11CallInvokerEEPSK_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 1, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 1, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 1, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 1, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 1, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 1, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 1, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 1, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 1, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 1, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 1, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 1, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIbNS0_9NativeDOMEbJSt10shared_ptrIKNS0_10ShadowNodeEEdEJNS_3jsi5ValueEdEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEEdEJNS_3jsi5ValueEdEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJNS3_5ValueEddEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJS7_EEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS9_INS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 30, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JiS4_EJdS4_EEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 30, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 30, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 30, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 30, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 30, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 30, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 30, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 30, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 30, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 30, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 30, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 30, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddddEEEEJNS_3jsi5ValueENSD_8FunctionEEEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddEEEEJNS_3jsi5ValueENSD_8FunctionEEEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEES7_NS_3jsi8FunctionERKNS0_12SyncCallbackIFvddddEEEEJNS8_5ValueESF_S9_S9_EEET_RNS8_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEENS_3jsi5ValueEEJS9_S9_EEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEdJRNS_3jsi7RuntimeENS4_5ValueES7_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt6vectorINS_3jsi5ValueESaIS6_EEJRNS5_7RuntimeES6_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeES5_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEbJRNS_3jsi7RuntimeENS4_5ValueEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJiiiiEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJddddEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEbEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJiiEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJddEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEbJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJNS_3jsi5ValueEddEEJRNS5_7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeEiS5_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddddEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEESA_NS4_8FunctionERKNS0_12SyncCallbackIFvddddEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS4_5ValueEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 2, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIbNS0_29NativeReactNativeFeatureFlagsEbJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 2, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 2, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 2, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 2, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 2, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 2, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 2, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 2, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 2, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 2, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 2, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 2, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_29NativeReactNativeFeatureFlagsEdJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_29NativeReactNativeFeatureFlagsEbJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_29NativeReactNativeFeatureFlagsEdJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_19NativeIdleCallbacksENS3_6ObjectEJONS0_12SyncCallbackIFvS6_EEESt8optionalINS0_45NativeIdleCallbacksRequestIdleCallbackOptionsISB_INS0_15HighResDurationEEEEEEJNS3_8FunctionESB_IS6_EEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_19NativeIdleCallbacksEvJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_19NativeIdleCallbacksENS_3jsi6ObjectEJRNS4_7RuntimeEONS0_12SyncCallbackIFvS5_EEESt8optionalINS0_45NativeIdleCallbacksRequestIdleCallbackOptionsISC_INS0_15HighResDurationEEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_19NativeIdleCallbacksEvJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_26NativeIntersectionObserverENS3_6ObjectEJNS0_66NativeIntersectionObserverNativeIntersectionObserverObserveOptionsIiSt8optionalISt10shared_ptrIKNS0_10ShadowNodeEEESC_St6vectorIfSaIfEES8_ISG_ES8_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJS6_EEET_RNS3_7RuntimeEMT0_FT1_SS_DpT2_ERKS9_INS0_11CallInvokerEEPST_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJiNS_3jsi6ObjectEEJdNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJNS0_13AsyncCallbackIJEEEEJNS_3jsi8FunctionEEEET_RNS6_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_26NativeIntersectionObserverESt6vectorINS0_57NativeIntersectionObserverNativeIntersectionObserverEntryIiNS3_5ValueESt5tupleIJffffEESA_SA_bNS0_16HighResTimeStampEEESaISC_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverENS_3jsi6ObjectEJRNS4_7RuntimeENS0_66NativeIntersectionObserverNativeIntersectionObserverObserveOptionsIiSt8optionalISt10shared_ptrIKNS0_10ShadowNodeEEESD_St6vectorIfSaIfEES9_ISH_ES9_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeEiNS4_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeENS0_13AsyncCallbackIJEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverESt6vectorINS0_57NativeIntersectionObserverNativeIntersectionObserverEntryIiNS_3jsi5ValueESt5tupleIJffffEES9_S9_bNS0_16HighResTimeStampEEESaISB_EEJRNS6_7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 126, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_16NativeMicrotasksEvJNS_3jsi8FunctionEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 126, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 126, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 126, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 126, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 126, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 126, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 126, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_16NativeMicrotasksEvJRNS_3jsi7RuntimeENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJRKNS0_58NativeMutationObserverNativeMutationObserverObserveOptionsIiSt10shared_ptrIKNS0_10ShadowNodeEEbEEEJNS_3jsi6ObjectEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKS5_INS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJNS_3jsi8FunctionENS0_12SyncCallbackIFNS4_5ValueES7_EEEEJS5_S5_EEET_RNS4_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeMutationObserverESt6vectorINS0_42NativeMutationObserverNativeMutationRecordIiNS3_5ValueES6_IS8_SaIS8_EESA_EESaISB_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeERKNS0_58NativeMutationObserverNativeMutationObserverObserveOptionsIiSt10shared_ptrIKNS0_10ShadowNodeEEbEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeENS4_8FunctionENS0_12SyncCallbackIFNS4_5ValueES9_EEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverESt6vectorINS0_42NativeMutationObserverNativeMutationRecordIiNS_3jsi5ValueES4_IS7_SaIS7_EES9_EESaISA_EEJRNS6_7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 65, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceENS0_16HighResTimeStampEJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 65, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 65, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 65, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 65, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 65, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 65, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 65, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 65, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 65, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 65, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 65, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 65, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceENS0_15HighResDurationEJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS_3jsi5ValueEEJNSD_6StringEdSE_EEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS0_15HighResDurationENS_3jsi5ValueEEJNSE_6StringEddSF_EEET_RNSE_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsISt8optionalIdENS0_17NativePerformanceES4_JRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSE_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 37, + 82, + 0, + 0, + 0, + 0 + ], + [ + 37, + 82, + 41, + 10, + 0, + 0, + 0, + 3 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 41, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ], + [ + 41, + 24, + 41, + 52, + 0, + 0, + 0, + 0 + ], + [ + 41, + 53, + 41, + 54, + 0, + 0, + 0, + 3 + ], + [ + 41, + 54, + 41, + 55, + 0, + 0, + 0, + 0 + ], + [ + 41, + 55, + 57, + 10, + 0, + 0, + 0, + 3 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ], + [ + 57, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJS4_INS_3jsi6StringEEEEET_RNSC_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalINS0_20PerformanceEntryTypeEEEJNS3_6StringESI_IdEEEET_RNS3_7RuntimeEMT0_FT1_SP_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSQ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJNS0_20PerformanceEntryTypeEEJdEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSE_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjESaISE_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_17NativePerformanceESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdSt4hashISC_ESt8equal_toISC_ESaISt4pairIKSC_dEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17NativePerformanceENS3_6ObjectEJNS0_13AsyncCallbackIJEEEEJNS3_8FunctionEEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceEdJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJNS_3jsi6ObjectENS0_40NativePerformancePerformanceObserverInitISt8optionalISt6vectorIiSaIiEEES7_IiES7_IbES7_INS0_15HighResDurationEEEEEJNS4_5ValueES5_EEET_RNS4_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJNS3_6ObjectEbEJNS3_5ValueEbEEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_20PerformanceEntryTypeESaIS7_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS0_16HighResTimeStampEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS0_15HighResDurationEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS4_5ValueEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS0_15HighResDurationENS4_5ValueEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt8optionalIdEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeESt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalINS0_20PerformanceEntryTypeEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeENS0_20PerformanceEntryTypeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjESaISC_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdSt4hashISA_ESt8equal_toISA_ESaISt4pairIKSA_dEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS_3jsi6ObjectEJRNS4_7RuntimeENS0_13AsyncCallbackIJEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEdJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeENS4_6ObjectENS0_40NativePerformancePerformanceObserverInitISt8optionalISt6vectorIiSaIiEEES9_IiES9_IbES9_INS0_15HighResDurationEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeENS8_6ObjectEbEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_20PerformanceEntryTypeESaIS5_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNS_3jsi6ObjectEEJdS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNS0_13AsyncCallbackIJdEEEEJdNS_3jsi8FunctionEEEET_RNS6_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiiEJddEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiiNS_3jsi6ObjectENS0_13AsyncCallbackIJNS0_34NativeAnimatedTurboModuleEndResultIbSt8optionalIdES9_EEEEEEJddS5_NS4_8FunctionEEEET_RNS4_7RuntimeEMT0_FT1_SF_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJidEJddEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_3jsi6ObjectEEJdNSA_6StringESB_EEET_RNSA_7RuntimeEMT0_FT1_SF_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSG_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJdNS_3jsi6StringEdEEET_RNSA_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJNS_3jsi5ArrayEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNS4_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNS0_13AsyncCallbackIJdEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiiNS4_6ObjectENS0_13AsyncCallbackIJNS0_34NativeAnimatedTurboModuleEndResultIbSt8optionalIdESB_EEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEidEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeENS4_5ArrayEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_13NativeCPUTimeEdJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIbNS0_13NativeCPUTimeEbJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_13NativeCPUTimeEdJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_13NativeCPUTimeEbJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_31NativeFantomTestSpecificMethodsEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_31NativeFantomTestSpecificMethodsEvJNS_3jsi8FunctionEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_31NativeFantomTestSpecificMethodsEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_31NativeFantomTestSpecificMethodsEvJRNS_3jsi7RuntimeENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeCxxModuleExampleESt6vectorISt8optionalINS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_ISE_EEEESaISH_EEJSJ_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIbNS0_22NativeCxxModuleExampleEbJbEJbEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_37NativeCxxModuleExampleConstantsStructIbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_13CustomEnumIntEJS6_EJdEEET_RNS3_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKS6_INS0_11CallInvokerEEPSE_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEEJNS3_6ObjectEEEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSC_INS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_36NativeCxxModuleExampleBinaryTreeNodeIiEEJS7_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_31NativeCxxModuleExampleGraphNodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJSD_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumIntEJS6_EJdEEET_RNS3_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumStrEJNS0_30NativeCxxModuleExampleEnumNoneEEJS4_EEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleESt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESt4lessISC_ESaISt4pairIKSC_SE_EEEJSL_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIdNS0_22NativeCxxModuleExampleEdJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISC_EEEJSF_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeCxxModuleExampleESt3setIfSt4lessIfESaIfEEJSA_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSE_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSB_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJfRKSB_NS3_6ObjectEEJdS4_SE_EEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_33NativeCxxModuleExampleValueStructIdNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_34NativeCxxModuleExampleObjectStructIiSC_St8optionalISC_EEEEEJdSC_SG_EJdNS3_6StringES4_EEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJRKNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJNS_3jsi8FunctionEEEET_RNSE_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi8FunctionENS0_22NativeCxxModuleExampleESt8functionIFvvEEJNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJS4_EEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEJbEJbEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsISt8optionalIbENS0_22NativeCxxModuleExampleES4_JS4_EJS4_EEET_RNS_3jsi7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 37, + 82, + 0, + 0, + 0, + 0 + ], + [ + 37, + 82, + 41, + 10, + 0, + 0, + 0, + 3 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 41, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ], + [ + 41, + 24, + 41, + 52, + 0, + 0, + 0, + 0 + ], + [ + 41, + 53, + 41, + 54, + 0, + 0, + 0, + 3 + ], + [ + 41, + 54, + 41, + 55, + 0, + 0, + 0, + 0 + ], + [ + 41, + 55, + 57, + 10, + 0, + 0, + 0, + 3 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ], + [ + 57, + 10, + 60, + 4, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJNS0_30NativeCxxModuleExampleMenuItemINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_13AsyncCallbackIJSA_bEEESt8optionalISA_EEEEJNS_3jsi6ObjectEEEET_RNSG_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 26, + 4, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 31, + 4, + 0, + 0, + 0, + 0 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISC_EEEJRKSF_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "regions": [ + [ + 21, + 1, + 61, + 2, + 0, + 0, + 0, + 0 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0 + ], + [ + 24, + 43, + 24, + 44, + 0, + 0, + 0, + 3 + ], + [ + 24, + 44, + 24, + 45, + 0, + 0, + 0, + 0 + ], + [ + 27, + 1, + 27, + 1, + 0, + 0, + 0, + 2 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0 + ], + [ + 28, + 43, + 28, + 44, + 0, + 0, + 0, + 3 + ], + [ + 28, + 44, + 28, + 45, + 0, + 0, + 0, + 0 + ], + [ + 28, + 45, + 31, + 10, + 0, + 0, + 0, + 3 + ], + [ + 30, + 1, + 30, + 1, + 0, + 0, + 0, + 2 + ], + [ + 31, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0 + ], + [ + 31, + 48, + 31, + 49, + 0, + 0, + 0, + 3 + ], + [ + 31, + 49, + 31, + 50, + 0, + 0, + 0, + 0 + ], + [ + 31, + 50, + 37, + 10, + 0, + 0, + 0, + 3 + ], + [ + 33, + 1, + 33, + 1, + 0, + 0, + 0, + 2 + ], + [ + 36, + 1, + 36, + 1, + 0, + 0, + 0, + 2 + ], + [ + 37, + 10, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0 + ], + [ + 37, + 80, + 37, + 81, + 0, + 0, + 0, + 3 + ], + [ + 37, + 81, + 41, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 1, + 39, + 1, + 0, + 0, + 0, + 2 + ], + [ + 46, + 1, + 46, + 1, + 0, + 0, + 0, + 2 + ], + [ + 49, + 1, + 49, + 1, + 0, + 0, + 0, + 2 + ], + [ + 55, + 1, + 55, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt6vectorISt8optionalINS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_ISC_EEEESaISF_EEJRNS_3jsi7RuntimeESH_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEbJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_37NativeCxxModuleExampleConstantsStructIbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_13CustomEnumIntEJRNS_3jsi7RuntimeES4_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_36NativeCxxModuleExampleBinaryTreeNodeIiEEJRNS_3jsi7RuntimeES5_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_31NativeCxxModuleExampleGraphNodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeESB_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumIntEJRNS_3jsi7RuntimeES4_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumStrEJRNS_3jsi7RuntimeENS0_30NativeCxxModuleExampleEnumNoneEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESt4lessISA_ESaISt4pairIKSA_SC_EEEJRNS_3jsi7RuntimeESJ_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEdJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_EEEJRNS_3jsi7RuntimeESD_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt3setIfSt4lessIfESaIfEEJRNS_3jsi7RuntimeES8_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeES9_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEfRKS9_NSA_6ObjectEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_33NativeCxxModuleExampleValueStructIdNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_34NativeCxxModuleExampleObjectStructIiSA_St8optionalISA_EEEEEJRNS_3jsi7RuntimeEdSA_SE_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt8functionIFvvEEJRNS_3jsi7RuntimeENS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt8optionalIbEJRNS_3jsi7RuntimeES5_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeENS0_30NativeCxxModuleExampleMenuItemINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_13AsyncCallbackIJSD_bEEESt8optionalISD_EEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/bridging/Class.h" + ], + "name": "_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_EEEJRNS_3jsi7RuntimeERKSD_EEEmMT_FT0_DpT1_E", + "regions": [ + [ + 71, + 1, + 73, + 2, + 0, + 0, + 0, + 0 + ] + ] +}] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.json new file mode 100644 index 00000000000..6cbd902856f --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.json @@ -0,0 +1,6605 @@ +{ + "branches": [ + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 41, + 24, + 41, + 52, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 41, + 24, + 41, + 52, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 24, + 17, + 24, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 28, + 17, + 28, + 42, + 0, + 0, + 0, + 0, + 4 + ], + [ + 31, + 24, + 31, + 47, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 43, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 24, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ], + [ + 37, + 47, + 37, + 79, + 0, + 0, + 0, + 0, + 4 + ] + ], + "expansions": [], + "filename": "packages/react-native/ReactCommon/react/bridging/Class.h", + "segments": [ + [ + 21, + 1, + 350, + true, + true, + false + ], + [ + 24, + 17, + 350, + true, + true, + false + ], + [ + 24, + 42, + 350, + true, + false, + false + ], + [ + 24, + 43, + 190, + true, + false, + true + ], + [ + 24, + 44, + 0, + true, + true, + false + ], + [ + 24, + 45, + 190, + true, + false, + false + ], + [ + 26, + 4, + 350, + true, + false, + false + ], + [ + 27, + 1, + 0, + false, + true, + false + ], + [ + 27, + 1, + 350, + true, + false, + false + ], + [ + 28, + 17, + 350, + true, + true, + false + ], + [ + 28, + 42, + 350, + true, + false, + false + ], + [ + 28, + 43, + 190, + true, + false, + true + ], + [ + 28, + 44, + 0, + true, + true, + false + ], + [ + 28, + 45, + 160, + true, + false, + true + ], + [ + 30, + 1, + 0, + false, + true, + false + ], + [ + 30, + 1, + 160, + true, + false, + true + ], + [ + 31, + 10, + 160, + true, + true, + false + ], + [ + 31, + 24, + 160, + true, + true, + false + ], + [ + 31, + 47, + 160, + true, + false, + false + ], + [ + 31, + 48, + 0, + true, + false, + true + ], + [ + 31, + 49, + 0, + true, + true, + false + ], + [ + 31, + 50, + 160, + true, + false, + true + ], + [ + 33, + 1, + 0, + false, + true, + false + ], + [ + 33, + 1, + 160, + true, + false, + true + ], + [ + 36, + 1, + 0, + false, + true, + false + ], + [ + 36, + 1, + 160, + true, + false, + true + ], + [ + 37, + 10, + 160, + true, + true, + false + ], + [ + 37, + 24, + 160, + true, + true, + false + ], + [ + 37, + 43, + 160, + true, + false, + false + ], + [ + 37, + 47, + 0, + true, + true, + false + ], + [ + 37, + 79, + 160, + true, + false, + false + ], + [ + 37, + 81, + 0, + true, + true, + false + ], + [ + 37, + 82, + 0, + true, + false, + true + ], + [ + 39, + 1, + 0, + false, + true, + false + ], + [ + 39, + 1, + 0, + true, + false, + true + ], + [ + 41, + 10, + 0, + true, + true, + false + ], + [ + 41, + 24, + 0, + true, + true, + false + ], + [ + 41, + 52, + 0, + true, + false, + false + ], + [ + 41, + 54, + 0, + true, + true, + false + ], + [ + 41, + 55, + 0, + true, + false, + true + ], + [ + 46, + 1, + 0, + false, + true, + false + ], + [ + 46, + 1, + 0, + true, + false, + true + ], + [ + 49, + 1, + 0, + false, + true, + false + ], + [ + 49, + 1, + 0, + true, + false, + true + ], + [ + 55, + 1, + 0, + false, + true, + false + ], + [ + 55, + 1, + 0, + true, + false, + true + ], + [ + 57, + 10, + 0, + true, + true, + false + ], + [ + 60, + 4, + 350, + true, + false, + false + ], + [ + 61, + 2, + 0, + false, + false, + false + ], + [ + 71, + 1, + 0, + true, + true, + false + ], + [ + 73, + 2, + 0, + false, + false, + false + ] + ], + "summary": { + "branches": { + "count": 0, + "covered": 0, + "notcovered": 0, + "percent": 0 + }, + "functions": { + "count": 2, + "covered": 1, + "percent": 50 + }, + "instantiations": { + "count": 278, + "covered": 11, + "percent": 3.9568345323741005 + }, + "lines": { + "count": 36, + "covered": 33, + "percent": 91.666666666666657 + }, + "regions": { + "count": 18, + "covered": 9, + "notcovered": 9, + "percent": 50 + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.lcov.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.lcov.json new file mode 100644 index 00000000000..f08a20fde43 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.lcov.json @@ -0,0 +1,602 @@ +[ + "SF:packages/react-native/ReactCommon/react/bridging/Class.h", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_12NativeFantomEiJdddddEJdddSt8optionalIdES5_EEET_RNS_3jsi7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESG_INS0_8RawEvent8CategoryEESG_IbEEJNS_3jsi5ValueENSQ_6StringESG_ISR_ESG_IdESP_EEET_RNSQ_7RuntimeEMT0_FT1_SX_DpT2_ERKS4_INS0_11CallInvokerEEPSY_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEEJNS_3jsi5ValueENSC_6ObjectEEEET_RNSC_7RuntimeEMT0_FT1_SH_DpT2_ERKS4_INS0_11CallInvokerEEPSI_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEEddEJNS_3jsi5ValueEddEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_12NativeFantomESt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EEJiEJdEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_12NativeFantomES4_JRKSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS6_INS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_12NativeFantomENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJiNS0_31NativeFantomRenderFormatOptionsIbbEEEJdNS3_6ObjectEEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi8FunctionENS0_12NativeFantomES4_JSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKS6_INS0_11CallInvokerEEPSE_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt8optionalINS0_16HighResTimeStampEEEJS4_IdEEEET_RNS_3jsi7RuntimeEMT0_FT1_SB_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSC_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalIS9_ESE_EEEJNS_3jsi6StringENSI_6ObjectEEEET_RNSI_7RuntimeEMT0_FT1_SN_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSO_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEiJRNS_3jsi7RuntimeEdddddEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESJ_INS0_8RawEvent8CategoryEESJ_IbEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEddEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomESt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EEJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENS_3jsi6ObjectEJRNS4_7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEiNS0_31NativeFantomRenderFormatOptionsIbbEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENS_3jsi8FunctionEJRNS4_7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt8optionalINS0_16HighResTimeStampEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalISC_ESH_EEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17ImageLoaderModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_17ImageLoaderModuleES4_JEJEEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS3_6StringEEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS3_6ObjectEEJNS3_6StringESI_EEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJbEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJNS3_6StringEdEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS3_6ObjectEJRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISD_EEEJNS3_5ArrayEEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS_3jsi6ObjectEJRNS4_7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS8_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJbEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS_3jsi6ObjectEJRNS4_7RuntimeERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISE_EEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_14AppStateModuleENS0_31NativeAppStateAppStateConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJRKNS0_13AsyncCallbackIJNS0_22NativeAppStateAppStateINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEENS_3jsi8FunctionEEJSH_SH_EEET_RNSG_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_16DeviceInfoModuleENS0_35NativeDeviceInfoDeviceInfoConstantsINS0_33NativeDeviceInfoDimensionsPayloadISt8optionalINS0_30NativeDeviceInfoDisplayMetricsIddddEEESB_S8_INS0_37NativeDeviceInfoDisplayMetricsAndroidIdddddEEESE_EES8_IbESG_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJbEJbEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_23PlatformConstantsModuleENS0_54NativePlatformConstantsAndroidPlatformConstantsAndroidIbSt8optionalIbENS0_55NativePlatformConstantsAndroidReactNativeVersionAndroidIiiiS7_IiEEEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESH_SH_SH_S7_ISH_ESH_SH_SH_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_23PlatformConstantsModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_16SourceCodeModuleENS0_35NativeSourceCodeSourceCodeConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorINS0_33NativeExceptionsManagerStackFrameISt8optionalIiESC_IS9_ESD_S9_SC_IbEEESaISG_EEiEJNS_3jsi6StringENSJ_5ArrayEdEEET_RNSJ_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJRKNS0_36NativeExceptionsManagerExceptionDataINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_ESC_SC_St6vectorINS0_33NativeExceptionsManagerStackFrameISB_IiESC_SF_SA_SB_IbEEESaISH_EEibSB_ISt13unordered_mapISA_SA_St4hashISA_ESt8equal_toISA_ESaISt4pairIKSA_SA_EEEEEEEJNS_3jsi6ObjectEEEET_RNSY_7RuntimeEMT0_FT1_S12_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS13_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleENS0_31NativeAppStateAppStateConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJNS0_22NativeAppStateAppStateINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16DeviceInfoModuleENS0_35NativeDeviceInfoDeviceInfoConstantsINS0_33NativeDeviceInfoDimensionsPayloadISt8optionalINS0_30NativeDeviceInfoDisplayMetricsIddddEEES9_S6_INS0_37NativeDeviceInfoDisplayMetricsAndroidIdddddEEESC_EES6_IbESE_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_23PlatformConstantsModuleENS0_54NativePlatformConstantsAndroidPlatformConstantsAndroidIbSt8optionalIbENS0_55NativePlatformConstantsAndroidReactNativeVersionAndroidIiiiS5_IiEEEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESF_SF_SF_S5_ISF_ESF_SF_SF_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_23PlatformConstantsModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16SourceCodeModuleENS0_35NativeSourceCodeSourceCodeConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorINS0_33NativeExceptionsManagerStackFrameISt8optionalIiESF_ISC_ESG_SC_SF_IbEEESaISJ_EEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeERKNS0_36NativeExceptionsManagerExceptionDataINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISD_ESF_SF_St6vectorINS0_33NativeExceptionsManagerStackFrameISE_IiESF_SI_SD_SE_IbEEESaISK_EEibSE_ISt13unordered_mapISD_SD_St4hashISD_ESt8equal_toISD_ESaISt4pairIKSD_SD_EEEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalISt6vectorIS9_SaIS9_EEENS_3jsi6ObjectEiEJNSJ_6StringESC_INSJ_5ArrayEESK_dEEET_RNSJ_7RuntimeEMT0_FT1_SQ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSR_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJNS_3jsi6StringEdEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJdNS_3jsi6StringEdEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalISt6vectorISC_SaISC_EEENS4_6ObjectEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_jRKSt6vectorISt4pairIS9_S9_ESaISE_EERKNS0_4http4BodyESB_bjbEJNS_3jsi6StringESO_dNSN_5ArrayENSN_6ObjectESO_bdbEEET_RNSN_7RuntimeEMT0_FT1_ST_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSU_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJjEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNS0_13AsyncCallbackIJbEEEEJNS_3jsi8FunctionEEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESE_jRKSt6vectorISt4pairISC_SC_ESaISH_EERKNS0_4http4BodyESE_bjbEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeEjEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJbEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_20DevLoadingViewModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESD_SC_IbEEJNS_3jsi6StringESC_IdESH_SE_EEET_RNSF_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_20DevLoadingViewModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_20DevLoadingViewModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESG_SF_IbEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_20DevLoadingViewModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_12LogBoxModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_12LogBoxModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_9NativeDOMEdJNS_3jsi5ValueES5_EJS5_S5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt6vectorINS3_5ValueESaIS7_EEJS7_EJS7_EEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJS4_NS3_6StringEEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JS4_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIbNS0_9NativeDOMEbJNS_3jsi5ValueEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJiiiiEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJddddEEJSt10shared_ptrIKNS0_10ShadowNodeEEbEJNS3_5ValueEbEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJiiEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJddEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_9NativeDOMENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSC_INS0_11CallInvokerEEPSK_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIbNS0_9NativeDOMEbJSt10shared_ptrIKNS0_10ShadowNodeEEdEJNS_3jsi5ValueEdEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEEdEJNS_3jsi5ValueEdEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJNS3_5ValueEddEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJS7_EEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS9_INS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JiS4_EJdS4_EEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddddEEEEJNS_3jsi5ValueENSD_8FunctionEEEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddEEEEJNS_3jsi5ValueENSD_8FunctionEEEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEES7_NS_3jsi8FunctionERKNS0_12SyncCallbackIFvddddEEEEJNS8_5ValueESF_S9_S9_EEET_RNS8_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEENS_3jsi5ValueEEJS9_S9_EEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEdJRNS_3jsi7RuntimeENS4_5ValueES7_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt6vectorINS_3jsi5ValueESaIS6_EEJRNS5_7RuntimeES6_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeES5_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEbJRNS_3jsi7RuntimeENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJiiiiEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJddddEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEbEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJiiEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJddEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEbJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJNS_3jsi5ValueEddEEJRNS5_7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeEiS5_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddddEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEESA_NS4_8FunctionERKNS0_12SyncCallbackIFvddddEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIbNS0_29NativeReactNativeFeatureFlagsEbJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_29NativeReactNativeFeatureFlagsEdJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_29NativeReactNativeFeatureFlagsEbJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_29NativeReactNativeFeatureFlagsEdJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_19NativeIdleCallbacksENS3_6ObjectEJONS0_12SyncCallbackIFvS6_EEESt8optionalINS0_45NativeIdleCallbacksRequestIdleCallbackOptionsISB_INS0_15HighResDurationEEEEEEJNS3_8FunctionESB_IS6_EEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_19NativeIdleCallbacksEvJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_19NativeIdleCallbacksENS_3jsi6ObjectEJRNS4_7RuntimeEONS0_12SyncCallbackIFvS5_EEESt8optionalINS0_45NativeIdleCallbacksRequestIdleCallbackOptionsISC_INS0_15HighResDurationEEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_19NativeIdleCallbacksEvJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_26NativeIntersectionObserverENS3_6ObjectEJNS0_66NativeIntersectionObserverNativeIntersectionObserverObserveOptionsIiSt8optionalISt10shared_ptrIKNS0_10ShadowNodeEEESC_St6vectorIfSaIfEES8_ISG_ES8_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJS6_EEET_RNS3_7RuntimeEMT0_FT1_SS_DpT2_ERKS9_INS0_11CallInvokerEEPST_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJiNS_3jsi6ObjectEEJdNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJNS0_13AsyncCallbackIJEEEEJNS_3jsi8FunctionEEEET_RNS6_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_26NativeIntersectionObserverESt6vectorINS0_57NativeIntersectionObserverNativeIntersectionObserverEntryIiNS3_5ValueESt5tupleIJffffEESA_SA_bNS0_16HighResTimeStampEEESaISC_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverENS_3jsi6ObjectEJRNS4_7RuntimeENS0_66NativeIntersectionObserverNativeIntersectionObserverObserveOptionsIiSt8optionalISt10shared_ptrIKNS0_10ShadowNodeEEESD_St6vectorIfSaIfEES9_ISH_ES9_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeEiNS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeENS0_13AsyncCallbackIJEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverESt6vectorINS0_57NativeIntersectionObserverNativeIntersectionObserverEntryIiNS_3jsi5ValueESt5tupleIJffffEES9_S9_bNS0_16HighResTimeStampEEESaISB_EEJRNS6_7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_16NativeMicrotasksEvJNS_3jsi8FunctionEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_16NativeMicrotasksEvJRNS_3jsi7RuntimeENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJRKNS0_58NativeMutationObserverNativeMutationObserverObserveOptionsIiSt10shared_ptrIKNS0_10ShadowNodeEEbEEEJNS_3jsi6ObjectEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKS5_INS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJNS_3jsi8FunctionENS0_12SyncCallbackIFNS4_5ValueES7_EEEEJS5_S5_EEET_RNS4_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeMutationObserverESt6vectorINS0_42NativeMutationObserverNativeMutationRecordIiNS3_5ValueES6_IS8_SaIS8_EESA_EESaISB_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeERKNS0_58NativeMutationObserverNativeMutationObserverObserveOptionsIiSt10shared_ptrIKNS0_10ShadowNodeEEbEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeENS4_8FunctionENS0_12SyncCallbackIFNS4_5ValueES9_EEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverESt6vectorINS0_42NativeMutationObserverNativeMutationRecordIiNS_3jsi5ValueES4_IS7_SaIS7_EES9_EESaISA_EEJRNS6_7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceENS0_16HighResTimeStampEJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceENS0_15HighResDurationEJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS_3jsi5ValueEEJNSD_6StringEdSE_EEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS0_15HighResDurationENS_3jsi5ValueEEJNSE_6StringEddSF_EEET_RNSE_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsISt8optionalIdENS0_17NativePerformanceES4_JRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSE_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJS4_INS_3jsi6StringEEEEET_RNSC_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalINS0_20PerformanceEntryTypeEEEJNS3_6StringESI_IdEEEET_RNS3_7RuntimeEMT0_FT1_SP_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSQ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJNS0_20PerformanceEntryTypeEEJdEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSE_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjESaISE_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_17NativePerformanceESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdSt4hashISC_ESt8equal_toISC_ESaISt4pairIKSC_dEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17NativePerformanceENS3_6ObjectEJNS0_13AsyncCallbackIJEEEEJNS3_8FunctionEEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceEdJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJNS_3jsi6ObjectENS0_40NativePerformancePerformanceObserverInitISt8optionalISt6vectorIiSaIiEEES7_IiES7_IbES7_INS0_15HighResDurationEEEEEJNS4_5ValueES5_EEET_RNS4_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJNS3_6ObjectEbEJNS3_5ValueEbEEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_20PerformanceEntryTypeESaIS7_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS0_16HighResTimeStampEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS0_15HighResDurationEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS0_15HighResDurationENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt8optionalIdEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeESt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalINS0_20PerformanceEntryTypeEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeENS0_20PerformanceEntryTypeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjESaISC_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdSt4hashISA_ESt8equal_toISA_ESaISt4pairIKSA_dEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS_3jsi6ObjectEJRNS4_7RuntimeENS0_13AsyncCallbackIJEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEdJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeENS4_6ObjectENS0_40NativePerformancePerformanceObserverInitISt8optionalISt6vectorIiSaIiEEES9_IiES9_IbES9_INS0_15HighResDurationEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeENS8_6ObjectEbEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_20PerformanceEntryTypeESaIS5_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNS_3jsi6ObjectEEJdS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNS0_13AsyncCallbackIJdEEEEJdNS_3jsi8FunctionEEEET_RNS6_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiiEJddEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiiNS_3jsi6ObjectENS0_13AsyncCallbackIJNS0_34NativeAnimatedTurboModuleEndResultIbSt8optionalIdES9_EEEEEEJddS5_NS4_8FunctionEEEET_RNS4_7RuntimeEMT0_FT1_SF_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJidEJddEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_3jsi6ObjectEEJdNSA_6StringESB_EEET_RNSA_7RuntimeEMT0_FT1_SF_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSG_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJdNS_3jsi6StringEdEEET_RNSA_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJNS_3jsi5ArrayEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNS0_13AsyncCallbackIJdEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiiNS4_6ObjectENS0_13AsyncCallbackIJNS0_34NativeAnimatedTurboModuleEndResultIbSt8optionalIdESB_EEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEidEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeENS4_5ArrayEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_13NativeCPUTimeEdJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIbNS0_13NativeCPUTimeEbJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_13NativeCPUTimeEdJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_13NativeCPUTimeEbJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_31NativeFantomTestSpecificMethodsEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_31NativeFantomTestSpecificMethodsEvJNS_3jsi8FunctionEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_31NativeFantomTestSpecificMethodsEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_31NativeFantomTestSpecificMethodsEvJRNS_3jsi7RuntimeENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeCxxModuleExampleESt6vectorISt8optionalINS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_ISE_EEEESaISH_EEJSJ_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIbNS0_22NativeCxxModuleExampleEbJbEJbEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_37NativeCxxModuleExampleConstantsStructIbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_13CustomEnumIntEJS6_EJdEEET_RNS3_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKS6_INS0_11CallInvokerEEPSE_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEEJNS3_6ObjectEEEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSC_INS0_11CallInvokerEEPSL_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_36NativeCxxModuleExampleBinaryTreeNodeIiEEJS7_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_31NativeCxxModuleExampleGraphNodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJSD_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumIntEJS6_EJdEEET_RNS3_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumStrEJNS0_30NativeCxxModuleExampleEnumNoneEEJS4_EEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleESt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESt4lessISC_ESaISt4pairIKSC_SE_EEEJSL_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIdNS0_22NativeCxxModuleExampleEdJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISC_EEEJSF_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeCxxModuleExampleESt3setIfSt4lessIfESaIfEEJSA_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSE_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSB_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJfRKSB_NS3_6ObjectEEJdS4_SE_EEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_33NativeCxxModuleExampleValueStructIdNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_34NativeCxxModuleExampleObjectStructIiSC_St8optionalISC_EEEEEJdSC_SG_EJdNS3_6StringES4_EEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJRKNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJNS_3jsi8FunctionEEEET_RNSE_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi8FunctionENS0_22NativeCxxModuleExampleESt8functionIFvvEEJNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJS4_EEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEJbEJbEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsISt8optionalIbENS0_22NativeCxxModuleExampleES4_JS4_EJS4_EEET_RNS_3jsi7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJNS0_30NativeCxxModuleExampleMenuItemINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_13AsyncCallbackIJSA_bEEESt8optionalISA_EEEEJNS_3jsi6ObjectEEEET_RNSG_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FN:21,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISC_EEEJRKSF_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt6vectorISt8optionalINS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_ISC_EEEESaISF_EEJRNS_3jsi7RuntimeESH_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEbJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_37NativeCxxModuleExampleConstantsStructIbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_13CustomEnumIntEJRNS_3jsi7RuntimeES4_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_36NativeCxxModuleExampleBinaryTreeNodeIiEEJRNS_3jsi7RuntimeES5_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_31NativeCxxModuleExampleGraphNodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeESB_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumIntEJRNS_3jsi7RuntimeES4_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumStrEJRNS_3jsi7RuntimeENS0_30NativeCxxModuleExampleEnumNoneEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESt4lessISA_ESaISt4pairIKSA_SC_EEEJRNS_3jsi7RuntimeESJ_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEdJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_EEEJRNS_3jsi7RuntimeESD_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt3setIfSt4lessIfESaIfEEJRNS_3jsi7RuntimeES8_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeES9_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEfRKS9_NSA_6ObjectEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_33NativeCxxModuleExampleValueStructIdNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_34NativeCxxModuleExampleObjectStructIiSA_St8optionalISA_EEEEEJRNS_3jsi7RuntimeEdSA_SE_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt8functionIFvvEEJRNS_3jsi7RuntimeENS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt8optionalIbEJRNS_3jsi7RuntimeES5_EEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeENS0_30NativeCxxModuleExampleMenuItemINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_13AsyncCallbackIJSD_bEEESt8optionalISD_EEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FN:71,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_EEEJRNS_3jsi7RuntimeERKSD_EEEmMT_FT0_DpT1_E", + "FNDA:30,_ZN8facebook5react8bridging10callFromJsIdNS0_12NativeFantomEiJdddddEJdddSt8optionalIdES5_EEET_RNS_3jsi7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESG_INS0_8RawEvent8CategoryEESG_IbEEJNS_3jsi5ValueENSQ_6StringESG_ISR_ESG_IdESP_EEET_RNSQ_7RuntimeEMT0_FT1_SX_DpT2_ERKS4_INS0_11CallInvokerEEPSY_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEEJNS_3jsi5ValueENSC_6ObjectEEEET_RNSC_7RuntimeEMT0_FT1_SH_DpT2_ERKS4_INS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt10shared_ptrIKNS0_10ShadowNodeEEddEJNS_3jsi5ValueEddEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_12NativeFantomESt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EEJiEJdEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_12NativeFantomES4_JRKSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS6_INS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:63,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:27,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_12NativeFantomENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJiNS0_31NativeFantomRenderFormatOptionsIbbEEEJdNS3_6ObjectEEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:1,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi8FunctionENS0_12NativeFantomES4_JSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKS6_INS0_11CallInvokerEEPSE_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJSt8optionalINS0_16HighResTimeStampEEEJS4_IdEEEET_RNS_3jsi7RuntimeEMT0_FT1_SB_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSC_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12NativeFantomEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalIS9_ESE_EEEJNS_3jsi6StringENSI_6ObjectEEEET_RNSI_7RuntimeEMT0_FT1_SN_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSO_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEiJRNS_3jsi7RuntimeEdddddEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESJ_INS0_8RawEvent8CategoryEESJ_IbEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEddEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomESt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EEJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENS_3jsi6ObjectEJRNS4_7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEiNS0_31NativeFantomRenderFormatOptionsIbbEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomENS_3jsi8FunctionEJRNS4_7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeESt8optionalINS0_16HighResTimeStampEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12NativeFantomEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalISC_ESH_EEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17ImageLoaderModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_17ImageLoaderModuleES4_JEJEEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS3_6StringEEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS3_6ObjectEEJNS3_6StringESI_EEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS0_12AsyncPromiseIJbEEEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJNS3_6StringEdEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17ImageLoaderModuleENS3_6ObjectEJRKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISD_EEEJNS3_5ArrayEEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS_3jsi6ObjectEJRNS4_7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJNS0_33NativeImageLoaderAndroidImageSizeIddEEEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS8_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS0_12AsyncPromiseIJbEEEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17ImageLoaderModuleENS_3jsi6ObjectEJRNS4_7RuntimeERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISE_EEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_14AppStateModuleENS0_31NativeAppStateAppStateConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJRKNS0_13AsyncCallbackIJNS0_22NativeAppStateAppStateINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEENS_3jsi8FunctionEEJSH_SH_EEET_RNSG_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AppStateModuleEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:1,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_16DeviceInfoModuleENS0_35NativeDeviceInfoDeviceInfoConstantsINS0_33NativeDeviceInfoDimensionsPayloadISt8optionalINS0_30NativeDeviceInfoDisplayMetricsIddddEEESB_S8_INS0_37NativeDeviceInfoDisplayMetricsAndroidIdddddEEESE_EES8_IbESG_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJbEJbEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17DevSettingsModuleEvJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_23PlatformConstantsModuleENS0_54NativePlatformConstantsAndroidPlatformConstantsAndroidIbSt8optionalIbENS0_55NativePlatformConstantsAndroidReactNativeVersionAndroidIiiiS7_IiEEEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESH_SH_SH_S7_ISH_ESH_SH_SH_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_23PlatformConstantsModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_16SourceCodeModuleENS0_35NativeSourceCodeSourceCodeConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorINS0_33NativeExceptionsManagerStackFrameISt8optionalIiESC_IS9_ESD_S9_SC_IbEEESaISG_EEiEJNS_3jsi6StringENSJ_5ArrayEdEEET_RNSJ_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJRKNS0_36NativeExceptionsManagerExceptionDataINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_ESC_SC_St6vectorINS0_33NativeExceptionsManagerStackFrameISB_IiESC_SF_SA_SB_IbEEESaISH_EEibSB_ISt13unordered_mapISA_SA_St4hashISA_ESt8equal_toISA_ESaISt4pairIKSA_SA_EEEEEEEJNS_3jsi6ObjectEEEET_RNSY_7RuntimeEMT0_FT1_S12_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS13_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_23NativeExceptionsManagerEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleENS0_31NativeAppStateAppStateConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJNS0_22NativeAppStateAppStateINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AppStateModuleEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16DeviceInfoModuleENS0_35NativeDeviceInfoDeviceInfoConstantsINS0_33NativeDeviceInfoDimensionsPayloadISt8optionalINS0_30NativeDeviceInfoDisplayMetricsIddddEEES9_S6_INS0_37NativeDeviceInfoDisplayMetricsAndroidIdddddEEESC_EES6_IbESE_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_23PlatformConstantsModuleENS0_54NativePlatformConstantsAndroidPlatformConstantsAndroidIbSt8optionalIbENS0_55NativePlatformConstantsAndroidReactNativeVersionAndroidIiiiS5_IiEEEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESF_SF_SF_S5_ISF_ESF_SF_SF_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_23PlatformConstantsModuleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17DevSettingsModuleEvJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16SourceCodeModuleENS0_35NativeSourceCodeSourceCodeConstantsINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorINS0_33NativeExceptionsManagerStackFrameISt8optionalIiESF_ISC_ESG_SC_SF_IbEEESaISJ_EEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeERKNS0_36NativeExceptionsManagerExceptionDataINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISD_ESF_SF_St6vectorINS0_33NativeExceptionsManagerStackFrameISE_IiESF_SI_SD_SE_IbEEESaISK_EEibSE_ISt13unordered_mapISD_SD_St4hashISD_ESt8equal_toISD_ESaISt4pairIKSD_SD_EEEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_23NativeExceptionsManagerEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalISt6vectorIS9_SaIS9_EEENS_3jsi6ObjectEiEJNSJ_6StringESC_INSJ_5ArrayEESK_dEEET_RNSJ_7RuntimeEMT0_FT1_SQ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSR_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJNS_3jsi6StringEdEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJdNS_3jsi6StringEdEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_15WebSocketModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalISt6vectorISC_SaISC_EEENS4_6ObjectEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_15WebSocketModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_jRKSt6vectorISt4pairIS9_S9_ESaISE_EERKNS0_4http4BodyESB_bjbEJNS_3jsi6StringESO_dNSN_5ArrayENSN_6ObjectESO_bdbEEET_RNSN_7RuntimeEMT0_FT1_ST_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSU_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJjEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNS0_13AsyncCallbackIJbEEEEJNS_3jsi8FunctionEEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_16NetworkingModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESE_jRKSt6vectorISt4pairISC_SC_ESaISH_EERKNS0_4http4BodyESE_bjbEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeEjEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJbEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16NetworkingModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_20DevLoadingViewModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESD_SC_IbEEJNS_3jsi6StringESC_IdESH_SE_EEET_RNSF_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_20DevLoadingViewModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_20DevLoadingViewModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESG_SF_IbEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_20DevLoadingViewModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_12LogBoxModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_12LogBoxModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIdNS0_9NativeDOMEdJNS_3jsi5ValueES5_EJS5_S5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt6vectorINS3_5ValueESaIS7_EEJS7_EJS7_EEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJS4_NS3_6StringEEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JS4_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIbNS0_9NativeDOMEbJNS_3jsi5ValueEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJiiiiEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:4,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJddddEEJSt10shared_ptrIKNS0_10ShadowNodeEEbEJNS3_5ValueEbEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJiiEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJddEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS8_INS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:1,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_9NativeDOMENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJNS3_5ValueEEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSC_INS0_11CallInvokerEEPSK_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIbNS0_9NativeDOMEbJSt10shared_ptrIKNS0_10ShadowNodeEEdEJNS_3jsi5ValueEdEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEEdEJNS_3jsi5ValueEdEEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_9NativeDOMESt5tupleIJNS3_5ValueEddEEJSt10shared_ptrIKNS0_10ShadowNodeEEEJS7_EEET_RNS3_7RuntimeEMT0_FT1_SF_DpT2_ERKS9_INS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:30,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_9NativeDOMES4_JiS4_EJdS4_EEET_RNS3_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddddEEEEJNS_3jsi5ValueENSD_8FunctionEEEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddEEEEJNS_3jsi5ValueENSD_8FunctionEEEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEES7_NS_3jsi8FunctionERKNS0_12SyncCallbackIFvddddEEEEJNS8_5ValueESF_S9_S9_EEET_RNS8_7RuntimeEMT0_FT1_SI_DpT2_ERKS4_INS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_9NativeDOMEvJSt10shared_ptrIKNS0_10ShadowNodeEENS_3jsi5ValueEEJS9_S9_EEET_RNS8_7RuntimeEMT0_FT1_SC_DpT2_ERKS4_INS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEdJRNS_3jsi7RuntimeENS4_5ValueES7_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt6vectorINS_3jsi5ValueESaIS6_EEJRNS5_7RuntimeES6_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeEiRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeES5_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEbJRNS_3jsi7RuntimeENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJiiiiEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJddddEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEbEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJiiEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJddEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEbJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMESt5tupleIJNS_3jsi5ValueEddEEJRNS5_7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMENS_3jsi5ValueEJRNS4_7RuntimeEiS5_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddddEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNS0_12SyncCallbackIFvddddEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEESA_NS4_8FunctionERKNS0_12SyncCallbackIFvddddEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_9NativeDOMEvJRNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FNDA:2,_ZN8facebook5react8bridging10callFromJsIbNS0_29NativeReactNativeFeatureFlagsEbJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIdNS0_29NativeReactNativeFeatureFlagsEdJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_29NativeReactNativeFeatureFlagsEbJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_29NativeReactNativeFeatureFlagsEdJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_19NativeIdleCallbacksENS3_6ObjectEJONS0_12SyncCallbackIFvS6_EEESt8optionalINS0_45NativeIdleCallbacksRequestIdleCallbackOptionsISB_INS0_15HighResDurationEEEEEEJNS3_8FunctionESB_IS6_EEEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_19NativeIdleCallbacksEvJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_19NativeIdleCallbacksENS_3jsi6ObjectEJRNS4_7RuntimeEONS0_12SyncCallbackIFvS5_EEESt8optionalINS0_45NativeIdleCallbacksRequestIdleCallbackOptionsISC_INS0_15HighResDurationEEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_19NativeIdleCallbacksEvJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_26NativeIntersectionObserverENS3_6ObjectEJNS0_66NativeIntersectionObserverNativeIntersectionObserverObserveOptionsIiSt8optionalISt10shared_ptrIKNS0_10ShadowNodeEEESC_St6vectorIfSaIfEES8_ISG_ES8_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJS6_EEET_RNS3_7RuntimeEMT0_FT1_SS_DpT2_ERKS9_INS0_11CallInvokerEEPST_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJiNS_3jsi6ObjectEEJdNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJNS0_13AsyncCallbackIJEEEEJNS_3jsi8FunctionEEEET_RNS6_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_26NativeIntersectionObserverEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_26NativeIntersectionObserverESt6vectorINS0_57NativeIntersectionObserverNativeIntersectionObserverEntryIiNS3_5ValueESt5tupleIJffffEESA_SA_bNS0_16HighResTimeStampEEESaISC_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverENS_3jsi6ObjectEJRNS4_7RuntimeENS0_66NativeIntersectionObserverNativeIntersectionObserverObserveOptionsIiSt8optionalISt10shared_ptrIKNS0_10ShadowNodeEEESD_St6vectorIfSaIfEES9_ISH_ES9_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeEiNS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeENS0_13AsyncCallbackIJEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_26NativeIntersectionObserverESt6vectorINS0_57NativeIntersectionObserverNativeIntersectionObserverEntryIiNS_3jsi5ValueESt5tupleIJffffEES9_S9_bNS0_16HighResTimeStampEEESaISB_EEJRNS6_7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:126,_ZN8facebook5react8bridging10callFromJsIvNS0_16NativeMicrotasksEvJNS_3jsi8FunctionEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_16NativeMicrotasksEvJRNS_3jsi7RuntimeENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJRKNS0_58NativeMutationObserverNativeMutationObserverObserveOptionsIiSt10shared_ptrIKNS0_10ShadowNodeEEbEEEJNS_3jsi6ObjectEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKS5_INS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJNS_3jsi8FunctionENS0_12SyncCallbackIFNS4_5ValueES7_EEEEJS5_S5_EEET_RNS4_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeMutationObserverEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeMutationObserverESt6vectorINS0_42NativeMutationObserverNativeMutationRecordIiNS3_5ValueES6_IS8_SaIS8_EESA_EESaISB_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeERKNS0_58NativeMutationObserverNativeMutationObserverObserveOptionsIiSt10shared_ptrIKNS0_10ShadowNodeEEbEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeENS4_8FunctionENS0_12SyncCallbackIFNS4_5ValueES9_EEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeMutationObserverESt6vectorINS0_42NativeMutationObserverNativeMutationRecordIiNS_3jsi5ValueES4_IS7_SaIS7_EES9_EESaISA_EEJRNS6_7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:65,_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceENS0_16HighResTimeStampEJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceENS0_15HighResDurationEJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS_3jsi5ValueEEJNSD_6StringEdSE_EEET_RNSD_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS0_15HighResDurationENS_3jsi5ValueEEJNSE_6StringEddSF_EEET_RNSE_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsISt8optionalIdENS0_17NativePerformanceES4_JRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSE_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJS4_INS_3jsi6StringEEEEET_RNSC_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalINS0_20PerformanceEntryTypeEEEJNS3_6StringESI_IdEEEET_RNS3_7RuntimeEMT0_FT1_SP_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSQ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJNS0_20PerformanceEntryTypeEEJdEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSE_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjESaISE_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_17NativePerformanceESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdSt4hashISC_ESt8equal_toISC_ESaISt4pairIKSC_dEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_17NativePerformanceENS3_6ObjectEJNS0_13AsyncCallbackIJEEEEJNS3_8FunctionEEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIdNS0_17NativePerformanceEdJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJNS_3jsi6ObjectENS0_40NativePerformancePerformanceObserverInitISt8optionalISt6vectorIiSaIiEEES7_IiES7_IbES7_INS0_15HighResDurationEEEEEJNS4_5ValueES5_EEET_RNS4_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJNS_3jsi6ObjectEEJNS4_5ValueEEEET_RNS4_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS7_EEJNS3_6ObjectEbEJNS3_5ValueEbEEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_17NativePerformanceESt6vectorINS0_20PerformanceEntryTypeESaIS7_EEJEJEEET_RNS3_7RuntimeEMT0_FT1_SC_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSD_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_17NativePerformanceEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS0_16HighResTimeStampEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS0_15HighResDurationEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_16HighResTimeStampENS0_15HighResDurationENS4_5ValueEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt8optionalIdEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeESt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalINS0_20PerformanceEntryTypeEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeENS0_20PerformanceEntryTypeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjESaISC_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdSt4hashISA_ESt8equal_toISA_ESaISt4pairIKSA_dEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceENS_3jsi6ObjectEJRNS4_7RuntimeENS0_13AsyncCallbackIJEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEdJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeENS4_6ObjectENS0_40NativePerformancePerformanceObserverInitISt8optionalISt6vectorIiSaIiEEES9_IiES9_IbES9_INS0_15HighResDurationEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_22NativePerformanceEntryESaIS5_EEJRNS_3jsi7RuntimeENS8_6ObjectEbEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceESt6vectorINS0_20PerformanceEntryTypeESaIS5_EEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_17NativePerformanceEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNS_3jsi6ObjectEEJdS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNS0_13AsyncCallbackIJdEEEEJdNS_3jsi8FunctionEEEET_RNS6_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiiEJddEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiiNS_3jsi6ObjectENS0_13AsyncCallbackIJNS0_34NativeAnimatedTurboModuleEndResultIbSt8optionalIdES9_EEEEEEJddS5_NS4_8FunctionEEEET_RNS4_7RuntimeEMT0_FT1_SF_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJidEJddEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_3jsi6ObjectEEJdNSA_6StringESB_EEET_RNSA_7RuntimeEMT0_FT1_SF_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSG_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEJdNS_3jsi6StringEdEEET_RNSA_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_14AnimatedModuleEvJNS_3jsi5ArrayEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNS0_13AsyncCallbackIJdEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiiNS4_6ObjectENS0_13AsyncCallbackIJNS0_34NativeAnimatedTurboModuleEndResultIbSt8optionalIdESB_EEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEidEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS4_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeEiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_14AnimatedModuleEvJRNS_3jsi7RuntimeENS4_5ArrayEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIdNS0_13NativeCPUTimeEdJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIbNS0_13NativeCPUTimeEbJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_13NativeCPUTimeEdJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_13NativeCPUTimeEbJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_31NativeFantomTestSpecificMethodsEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_31NativeFantomTestSpecificMethodsEvJNS_3jsi8FunctionEEJS5_EEET_RNS4_7RuntimeEMT0_FT1_S8_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS9_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_31NativeFantomTestSpecificMethodsEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_31NativeFantomTestSpecificMethodsEvJRNS_3jsi7RuntimeENS4_8FunctionEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeCxxModuleExampleESt6vectorISt8optionalINS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_ISE_EEEESaISH_EEJSJ_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SM_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSN_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIbNS0_22NativeCxxModuleExampleEbJbEJbEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_37NativeCxxModuleExampleConstantsStructIbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_13CustomEnumIntEJS6_EJdEEET_RNS3_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKS6_INS0_11CallInvokerEEPSE_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEEJNS3_6ObjectEEEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSC_INS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_36NativeCxxModuleExampleBinaryTreeNodeIiEEJS7_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_31NativeCxxModuleExampleGraphNodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJSD_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumIntEJS6_EJdEEET_RNS3_7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumStrEJNS0_30NativeCxxModuleExampleEnumNoneEEJS4_EEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleESt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESt4lessISC_ESaISt4pairIKSC_SE_EEEJSL_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SO_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSP_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIdNS0_22NativeCxxModuleExampleEdJdEJdEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISC_EEEJSF_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ArrayENS0_22NativeCxxModuleExampleESt3setIfSt4lessIfESaIfEEJSA_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SD_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSE_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJSB_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SE_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSF_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6StringENS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJfRKSB_NS3_6ObjectEEJdS4_SE_EEET_RNS3_7RuntimeEMT0_FT1_SH_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSI_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_33NativeCxxModuleExampleValueStructIdNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_34NativeCxxModuleExampleObjectStructIiSC_St8optionalISC_EEEEEJdSC_SG_EJdNS3_6StringES4_EEET_RNS3_7RuntimeEMT0_FT1_SL_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSM_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJRKNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJNS_3jsi8FunctionEEEET_RNSE_7RuntimeEMT0_FT1_SI_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSJ_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi8FunctionENS0_22NativeCxxModuleExampleESt8functionIFvvEEJNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEJS4_EEET_RNS3_7RuntimeEMT0_FT1_SJ_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSK_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEJbEJbEEET_RNS3_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsISt8optionalIbENS0_22NativeCxxModuleExampleES4_JS4_EJS4_EEET_RNS_3jsi7RuntimeEMT0_FT1_S9_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSA_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJEJEEET_RNS_3jsi7RuntimeEMT0_FT1_S7_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPS8_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi5ValueENS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJEEEJEJEEET_RNS3_7RuntimeEMT0_FT1_SA_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSB_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJNS0_30NativeCxxModuleExampleMenuItemINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_13AsyncCallbackIJSA_bEEESt8optionalISA_EEEEJNS_3jsi6ObjectEEEET_RNSG_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsIvNS0_22NativeCxxModuleExampleEvJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEJNS_3jsi6StringEEEET_RNSC_7RuntimeEMT0_FT1_SG_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSH_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging10callFromJsINS_3jsi6ObjectENS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISC_EEEJRKSF_EJS4_EEET_RNS3_7RuntimeEMT0_FT1_SK_DpT2_ERKSt10shared_ptrINS0_11CallInvokerEEPSL_DpOT3_", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt6vectorISt8optionalINS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_ISC_EEEESaISF_EEJRNS_3jsi7RuntimeESH_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEbJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_37NativeCxxModuleExampleConstantsStructIbiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_13CustomEnumIntEJRNS_3jsi7RuntimeES4_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeESt10shared_ptrINS0_17HostObjectWrapperINS0_19CustomHostObjectRefEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_36NativeCxxModuleExampleBinaryTreeNodeIiEEJRNS_3jsi7RuntimeES5_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_31NativeCxxModuleExampleGraphNodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEJRNS_3jsi7RuntimeESB_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumIntEJRNS_3jsi7RuntimeES4_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_29NativeCxxModuleExampleEnumStrEJRNS_3jsi7RuntimeENS0_30NativeCxxModuleExampleEnumNoneEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalIiESt4lessISA_ESaISt4pairIKSA_SC_EEEJRNS_3jsi7RuntimeESJ_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEdJRNS_3jsi7RuntimeEdEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_EEEJRNS_3jsi7RuntimeESD_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt3setIfSt4lessIfESaIfEEJRNS_3jsi7RuntimeES8_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeES9_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJRNS_3jsi7RuntimeEfRKS9_NSA_6ObjectEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_33NativeCxxModuleExampleValueStructIdNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_34NativeCxxModuleExampleObjectStructIiSA_St8optionalISA_EEEEEJRNS_3jsi7RuntimeEdSA_SE_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeERKNS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt8functionIFvvEEJRNS_3jsi7RuntimeENS0_13AsyncCallbackIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEJRNS_3jsi7RuntimeEbEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleESt8optionalIbEJRNS_3jsi7RuntimeES5_EEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_12AsyncPromiseIJEEEJRNS_3jsi7RuntimeEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeENS0_30NativeCxxModuleExampleMenuItemINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_13AsyncCallbackIJSD_bEEESt8optionalISD_EEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleEvJRNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEmMT_FT0_DpT1_E", + "FNDA:0,_ZN8facebook5react8bridging17getParameterCountINS0_22NativeCxxModuleExampleENS0_34NativeCxxModuleExampleObjectStructIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8optionalISA_EEEJRNS_3jsi7RuntimeERKSD_EEEmMT_FT0_DpT1_E", + "FNF:2", + "FNH:1", + "DA:21,350", + "DA:22,350", + "DA:23,350", + "DA:24,350", + "DA:25,190", + "DA:26,190", + "DA:28,350", + "DA:29,160", + "DA:31,160", + "DA:32,160", + "DA:34,160", + "DA:35,160", + "DA:37,160", + "DA:38,0", + "DA:40,0", + "DA:41,0", + "DA:42,0", + "DA:43,0", + "DA:44,0", + "DA:45,0", + "DA:47,0", + "DA:48,0", + "DA:50,0", + "DA:51,0", + "DA:52,0", + "DA:53,0", + "DA:54,0", + "DA:56,0", + "DA:57,0", + "DA:58,0", + "DA:59,0", + "DA:60,0", + "DA:61,350", + "DA:71,0", + "DA:72,0", + "DA:73,0", + "BRF:0", + "BRH:0", + "LF:36", + "LH:33", + "end_of_record" +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.source b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.source new file mode 100644 index 00000000000..16bc0cf0aba --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/Class.h.source @@ -0,0 +1,75 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +namespace facebook::react::bridging { + +template +JSReturnT callFromJs( + jsi::Runtime &rt, + ReturnT (ClassT::*method)(jsi::Runtime &, ArgsT...), + const std::shared_ptr &jsInvoker, + ClassT *instance, + JSArgsT &&...args) +{ + static_assert(sizeof...(ArgsT) == sizeof...(JSArgsT), "Incorrect arguments length"); + static_assert((supportsFromJs && ...), "Incompatible arguments"); + if constexpr (std::is_void_v) { + static_assert(std::is_void_v, "Method must return void when JSReturnT is void"); + } + + if constexpr (std::is_void_v) { + (instance->*method)(rt, fromJs(rt, std::forward(args), jsInvoker)...); + + } else if constexpr (std::is_void_v) { + static_assert(std::is_same_v, "Void functions may only return undefined"); + + (instance->*method)(rt, fromJs(rt, std::forward(args), jsInvoker)...); + return jsi::Value(); + + } else if constexpr (is_jsi_v || supportsToJs) { + static_assert(supportsToJs, "Incompatible return type"); + + return toJs(rt, (instance->*method)(rt, fromJs(rt, std::forward(args), jsInvoker)...), jsInvoker); + } else if constexpr (is_optional_jsi_v) { + static_assert( + is_optional_v ? supportsToJs + : supportsToJs, + "Incompatible return type"); + + auto result = + toJs(rt, (instance->*method)(rt, fromJs(rt, std::forward(args), jsInvoker)...), jsInvoker); + + if constexpr (std::is_same_v) { + if (result.isNull() || result.isUndefined()) { + return std::nullopt; + } + } + + return convert(rt, std::move(result)); + } else { + static_assert(std::is_convertible_v, "Incompatible return type"); + return (instance->*method)(rt, fromJs(rt, std::forward(args), jsInvoker)...); + } +} + +template +constexpr size_t getParameterCount(ReturnT (* /*unused*/)(ArgsT...)) +{ + return sizeof...(ArgsT); +} + +template +constexpr size_t getParameterCount(ReturnT (Class::* /*unused*/)(ArgsT...)) +{ + return sizeof...(ArgsT); +} + +} // namespace facebook::react::bridging diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.functions.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.functions.json new file mode 100644 index 00000000000..f96ce1a3ac7 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.functions.json @@ -0,0 +1,20 @@ +[{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCxxPlatform/react/devsupport/DevSettingsModule.h" + ], + "name": "_ZN8facebook5react17DevSettingsModuleC2ESt10shared_ptrINS0_11CallInvokerEESt8weak_ptrINS0_15DevServerHelperEESt8functionIFvvEE", + "regions": [ + [ + 28, + 3, + 29, + 4, + 0, + 0, + 0, + 0 + ] + ] +}] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.json new file mode 100644 index 00000000000..943dc8cb1fc --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.json @@ -0,0 +1,52 @@ +{ + "branches": [], + "expansions": [], + "filename": "packages/react-native/ReactCxxPlatform/react/devsupport/DevSettingsModule.h", + "segments": [ + [ + 28, + 3, + 0, + true, + true, + false + ], + [ + 29, + 4, + 0, + false, + false, + false + ] + ], + "summary": { + "branches": { + "count": 0, + "covered": 0, + "notcovered": 0, + "percent": 0 + }, + "functions": { + "count": 1, + "covered": 0, + "percent": 0 + }, + "instantiations": { + "count": 1, + "covered": 0, + "percent": 0 + }, + "lines": { + "count": 2, + "covered": 0, + "percent": 0 + }, + "regions": { + "count": 1, + "covered": 0, + "notcovered": 1, + "percent": 0 + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.lcov.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.lcov.json new file mode 100644 index 00000000000..7ca3106ca8a --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.lcov.json @@ -0,0 +1,14 @@ +[ + "SF:packages/react-native/ReactCxxPlatform/react/devsupport/DevSettingsModule.h", + "FN:28,_ZN8facebook5react17DevSettingsModuleC2ESt10shared_ptrINS0_11CallInvokerEESt8weak_ptrINS0_15DevServerHelperEESt8functionIFvvEE", + "FNDA:0,_ZN8facebook5react17DevSettingsModuleC2ESt10shared_ptrINS0_11CallInvokerEESt8weak_ptrINS0_15DevServerHelperEESt8functionIFvvEE", + "FNF:1", + "FNH:0", + "DA:28,0", + "DA:29,0", + "BRF:0", + "BRH:0", + "LF:2", + "LH:0", + "end_of_record" +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.source b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.source new file mode 100644 index 00000000000..a9ec5cd4197 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/DevSettingsModule.h.source @@ -0,0 +1,60 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include +#include +#include + +namespace facebook::react { + +class DevSettingsModule : public NativeDevSettingsCxxSpec { + using LiveReloadCallback = std::function; + + public: + DevSettingsModule( + std::shared_ptr jsInvoker, + std::weak_ptr devServerHelper, + LiveReloadCallback liveReloadCallback) + : NativeDevSettingsCxxSpec(jsInvoker), + devServerHelper_(std::move(devServerHelper)), + liveReloadCallback_(std::move(liveReloadCallback)) + { + } + + void reload(jsi::Runtime &rt); + + void reloadWithReason(jsi::Runtime &rt, const std::string &reason); + + void onFastRefresh(jsi::Runtime &rt); + + void setHotLoadingEnabled(jsi::Runtime &rt, bool isHotLoadingEnabled); + + void setIsDebuggingRemotely(jsi::Runtime &rt, bool isDebuggingRemotelyEnabled); + + void setProfilingEnabled(jsi::Runtime &rt, bool isProfilingEnabled); + + void toggleElementInspector(jsi::Runtime &rt); + + void addMenuItem(jsi::Runtime &rt, const std::string &title); + + void setIsShakeToShowDevMenuEnabled(jsi::Runtime &rt, bool enabled); + + void openDebugger(jsi::Runtime &rt); + + void addListener(jsi::Runtime &rt, const std::string &eventName); + + void removeListeners(jsi::Runtime &rt, double count); + + private: + std::weak_ptr devServerHelper_; + LiveReloadCallback liveReloadCallback_; +}; + +} // namespace facebook::react diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.functions.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.functions.json new file mode 100644 index 00000000000..5760c73ce70 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.functions.json @@ -0,0 +1,980 @@ +[{ + "branches": [], + "count": 1, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantomC2ERNS0_17TesterAppDelegateESt10shared_ptrINS0_11CallInvokerEE", + "regions": [ + [ + 32, + 33, + 32, + 35, + 1, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 30, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom12startSurfaceERNS_3jsi7RuntimeEddddd", + "regions": [ + [ + 40, + 29, + 52, + 2, + 30, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom11stopSurfaceERNS_3jsi7RuntimeEi", + "regions": [ + [ + 54, + 80, + 56, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom24produceFramesForDurationERNS_3jsi7RuntimeEd", + "regions": [ + [ + 60, + 26, + 62, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 33, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom17flushMessageQueueERNS_3jsi7RuntimeE", + "regions": [ + [ + 64, + 65, + 66, + 2, + 33, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom15flushEventQueueERNS_3jsi7RuntimeE", + "regions": [ + [ + 68, + 63, + 70, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [ + [ + 73, + 7, + 73, + 51, + 0, + 30, + 0, + 0, + 4 + ] + ], + "count": 30, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom25validateEmptyMessageQueueERNS_3jsi7RuntimeE", + "regions": [ + [ + 72, + 73, + 76, + 2, + 30, + 0, + 0, + 0 + ], + [ + 73, + 7, + 73, + 51, + 30, + 0, + 0, + 0 + ], + [ + 73, + 52, + 73, + 53, + 0, + 0, + 0, + 3 + ], + [ + 73, + 53, + 75, + 4, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom23takeMountingManagerLogsB5cxx11ERNS_3jsi7RuntimeEi", + "regions": [ + [ + 80, + 26, + 82, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 27, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom17getRenderedOutputB5cxx11ERNS_3jsi7RuntimeEiNS0_31NativeFantomRenderFormatOptionsIbbEE", + "regions": [ + [ + 87, + 63, + 94, + 2, + 27, + 0, + 0, + 0 + ], + [ + 90, + 1, + 90, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 1, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom26reportTestSuiteResultsJSONERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "regions": [ + [ + 98, + 46, + 100, + 2, + 1, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom26getDirectManipulationPropsERNS_3jsi7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEE", + "regions": [ + [ + 104, + 58, + 108, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom20getFabricUpdatePropsERNS_3jsi7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEE", + "regions": [ + [ + 112, + 58, + 116, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [ + [ + 125, + 7, + 125, + 31, + 0, + 0, + 0, + 0, + 4 + ] + ], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom18enqueueNativeEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESH_INS0_8RawEvent8CategoryEESH_IbE", + "regions": [ + [ + 124, + 35, + 134, + 2, + 0, + 0, + 0, + 0 + ], + [ + 125, + 7, + 125, + 31, + 0, + 0, + 0, + 0 + ], + [ + 125, + 32, + 125, + 33, + 0, + 0, + 0, + 3 + ], + [ + 125, + 33, + 128, + 4, + 0, + 0, + 0, + 0 + ], + [ + 128, + 4, + 128, + 10, + 0, + 0, + 0, + 3 + ], + [ + 128, + 10, + 133, + 4, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [ + [ + 143, + 7, + 143, + 38, + 0, + 0, + 0, + 0, + 4 + ] + ], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom18enqueueScrollEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEE", + "regions": [ + [ + 139, + 28, + 177, + 2, + 0, + 0, + 0, + 0 + ], + [ + 142, + 1, + 142, + 1, + 0, + 0, + 0, + 2 + ], + [ + 143, + 7, + 143, + 38, + 0, + 0, + 0, + 0 + ], + [ + 143, + 39, + 143, + 40, + 0, + 0, + 0, + 3 + ], + [ + 143, + 40, + 146, + 4, + 0, + 0, + 0, + 0 + ], + [ + 146, + 4, + 148, + 3, + 0, + 0, + 0, + 3 + ], + [ + 147, + 1, + 147, + 1, + 0, + 0, + 0, + 2 + ], + [ + 148, + 3, + 177, + 2, + 0, + 0, + 0, + 0 + ], + [ + 152, + 1, + 152, + 1, + 0, + 0, + 0, + 2 + ], + [ + 154, + 1, + 154, + 1, + 0, + 0, + 0, + 2 + ], + [ + 163, + 1, + 163, + 1, + 0, + 0, + 0, + 2 + ], + [ + 165, + 1, + 165, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [ + [ + 187, + 7, + 187, + 41, + 0, + 0, + 0, + 0, + 4 + ] + ], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom22enqueueModalSizeUpdateERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdd", + "regions": [ + [ + 183, + 20, + 199, + 2, + 0, + 0, + 0, + 0 + ], + [ + 186, + 1, + 186, + 1, + 0, + 0, + 0, + 2 + ], + [ + 187, + 7, + 187, + 41, + 0, + 0, + 0, + 0 + ], + [ + 187, + 42, + 187, + 43, + 0, + 0, + 0, + 3 + ], + [ + 187, + 43, + 190, + 4, + 0, + 0, + 0, + 0 + ], + [ + 190, + 4, + 192, + 3, + 0, + 0, + 0, + 3 + ], + [ + 191, + 1, + 191, + 1, + 0, + 0, + 0, + 2 + ], + [ + 192, + 3, + 199, + 2, + 0, + 0, + 0, + 0 + ], + [ + 195, + 1, + 195, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom32createShadowNodeReferenceCounterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEE", + "regions": [ + [ + 203, + 51, + 213, + 2, + 0, + 0, + 0, + 0 + ], + [ + 205, + 1, + 205, + 1, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom30createShadowNodeRevisionGetterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEE", + "regions": [ + [ + 217, + 51, + 245, + 2, + 0, + 0, + 0, + 0 + ], + [ + 220, + 1, + 220, + 1, + 0, + 0, + 0, + 2 + ], + [ + 231, + 1, + 231, + 1, + 0, + 0, + 0, + 2 + ], + [ + 239, + 1, + 244, + 7, + 0, + 0, + 0, + 2 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom24saveJSMemoryHeapSnapshotERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "regions": [ + [ + 249, + 34, + 252, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom21forceHighResTimeStampERNS_3jsi7RuntimeESt8optionalINS0_16HighResTimeStampEE", + "regions": [ + [ + 271, + 46, + 274, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom23startJSSamplingProfilerERNS_3jsi7RuntimeE", + "regions": [ + [ + 280, + 71, + 284, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom35stopJSSamplingProfilerAndSaveToFileERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "regions": [ + [ + 288, + 34, + 295, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom16setImageResponseERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalISA_ESF_EE", + "regions": [ + [ + 300, + 69, + 309, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom10clearImageERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "regions": [ + [ + 311, + 77, + 313, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "_ZN8facebook5react12NativeFantom14clearAllImagesERNS_3jsi7RuntimeE", + "regions": [ + [ + 315, + 57, + 317, + 2, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "NativeFantom.cpp:_ZZN8facebook5react12NativeFantom18enqueueScrollEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEENK3$_0clERKNS0_15ScrollViewStateE", + "regions": [ + [ + 171, + 62, + 176, + 8, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "NativeFantom.cpp:_ZZN8facebook5react12NativeFantom32createShadowNodeReferenceCounterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEENK3$_1clES4_RKNS2_5ValueEPSB_m", + "regions": [ + [ + 212, + 25, + 212, + 70, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [ + [ + 228, + 18, + 228, + 34, + 0, + 0, + 0, + 0, + 4 + ] + ], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.cpp" + ], + "name": "NativeFantom.cpp:_ZZN8facebook5react12NativeFantom30createShadowNodeRevisionGetterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEENK3$_2clES4_RKNS2_5ValueEPSB_m", + "regions": [ + [ + 227, + 25, + 238, + 8, + 0, + 0, + 0, + 0 + ], + [ + 228, + 18, + 228, + 34, + 0, + 0, + 0, + 0 + ], + [ + 228, + 59, + 228, + 60, + 0, + 0, + 0, + 3 + ], + [ + 228, + 60, + 235, + 10, + 0, + 0, + 0, + 0 + ], + [ + 231, + 1, + 231, + 1, + 0, + 0, + 0, + 2 + ], + [ + 235, + 10, + 235, + 16, + 0, + 0, + 0, + 3 + ], + [ + 235, + 16, + 237, + 10, + 0, + 0, + 0, + 0 + ] + ] +}] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.json new file mode 100644 index 00000000000..0e32c8dc8e1 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.json @@ -0,0 +1,948 @@ +{ + "branches": [ + [ + 73, + 7, + 73, + 51, + 0, + 30, + 0, + 0, + 4 + ], + [ + 125, + 7, + 125, + 31, + 0, + 0, + 0, + 0, + 4 + ], + [ + 143, + 7, + 143, + 38, + 0, + 0, + 0, + 0, + 4 + ], + [ + 187, + 7, + 187, + 41, + 0, + 0, + 0, + 0, + 4 + ], + [ + 228, + 18, + 228, + 34, + 0, + 0, + 0, + 0, + 4 + ] + ], + "expansions": [], + "filename": "private/react-native-fantom/tester/src/NativeFantom.cpp", + "segments": [ + [ + 32, + 33, + 1, + true, + true, + false + ], + [ + 32, + 35, + 0, + false, + false, + false + ], + [ + 40, + 29, + 30, + true, + true, + false + ], + [ + 52, + 2, + 0, + false, + false, + false + ], + [ + 54, + 80, + 0, + true, + true, + false + ], + [ + 56, + 2, + 0, + false, + false, + false + ], + [ + 60, + 26, + 0, + true, + true, + false + ], + [ + 62, + 2, + 0, + false, + false, + false + ], + [ + 64, + 65, + 33, + true, + true, + false + ], + [ + 66, + 2, + 0, + false, + false, + false + ], + [ + 68, + 63, + 0, + true, + true, + false + ], + [ + 70, + 2, + 0, + false, + false, + false + ], + [ + 72, + 73, + 30, + true, + true, + false + ], + [ + 73, + 7, + 30, + true, + true, + false + ], + [ + 73, + 51, + 30, + true, + false, + false + ], + [ + 73, + 52, + 0, + true, + false, + true + ], + [ + 73, + 53, + 0, + true, + true, + false + ], + [ + 75, + 4, + 30, + true, + false, + false + ], + [ + 76, + 2, + 0, + false, + false, + false + ], + [ + 80, + 26, + 0, + true, + true, + false + ], + [ + 82, + 2, + 0, + false, + false, + false + ], + [ + 87, + 63, + 27, + true, + true, + false + ], + [ + 90, + 1, + 0, + false, + true, + false + ], + [ + 90, + 1, + 27, + true, + false, + false + ], + [ + 94, + 2, + 0, + false, + false, + false + ], + [ + 98, + 46, + 1, + true, + true, + false + ], + [ + 100, + 2, + 0, + false, + false, + false + ], + [ + 104, + 58, + 0, + true, + true, + false + ], + [ + 108, + 2, + 0, + false, + false, + false + ], + [ + 112, + 58, + 0, + true, + true, + false + ], + [ + 116, + 2, + 0, + false, + false, + false + ], + [ + 124, + 35, + 0, + true, + true, + false + ], + [ + 125, + 7, + 0, + true, + true, + false + ], + [ + 125, + 31, + 0, + true, + false, + false + ], + [ + 125, + 33, + 0, + true, + true, + false + ], + [ + 128, + 4, + 0, + true, + false, + true + ], + [ + 128, + 10, + 0, + true, + true, + false + ], + [ + 133, + 4, + 0, + true, + false, + false + ], + [ + 134, + 2, + 0, + false, + false, + false + ], + [ + 139, + 28, + 0, + true, + true, + false + ], + [ + 142, + 1, + 0, + false, + true, + false + ], + [ + 142, + 1, + 0, + true, + false, + false + ], + [ + 143, + 7, + 0, + true, + true, + false + ], + [ + 143, + 38, + 0, + true, + false, + false + ], + [ + 143, + 40, + 0, + true, + true, + false + ], + [ + 146, + 4, + 0, + true, + false, + true + ], + [ + 147, + 1, + 0, + false, + true, + false + ], + [ + 147, + 1, + 0, + true, + false, + true + ], + [ + 148, + 3, + 0, + true, + true, + false + ], + [ + 152, + 1, + 0, + false, + true, + false + ], + [ + 152, + 1, + 0, + true, + false, + false + ], + [ + 154, + 1, + 0, + false, + true, + false + ], + [ + 154, + 1, + 0, + true, + false, + false + ], + [ + 163, + 1, + 0, + false, + true, + false + ], + [ + 163, + 1, + 0, + true, + false, + false + ], + [ + 165, + 1, + 0, + false, + true, + false + ], + [ + 165, + 1, + 0, + true, + false, + false + ], + [ + 171, + 62, + 0, + true, + true, + false + ], + [ + 176, + 8, + 0, + true, + false, + false + ], + [ + 177, + 2, + 0, + false, + false, + false + ], + [ + 183, + 20, + 0, + true, + true, + false + ], + [ + 186, + 1, + 0, + false, + true, + false + ], + [ + 186, + 1, + 0, + true, + false, + false + ], + [ + 187, + 7, + 0, + true, + true, + false + ], + [ + 187, + 41, + 0, + true, + false, + false + ], + [ + 187, + 43, + 0, + true, + true, + false + ], + [ + 190, + 4, + 0, + true, + false, + true + ], + [ + 191, + 1, + 0, + false, + true, + false + ], + [ + 191, + 1, + 0, + true, + false, + true + ], + [ + 192, + 3, + 0, + true, + true, + false + ], + [ + 195, + 1, + 0, + false, + true, + false + ], + [ + 195, + 1, + 0, + true, + false, + false + ], + [ + 199, + 2, + 0, + false, + false, + false + ], + [ + 203, + 51, + 0, + true, + true, + false + ], + [ + 205, + 1, + 0, + false, + true, + false + ], + [ + 205, + 1, + 0, + true, + false, + false + ], + [ + 212, + 25, + 0, + true, + true, + false + ], + [ + 212, + 70, + 0, + true, + false, + false + ], + [ + 213, + 2, + 0, + false, + false, + false + ], + [ + 217, + 51, + 0, + true, + true, + false + ], + [ + 220, + 1, + 0, + false, + true, + false + ], + [ + 220, + 1, + 0, + true, + false, + false + ], + [ + 227, + 25, + 0, + true, + true, + false + ], + [ + 228, + 18, + 0, + true, + true, + false + ], + [ + 228, + 34, + 0, + true, + false, + false + ], + [ + 228, + 60, + 0, + true, + true, + false + ], + [ + 231, + 1, + 0, + false, + true, + false + ], + [ + 231, + 1, + 0, + true, + false, + false + ], + [ + 235, + 16, + 0, + true, + true, + false + ], + [ + 237, + 10, + 0, + true, + false, + false + ], + [ + 239, + 1, + 0, + false, + true, + false + ], + [ + 244, + 7, + 0, + true, + false, + false + ], + [ + 245, + 2, + 0, + false, + false, + false + ], + [ + 249, + 34, + 0, + true, + true, + false + ], + [ + 252, + 2, + 0, + false, + false, + false + ], + [ + 271, + 46, + 0, + true, + true, + false + ], + [ + 274, + 2, + 0, + false, + false, + false + ], + [ + 280, + 71, + 0, + true, + true, + false + ], + [ + 284, + 2, + 0, + false, + false, + false + ], + [ + 288, + 34, + 0, + true, + true, + false + ], + [ + 295, + 2, + 0, + false, + false, + false + ], + [ + 300, + 69, + 0, + true, + true, + false + ], + [ + 309, + 2, + 0, + false, + false, + false + ], + [ + 311, + 77, + 0, + true, + true, + false + ], + [ + 313, + 2, + 0, + false, + false, + false + ], + [ + 315, + 57, + 0, + true, + true, + false + ], + [ + 317, + 2, + 0, + false, + false, + false + ] + ], + "summary": { + "branches": { + "count": 10, + "covered": 1, + "notcovered": 9, + "percent": 10 + }, + "functions": { + "count": 27, + "covered": 6, + "percent": 22.222222222222221 + }, + "instantiations": { + "count": 27, + "covered": 6, + "percent": 22.222222222222221 + }, + "lines": { + "count": 198, + "covered": 30, + "percent": 15.151515151515152 + }, + "regions": { + "count": 41, + "covered": 7, + "notcovered": 34, + "percent": 17.073170731707318 + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.lcov.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.lcov.json new file mode 100644 index 00000000000..841f5058f9d --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.lcov.json @@ -0,0 +1,254 @@ +[ + "SF:private/react-native-fantom/tester/src/NativeFantom.cpp", + "FN:32,_ZN8facebook5react12NativeFantomC2ERNS0_17TesterAppDelegateESt10shared_ptrINS0_11CallInvokerEE", + "FN:40,_ZN8facebook5react12NativeFantom12startSurfaceERNS_3jsi7RuntimeEddddd", + "FN:54,_ZN8facebook5react12NativeFantom11stopSurfaceERNS_3jsi7RuntimeEi", + "FN:60,_ZN8facebook5react12NativeFantom24produceFramesForDurationERNS_3jsi7RuntimeEd", + "FN:64,_ZN8facebook5react12NativeFantom17flushMessageQueueERNS_3jsi7RuntimeE", + "FN:68,_ZN8facebook5react12NativeFantom15flushEventQueueERNS_3jsi7RuntimeE", + "FN:72,_ZN8facebook5react12NativeFantom25validateEmptyMessageQueueERNS_3jsi7RuntimeE", + "FN:80,_ZN8facebook5react12NativeFantom23takeMountingManagerLogsB5cxx11ERNS_3jsi7RuntimeEi", + "FN:87,_ZN8facebook5react12NativeFantom17getRenderedOutputB5cxx11ERNS_3jsi7RuntimeEiNS0_31NativeFantomRenderFormatOptionsIbbEE", + "FN:98,_ZN8facebook5react12NativeFantom26reportTestSuiteResultsJSONERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FN:104,_ZN8facebook5react12NativeFantom26getDirectManipulationPropsERNS_3jsi7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEE", + "FN:112,_ZN8facebook5react12NativeFantom20getFabricUpdatePropsERNS_3jsi7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEE", + "FN:124,_ZN8facebook5react12NativeFantom18enqueueNativeEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESH_INS0_8RawEvent8CategoryEESH_IbE", + "FN:139,_ZN8facebook5react12NativeFantom18enqueueScrollEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEE", + "FN:183,_ZN8facebook5react12NativeFantom22enqueueModalSizeUpdateERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdd", + "FN:203,_ZN8facebook5react12NativeFantom32createShadowNodeReferenceCounterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEE", + "FN:217,_ZN8facebook5react12NativeFantom30createShadowNodeRevisionGetterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEE", + "FN:249,_ZN8facebook5react12NativeFantom24saveJSMemoryHeapSnapshotERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FN:271,_ZN8facebook5react12NativeFantom21forceHighResTimeStampERNS_3jsi7RuntimeESt8optionalINS0_16HighResTimeStampEE", + "FN:280,_ZN8facebook5react12NativeFantom23startJSSamplingProfilerERNS_3jsi7RuntimeE", + "FN:288,_ZN8facebook5react12NativeFantom35stopJSSamplingProfilerAndSaveToFileERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FN:300,_ZN8facebook5react12NativeFantom16setImageResponseERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalISA_ESF_EE", + "FN:311,_ZN8facebook5react12NativeFantom10clearImageERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FN:315,_ZN8facebook5react12NativeFantom14clearAllImagesERNS_3jsi7RuntimeE", + "FN:171,NativeFantom.cpp:_ZZN8facebook5react12NativeFantom18enqueueScrollEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEENK3$_0clERKNS0_15ScrollViewStateE", + "FN:212,NativeFantom.cpp:_ZZN8facebook5react12NativeFantom32createShadowNodeReferenceCounterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEENK3$_1clES4_RKNS2_5ValueEPSB_m", + "FN:227,NativeFantom.cpp:_ZZN8facebook5react12NativeFantom30createShadowNodeRevisionGetterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEENK3$_2clES4_RKNS2_5ValueEPSB_m", + "FNDA:1,_ZN8facebook5react12NativeFantomC2ERNS0_17TesterAppDelegateESt10shared_ptrINS0_11CallInvokerEE", + "FNDA:30,_ZN8facebook5react12NativeFantom12startSurfaceERNS_3jsi7RuntimeEddddd", + "FNDA:0,_ZN8facebook5react12NativeFantom11stopSurfaceERNS_3jsi7RuntimeEi", + "FNDA:0,_ZN8facebook5react12NativeFantom24produceFramesForDurationERNS_3jsi7RuntimeEd", + "FNDA:33,_ZN8facebook5react12NativeFantom17flushMessageQueueERNS_3jsi7RuntimeE", + "FNDA:0,_ZN8facebook5react12NativeFantom15flushEventQueueERNS_3jsi7RuntimeE", + "FNDA:30,_ZN8facebook5react12NativeFantom25validateEmptyMessageQueueERNS_3jsi7RuntimeE", + "FNDA:0,_ZN8facebook5react12NativeFantom23takeMountingManagerLogsB5cxx11ERNS_3jsi7RuntimeEi", + "FNDA:27,_ZN8facebook5react12NativeFantom17getRenderedOutputB5cxx11ERNS_3jsi7RuntimeEiNS0_31NativeFantomRenderFormatOptionsIbbEE", + "FNDA:1,_ZN8facebook5react12NativeFantom26reportTestSuiteResultsJSONERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FNDA:0,_ZN8facebook5react12NativeFantom26getDirectManipulationPropsERNS_3jsi7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEE", + "FNDA:0,_ZN8facebook5react12NativeFantom20getFabricUpdatePropsERNS_3jsi7RuntimeERKSt10shared_ptrIKNS0_10ShadowNodeEE", + "FNDA:0,_ZN8facebook5react12NativeFantom18enqueueNativeEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8optionalIN5folly7dynamicEESH_INS0_8RawEvent8CategoryEESH_IbE", + "FNDA:0,_ZN8facebook5react12NativeFantom18enqueueScrollEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEE", + "FNDA:0,_ZN8facebook5react12NativeFantom22enqueueModalSizeUpdateERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEdd", + "FNDA:0,_ZN8facebook5react12NativeFantom32createShadowNodeReferenceCounterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEE", + "FNDA:0,_ZN8facebook5react12NativeFantom30createShadowNodeRevisionGetterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEE", + "FNDA:0,_ZN8facebook5react12NativeFantom24saveJSMemoryHeapSnapshotERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FNDA:0,_ZN8facebook5react12NativeFantom21forceHighResTimeStampERNS_3jsi7RuntimeESt8optionalINS0_16HighResTimeStampEE", + "FNDA:0,_ZN8facebook5react12NativeFantom23startJSSamplingProfilerERNS_3jsi7RuntimeE", + "FNDA:0,_ZN8facebook5react12NativeFantom35stopJSSamplingProfilerAndSaveToFileERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FNDA:0,_ZN8facebook5react12NativeFantom16setImageResponseERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS0_25NativeFantomImageResponseIffSt8optionalISA_ESF_EE", + "FNDA:0,_ZN8facebook5react12NativeFantom10clearImageERNS_3jsi7RuntimeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "FNDA:0,_ZN8facebook5react12NativeFantom14clearAllImagesERNS_3jsi7RuntimeE", + "FNDA:0,NativeFantom.cpp:_ZZN8facebook5react12NativeFantom18enqueueScrollEventERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEENS0_25NativeFantomScrollOptionsIffSt8optionalIfEEEENK3$_0clERKNS0_15ScrollViewStateE", + "FNDA:0,NativeFantom.cpp:_ZZN8facebook5react12NativeFantom32createShadowNodeReferenceCounterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEENK3$_1clES4_RKNS2_5ValueEPSB_m", + "FNDA:0,NativeFantom.cpp:_ZZN8facebook5react12NativeFantom30createShadowNodeRevisionGetterERNS_3jsi7RuntimeESt10shared_ptrIKNS0_10ShadowNodeEEENK3$_2clES4_RKNS2_5ValueEPSB_m", + "FNF:27", + "FNH:6", + "DA:32,1", + "DA:40,30", + "DA:41,30", + "DA:42,30", + "DA:43,30", + "DA:44,30", + "DA:45,30", + "DA:46,30", + "DA:47,30", + "DA:48,30", + "DA:49,30", + "DA:50,30", + "DA:51,30", + "DA:52,30", + "DA:54,0", + "DA:55,0", + "DA:56,0", + "DA:60,0", + "DA:61,0", + "DA:62,0", + "DA:64,33", + "DA:65,33", + "DA:66,33", + "DA:68,0", + "DA:69,0", + "DA:70,0", + "DA:72,30", + "DA:73,30", + "DA:74,0", + "DA:75,0", + "DA:76,30", + "DA:80,0", + "DA:81,0", + "DA:82,0", + "DA:87,27", + "DA:88,27", + "DA:89,27", + "DA:91,27", + "DA:92,27", + "DA:93,27", + "DA:94,27", + "DA:98,1", + "DA:99,1", + "DA:100,1", + "DA:104,0", + "DA:105,0", + "DA:106,0", + "DA:107,0", + "DA:108,0", + "DA:112,0", + "DA:113,0", + "DA:114,0", + "DA:115,0", + "DA:116,0", + "DA:124,0", + "DA:125,0", + "DA:126,0", + "DA:127,0", + "DA:128,0", + "DA:129,0", + "DA:130,0", + "DA:131,0", + "DA:132,0", + "DA:133,0", + "DA:134,0", + "DA:139,0", + "DA:140,0", + "DA:141,0", + "DA:143,0", + "DA:144,0", + "DA:145,0", + "DA:146,0", + "DA:148,0", + "DA:149,0", + "DA:150,0", + "DA:151,0", + "DA:153,0", + "DA:155,0", + "DA:156,0", + "DA:157,0", + "DA:158,0", + "DA:159,0", + "DA:160,0", + "DA:161,0", + "DA:162,0", + "DA:164,0", + "DA:166,0", + "DA:167,0", + "DA:168,0", + "DA:169,0", + "DA:170,0", + "DA:171,0", + "DA:172,0", + "DA:173,0", + "DA:174,0", + "DA:175,0", + "DA:176,0", + "DA:177,0", + "DA:183,0", + "DA:184,0", + "DA:185,0", + "DA:187,0", + "DA:188,0", + "DA:189,0", + "DA:190,0", + "DA:192,0", + "DA:193,0", + "DA:194,0", + "DA:196,0", + "DA:197,0", + "DA:198,0", + "DA:199,0", + "DA:203,0", + "DA:204,0", + "DA:206,0", + "DA:207,0", + "DA:208,0", + "DA:209,0", + "DA:210,0", + "DA:211,0", + "DA:212,0", + "DA:213,0", + "DA:217,0", + "DA:218,0", + "DA:219,0", + "DA:221,0", + "DA:222,0", + "DA:223,0", + "DA:224,0", + "DA:225,0", + "DA:226,0", + "DA:227,0", + "DA:228,0", + "DA:229,0", + "DA:230,0", + "DA:232,0", + "DA:233,0", + "DA:234,0", + "DA:235,0", + "DA:236,0", + "DA:237,0", + "DA:238,0", + "DA:245,0", + "DA:249,0", + "DA:250,0", + "DA:251,0", + "DA:252,0", + "DA:271,0", + "DA:272,0", + "DA:273,0", + "DA:274,0", + "DA:280,0", + "DA:281,0", + "DA:282,0", + "DA:283,0", + "DA:284,0", + "DA:288,0", + "DA:289,0", + "DA:290,0", + "DA:291,0", + "DA:292,0", + "DA:293,0", + "DA:294,0", + "DA:295,0", + "DA:300,0", + "DA:301,0", + "DA:302,0", + "DA:303,0", + "DA:304,0", + "DA:305,0", + "DA:306,0", + "DA:307,0", + "DA:308,0", + "DA:309,0", + "DA:311,0", + "DA:312,0", + "DA:313,0", + "DA:315,0", + "DA:316,0", + "DA:317,0", + "BRDA:73,0,0,0", + "BRDA:73,0,1,30", + "BRDA:125,0,0,-", + "BRDA:125,0,1,-", + "BRDA:143,0,0,-", + "BRDA:143,0,1,-", + "BRDA:187,0,0,-", + "BRDA:187,0,1,-", + "BRDA:228,0,0,-", + "BRDA:228,0,1,-", + "BRF:10", + "BRH:1", + "LF:198", + "LH:30", + "end_of_record" +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.source b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.source new file mode 100644 index 00000000000..5b677922876 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.cpp.source @@ -0,0 +1,319 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "NativeFantom.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "TesterAppDelegate.h" + +#include +#include "render/RenderFormatOptions.h" +#include "render/RenderOutput.h" + +namespace facebook::react { + +NativeFantom::NativeFantom( + TesterAppDelegate& appDelegate, + std::shared_ptr jsInvoker) + : NativeFantomCxxSpec(std::move(jsInvoker)), + appDelegate_(appDelegate) {} + +SurfaceId NativeFantom::startSurface( + jsi::Runtime& runtime, + double viewportWidth, + double viewportHeight, + double devicePixelRatio, + double viewportOffsetX, + double viewportOffsetY) { + SurfaceId surfaceId = nextSurfaceId_; + nextSurfaceId_ += 10; + appDelegate_.startSurface( + runtime, + static_cast(viewportWidth), + static_cast(viewportHeight), + surfaceId, + static_cast(devicePixelRatio), + static_cast(viewportOffsetX), + static_cast(viewportOffsetY)); + return surfaceId; +} + +void NativeFantom::stopSurface(jsi::Runtime& /*runtime*/, SurfaceId surfaceId) { + appDelegate_.stopSurface(surfaceId); +} + +void NativeFantom::produceFramesForDuration( + jsi::Runtime& /*runtime*/, + double milliseconds) { + appDelegate_.produceFramesForDuration(milliseconds); +} + +void NativeFantom::flushMessageQueue(jsi::Runtime& /*runtime*/) { + appDelegate_.flushMessageQueue(); +} + +void NativeFantom::flushEventQueue(jsi::Runtime& /*runtime*/) { + appDelegate_.onRender(); +} + +void NativeFantom::validateEmptyMessageQueue(jsi::Runtime& /*runtime*/) { + if (appDelegate_.hasPendingTasksInMessageQueue()) { + throw std::runtime_error("MessageQueue is not empty"); + } +} + +std::vector NativeFantom::takeMountingManagerLogs( + jsi::Runtime& /*runtime*/, + SurfaceId surfaceId) { + return appDelegate_.mountingManager_->takeMountingLogs(surfaceId); +} + +std::string NativeFantom::getRenderedOutput( + jsi::Runtime& /*runtime*/, + SurfaceId surfaceId, + NativeFantomGetRenderedOutputRenderFormatOptions options) { + RenderFormatOptions formatOptions{ + options.includeRoot, options.includeLayoutMetrics}; + + auto viewTree = appDelegate_.mountingManager_->getViewTree(surfaceId); + return appDelegate_.mountingManager_->renderer()->render( + viewTree, formatOptions); +} + +void NativeFantom::reportTestSuiteResultsJSON( + jsi::Runtime& /*runtime*/, + const std::string& testSuiteResultsJSON) { + std::cout << testSuiteResultsJSON << std::endl; +} + +jsi::Object NativeFantom::getDirectManipulationProps( + jsi::Runtime& runtime, + const std::shared_ptr& shadowNode) { + auto props = appDelegate_.mountingManager_->getViewDirectManipulationProps( + shadowNode->getTag()); + return facebook::jsi::valueFromDynamic(runtime, props).asObject(runtime); +} + +jsi::Object NativeFantom::getFabricUpdateProps( + jsi::Runtime& runtime, + const std::shared_ptr& shadowNode) { + auto props = appDelegate_.mountingManager_->getViewFabricUpdateProps( + shadowNode->getTag()); + return facebook::jsi::valueFromDynamic(runtime, props).asObject(runtime); +} + +void NativeFantom::enqueueNativeEvent( + jsi::Runtime& /*runtime*/, + std::shared_ptr shadowNode, + const std::string& type, + const std::optional& payload, + std::optional category, + std::optional isUnique) { + if (isUnique.value_or(false)) { + shadowNode->getEventEmitter()->dispatchUniqueEvent( + std::move(type), payload.value_or(folly::dynamic::object())); + } else { + shadowNode->getEventEmitter()->dispatchEvent( + std::move(type), + payload.value_or(folly::dynamic::object()), + category.value_or(RawEvent::Category::Unspecified)); + } +} + +void NativeFantom::enqueueScrollEvent( + jsi::Runtime& /*runtime*/, + std::shared_ptr shadowNode, + ScrollOptions options) { + const auto* scrollViewShadowNode = + dynamic_cast(&*shadowNode); + + if (scrollViewShadowNode == nullptr) { + throw std::runtime_error( + "enqueueScrollEvent() can only be called on "); + } + + auto point = Point{ + .x = options.x, + .y = options.y, + }; + + auto scrollEvent = ScrollEvent(); + + scrollEvent.contentOffset = point; + scrollEvent.contentSize = + scrollViewShadowNode->getStateData().getContentSize(); + scrollEvent.containerSize = + scrollViewShadowNode->getLayoutMetrics().frame.size; + scrollEvent.contentInset = + scrollViewShadowNode->getConcreteProps().contentInset; + scrollEvent.zoomScale = options.zoomScale.value_or(scrollEvent.zoomScale); + + scrollViewShadowNode->getConcreteEventEmitter().onScroll(scrollEvent); + + auto state = + std::static_pointer_cast( + scrollViewShadowNode->getState()); + state->updateState( + [point](const ScrollViewShadowNode::ConcreteState::Data& oldData) + -> ScrollViewShadowNode::ConcreteState::SharedData { + auto newData = oldData; + newData.contentOffset = point; + return std::make_shared< + const ScrollViewShadowNode::ConcreteState::Data>(newData); + }); +} + +void NativeFantom::enqueueModalSizeUpdate( + jsi::Runtime& /*runtime*/, + std::shared_ptr shadowNode, + double width, + double height) { + const auto* modalHostViewShadowNode = + dynamic_cast(&*shadowNode); + + if (modalHostViewShadowNode == nullptr) { + throw std::runtime_error( + "enqueueModalSizeUpdate() can only be called on "); + } + + auto state = + std::static_pointer_cast( + modalHostViewShadowNode->getState()); + + state->updateState(ModalHostViewState( + {.width = static_cast(width), + .height = static_cast(height)})); +} + +jsi::Function NativeFantom::createShadowNodeReferenceCounter( + jsi::Runtime& runtime, + std::shared_ptr shadowNode) { + auto weakShadowNode = std::weak_ptr(shadowNode); + + return jsi::Function::createFromHostFunction( + runtime, + jsi::PropNameID::forAscii(runtime, "getReferenceCount"), + 0, + [weakShadowNode]( + jsi::Runtime&, const jsi::Value&, const jsi::Value*, size_t) + -> jsi::Value { return {(int)weakShadowNode.use_count()}; }); +} + +jsi::Function NativeFantom::createShadowNodeRevisionGetter( + jsi::Runtime& runtime, + std::shared_ptr shadowNode) { +#if RN_DEBUG_STRING_CONVERTIBLE + auto weakShadowNode = std::weak_ptr(shadowNode); + + return jsi::Function::createFromHostFunction( + runtime, + jsi::PropNameID::forAscii(runtime, "getRevision"), + 0, + [weakShadowNode]( + jsi::Runtime& runtime, const jsi::Value&, const jsi::Value*, size_t) + -> jsi::Value { + if (auto strongShadowNode = weakShadowNode.lock()) { + const auto& uiManager = + UIManagerBinding::getBinding(runtime)->getUIManager(); + + const auto& currentRevision = + *uiManager.getNewestCloneOfShadowNode(*strongShadowNode); + return currentRevision.revision_; + } else { + return jsi::Value::null(); + } + }); +#else + // TODO(T225400348): Remove this when revision_ is available in optimised + // builds. + throw std::runtime_error( + "createShadowNodeRevisionGetter() is only available in debug builds"); +#endif +} + +void NativeFantom::saveJSMemoryHeapSnapshot( + jsi::Runtime& runtime, + const std::string& filePath) { + runtime.instrumentation().collectGarbage("heapsnapshot"); + runtime.instrumentation().createSnapshotToFile(filePath); +} + +#ifdef REACT_NATIVE_DEBUG + +void NativeFantom::forceHighResTimeStamp( + jsi::Runtime& /*runtime*/, + std::optional now) { + if (now) { + HighResTimeStamp::setTimeStampProviderForTesting( + [now] { return now->toChronoSteadyClockTimePoint(); }); + } else { + HighResTimeStamp::setTimeStampProviderForTesting(nullptr); + } +} + +#else + +void NativeFantom::forceHighResTimeStamp( + jsi::Runtime& runtime, + std::optional /*now*/) { + throw jsi::JSError( + runtime, "Mocking timers is not supported in optimized builds"); +} + +#endif + +const int JS_SAMPLING_PROFILER_HZ = 10000; + +void NativeFantom::startJSSamplingProfiler(jsi::Runtime& /*runtime*/) { + auto* hermesRootAPI = + jsi::castInterface(hermes::makeHermesRootAPI()); + hermesRootAPI->enableSamplingProfiler(JS_SAMPLING_PROFILER_HZ); +} + +void NativeFantom::stopJSSamplingProfilerAndSaveToFile( + jsi::Runtime& runtime, + const std::string& filePath) { + auto* hermesRootAPI = + jsi::castInterface(hermes::makeHermesRootAPI()); + hermesRootAPI->disableSamplingProfiler(); + std::ofstream fileStream(filePath); + auto* hermesRuntime = dynamic_cast(&runtime); + hermesRuntime->sampledTraceToStreamInDevToolsFormat(fileStream); +} + +void NativeFantom::setImageResponse( + jsi::Runtime& /*rt*/, + const std::string& uri, + const NativeFantomSetImageResponseImageResponse& imageResponse) { + appDelegate_.mountingManager_->imageLoader_->setImageResponse( + uri, + { + .width = imageResponse.width, + .height = imageResponse.height, + .cacheStatus = imageResponse.cacheStatus, + .errorMessage = imageResponse.errorMessage, + }); +} + +void NativeFantom::clearImage(jsi::Runtime& /*rt*/, const std::string& uri) { + appDelegate_.mountingManager_->imageLoader_->clearImage(uri); +} + +void NativeFantom::clearAllImages(jsi::Runtime& /*rt*/) { + appDelegate_.mountingManager_->imageLoader_->clearAllImages(); +} + +} // namespace facebook::react diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.functions.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.functions.json new file mode 100644 index 00000000000..c61d9ba87fb --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.functions.json @@ -0,0 +1,407 @@ +[{ + "branches": [ + [ + 39, + 9, + 39, + 19, + 0, + 0, + 0, + 0, + 4 + ], + [ + 41, + 16, + 41, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 43, + 16, + 43, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 45, + 16, + 45, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 47, + 16, + 47, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 49, + 16, + 49, + 26, + 0, + 0, + 0, + 0, + 4 + ] + ], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.h" + ], + "name": "_ZN8facebook5react8BridgingINS0_8RawEvent8CategoryEvE6fromJsERNS_3jsi7RuntimeENS5_5ValueE", + "regions": [ + [ + 37, + 3, + 54, + 4, + 0, + 0, + 0, + 0 + ], + [ + 39, + 9, + 39, + 19, + 0, + 0, + 0, + 0 + ], + [ + 39, + 20, + 39, + 21, + 0, + 0, + 0, + 3 + ], + [ + 39, + 21, + 41, + 6, + 0, + 0, + 0, + 0 + ], + [ + 41, + 6, + 41, + 12, + 0, + 0, + 0, + 3 + ], + [ + 41, + 12, + 53, + 6, + 0, + 0, + 0, + 0 + ], + [ + 41, + 16, + 41, + 26, + 0, + 0, + 0, + 0 + ], + [ + 41, + 27, + 41, + 28, + 0, + 0, + 0, + 3 + ], + [ + 41, + 28, + 43, + 6, + 0, + 0, + 0, + 0 + ], + [ + 43, + 6, + 43, + 12, + 0, + 0, + 0, + 3 + ], + [ + 43, + 12, + 53, + 6, + 0, + 0, + 0, + 0 + ], + [ + 43, + 16, + 43, + 26, + 0, + 0, + 0, + 0 + ], + [ + 43, + 27, + 43, + 28, + 0, + 0, + 0, + 3 + ], + [ + 43, + 28, + 45, + 6, + 0, + 0, + 0, + 0 + ], + [ + 45, + 6, + 45, + 12, + 0, + 0, + 0, + 3 + ], + [ + 45, + 12, + 53, + 6, + 0, + 0, + 0, + 0 + ], + [ + 45, + 16, + 45, + 26, + 0, + 0, + 0, + 0 + ], + [ + 45, + 27, + 45, + 28, + 0, + 0, + 0, + 3 + ], + [ + 45, + 28, + 47, + 6, + 0, + 0, + 0, + 0 + ], + [ + 47, + 6, + 47, + 12, + 0, + 0, + 0, + 3 + ], + [ + 47, + 12, + 53, + 6, + 0, + 0, + 0, + 0 + ], + [ + 47, + 16, + 47, + 26, + 0, + 0, + 0, + 0 + ], + [ + 47, + 27, + 47, + 28, + 0, + 0, + 0, + 3 + ], + [ + 47, + 28, + 49, + 6, + 0, + 0, + 0, + 0 + ], + [ + 49, + 6, + 49, + 12, + 0, + 0, + 0, + 3 + ], + [ + 49, + 12, + 53, + 6, + 0, + 0, + 0, + 0 + ], + [ + 49, + 16, + 49, + 26, + 0, + 0, + 0, + 0 + ], + [ + 49, + 27, + 49, + 28, + 0, + 0, + 0, + 3 + ], + [ + 49, + 28, + 51, + 6, + 0, + 0, + 0, + 0 + ], + [ + 51, + 6, + 51, + 12, + 0, + 0, + 0, + 3 + ], + [ + 51, + 12, + 53, + 6, + 0, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "private/react-native-fantom/tester/src/NativeFantom.h" + ], + "name": "_ZN8facebook5react8BridgingINS0_8RawEvent8CategoryEvE4toJsERNS_3jsi7RuntimeES3_", + "regions": [ + [ + 57, + 3, + 59, + 4, + 0, + 0, + 0, + 0 + ] + ] +}] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.json new file mode 100644 index 00000000000..b27943aa268 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.json @@ -0,0 +1,383 @@ +{ + "branches": [ + [ + 39, + 9, + 39, + 19, + 0, + 0, + 0, + 0, + 4 + ], + [ + 41, + 16, + 41, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 43, + 16, + 43, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 45, + 16, + 45, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 47, + 16, + 47, + 26, + 0, + 0, + 0, + 0, + 4 + ], + [ + 49, + 16, + 49, + 26, + 0, + 0, + 0, + 0, + 4 + ] + ], + "expansions": [], + "filename": "private/react-native-fantom/tester/src/NativeFantom.h", + "segments": [ + [ + 37, + 3, + 0, + true, + true, + false + ], + [ + 39, + 9, + 0, + true, + true, + false + ], + [ + 39, + 19, + 0, + true, + false, + false + ], + [ + 39, + 21, + 0, + true, + true, + false + ], + [ + 41, + 6, + 0, + true, + false, + true + ], + [ + 41, + 12, + 0, + true, + true, + false + ], + [ + 41, + 16, + 0, + true, + true, + false + ], + [ + 41, + 26, + 0, + true, + false, + false + ], + [ + 41, + 28, + 0, + true, + true, + false + ], + [ + 43, + 6, + 0, + true, + false, + true + ], + [ + 43, + 12, + 0, + true, + true, + false + ], + [ + 43, + 16, + 0, + true, + true, + false + ], + [ + 43, + 26, + 0, + true, + false, + false + ], + [ + 43, + 28, + 0, + true, + true, + false + ], + [ + 45, + 6, + 0, + true, + false, + true + ], + [ + 45, + 12, + 0, + true, + true, + false + ], + [ + 45, + 16, + 0, + true, + true, + false + ], + [ + 45, + 26, + 0, + true, + false, + false + ], + [ + 45, + 28, + 0, + true, + true, + false + ], + [ + 47, + 6, + 0, + true, + false, + true + ], + [ + 47, + 12, + 0, + true, + true, + false + ], + [ + 47, + 16, + 0, + true, + true, + false + ], + [ + 47, + 26, + 0, + true, + false, + false + ], + [ + 47, + 28, + 0, + true, + true, + false + ], + [ + 49, + 6, + 0, + true, + false, + true + ], + [ + 49, + 12, + 0, + true, + true, + false + ], + [ + 49, + 16, + 0, + true, + true, + false + ], + [ + 49, + 26, + 0, + true, + false, + false + ], + [ + 49, + 28, + 0, + true, + true, + false + ], + [ + 51, + 6, + 0, + true, + false, + true + ], + [ + 51, + 12, + 0, + true, + true, + false + ], + [ + 53, + 6, + 0, + true, + false, + false + ], + [ + 54, + 4, + 0, + false, + false, + false + ], + [ + 57, + 3, + 0, + true, + true, + false + ], + [ + 59, + 4, + 0, + false, + false, + false + ] + ], + "summary": { + "branches": { + "count": 12, + "covered": 0, + "notcovered": 12, + "percent": 0 + }, + "functions": { + "count": 2, + "covered": 0, + "percent": 0 + }, + "instantiations": { + "count": 2, + "covered": 0, + "percent": 0 + }, + "lines": { + "count": 21, + "covered": 0, + "percent": 0 + }, + "regions": { + "count": 20, + "covered": 0, + "notcovered": 20, + "percent": 0 + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.lcov.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.lcov.json new file mode 100644 index 00000000000..254b32c5b74 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.lcov.json @@ -0,0 +1,47 @@ +[ + "SF:private/react-native-fantom/tester/src/NativeFantom.h", + "FN:37,_ZN8facebook5react8BridgingINS0_8RawEvent8CategoryEvE6fromJsERNS_3jsi7RuntimeENS5_5ValueE", + "FN:57,_ZN8facebook5react8BridgingINS0_8RawEvent8CategoryEvE4toJsERNS_3jsi7RuntimeES3_", + "FNDA:0,_ZN8facebook5react8BridgingINS0_8RawEvent8CategoryEvE6fromJsERNS_3jsi7RuntimeENS5_5ValueE", + "FNDA:0,_ZN8facebook5react8BridgingINS0_8RawEvent8CategoryEvE4toJsERNS_3jsi7RuntimeES3_", + "FNF:2", + "FNH:0", + "DA:37,0", + "DA:38,0", + "DA:39,0", + "DA:40,0", + "DA:41,0", + "DA:42,0", + "DA:43,0", + "DA:44,0", + "DA:45,0", + "DA:46,0", + "DA:47,0", + "DA:48,0", + "DA:49,0", + "DA:50,0", + "DA:51,0", + "DA:52,0", + "DA:53,0", + "DA:54,0", + "DA:57,0", + "DA:58,0", + "DA:59,0", + "BRDA:39,0,0,-", + "BRDA:39,0,1,-", + "BRDA:41,0,0,-", + "BRDA:41,0,1,-", + "BRDA:43,0,0,-", + "BRDA:43,0,1,-", + "BRDA:45,0,0,-", + "BRDA:45,0,1,-", + "BRDA:47,0,0,-", + "BRDA:47,0,1,-", + "BRDA:49,0,0,-", + "BRDA:49,0,1,-", + "BRF:12", + "BRH:0", + "LF:21", + "LH:0", + "end_of_record" +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.source b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.source new file mode 100644 index 00000000000..2c0a19a20fb --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/NativeFantom.h.source @@ -0,0 +1,149 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +class TesterAppDelegate; + +using NativeFantomGetRenderedOutputRenderFormatOptions = NativeFantomRenderFormatOptions< + // includeRoot + bool, + // includeLayoutMetrics + bool>; + +template <> +struct Bridging + : NativeFantomRenderFormatOptionsBridging {}; + +template <> +struct Bridging { + static RawEvent::Category fromJs(jsi::Runtime &rt, jsi::Value rawValue) + { + auto value = static_cast(rawValue.asNumber()); + if (value == 0) { + return RawEvent::Category::ContinuousStart; + } else if (value == 1) { + return RawEvent::Category::ContinuousEnd; + } else if (value == 2) { + return RawEvent::Category::Unspecified; + } else if (value == 3) { + return RawEvent::Category::Discrete; + } else if (value == 4) { + return RawEvent::Category::Continuous; + } else if (value == 5) { + return RawEvent::Category::Idle; + } else { + throw jsi::JSError(rt, "Invalid enum value"); + } + } + + static jsi::Value toJs(jsi::Runtime &rt, RawEvent::Category value) + { + return bridging::toJs(rt, static_cast(value)); + } +}; + +using ScrollOptions = NativeFantomScrollOptions>; + +template <> +struct Bridging : NativeFantomScrollOptionsBridging {}; + +using NativeFantomSetImageResponseImageResponse = NativeFantomImageResponse< + Float, // width + Float, // height + std::optional, // cacheStatus + std::optional>; // errorMessage +template <> +struct Bridging + : NativeFantomImageResponseBridging {}; + +class NativeFantom : public NativeFantomCxxSpec { + public: + NativeFantom(TesterAppDelegate &appDelegate, std::shared_ptr jsInvoker); + + SurfaceId startSurface( + jsi::Runtime &runtime, + double viewportWidth, + double viewportHeight, + double devicePixelRatio, + double viewportOffsetX, + double viewportOffsetY); + + void stopSurface(jsi::Runtime &runtime, SurfaceId surfaceId); + + void produceFramesForDuration(jsi::Runtime &runtime, double milliseconds); + + void flushMessageQueue(jsi::Runtime &runtime); + void flushEventQueue(jsi::Runtime &runtime); + void validateEmptyMessageQueue(jsi::Runtime &runtime); + + std::vector takeMountingManagerLogs(jsi::Runtime &runtime, SurfaceId surfaceId); + + std::string getRenderedOutput( + jsi::Runtime &runtime, + SurfaceId surfaceId, + NativeFantomGetRenderedOutputRenderFormatOptions options); + + void reportTestSuiteResultsJSON(jsi::Runtime &runtime, const std::string &testSuiteResultsJSON); + + void enqueueNativeEvent( + jsi::Runtime &runtime, + std::shared_ptr shadowNode, + const std::string &type, + const std::optional &payload, + std::optional category, + std::optional isUnique); + + void enqueueScrollEvent(jsi::Runtime &runtime, std::shared_ptr shadowNode, ScrollOptions options); + + jsi::Object getDirectManipulationProps(jsi::Runtime &runtime, const std::shared_ptr &shadowNode); + + jsi::Object getFabricUpdateProps(jsi::Runtime &runtime, const std::shared_ptr &shadowNode); + + void enqueueModalSizeUpdate( + jsi::Runtime &runtime, + std::shared_ptr shadowNode, + double width, + double height); + + jsi::Function createShadowNodeReferenceCounter(jsi::Runtime &runtime, std::shared_ptr shadowNode); + + jsi::Function createShadowNodeRevisionGetter(jsi::Runtime &runtime, std::shared_ptr shadowNode); + + void saveJSMemoryHeapSnapshot(jsi::Runtime &runtime, const std::string &filePath); + + void forceHighResTimeStamp(jsi::Runtime &runtime, std::optional now); + + void startJSSamplingProfiler(jsi::Runtime &runtime); + + void stopJSSamplingProfilerAndSaveToFile(jsi::Runtime &runtime, const std::string &filePath); + + void setImageResponse( + jsi::Runtime &rt, + const std::string &uri, + const NativeFantomSetImageResponseImageResponse &imageResponse); + void clearImage(jsi::Runtime &rt, const std::string &uri); + void clearAllImages(jsi::Runtime &rt); + + private: + TesterAppDelegate &appDelegate_; + SurfaceId nextSurfaceId_ = 1; +}; + +} // namespace facebook::react diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.functions.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.functions.json new file mode 100644 index 00000000000..b03723ac51b --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.functions.json @@ -0,0 +1,475 @@ +[{ + "branches": [ + [ + 24, + 7, + 24, + 24, + 300, + 1123, + 0, + 0, + 4 + ], + [ + 37, + 7, + 37, + 24, + 300, + 1123, + 0, + 0, + 4 + ] + ], + "count": 1423, + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp", + "packages/react-native/ReactCommon/react/debug/__debug__/ac8ab4a6d0b5d5e4/buck-headers/react/debug/react_native_assert.h" + ], + "name": "_ZNK8facebook5react11RawPropsKey6renderEPcPt", + "regions": [ + [ + 20, + 20, + 44, + 2, + 1423, + 0, + 0, + 0 + ], + [ + 22, + 1, + 23, + 12, + 0, + 0, + 0, + 2 + ], + [ + 24, + 7, + 24, + 24, + 1423, + 0, + 0, + 0 + ], + [ + 24, + 25, + 24, + 26, + 300, + 0, + 0, + 3 + ], + [ + 24, + 26, + 29, + 4, + 300, + 0, + 0, + 0 + ], + [ + 30, + 1, + 31, + 10, + 0, + 0, + 0, + 2 + ], + [ + 35, + 1, + 36, + 12, + 0, + 0, + 0, + 2 + ], + [ + 37, + 7, + 37, + 24, + 1423, + 0, + 0, + 0 + ], + [ + 37, + 25, + 37, + 26, + 300, + 0, + 0, + 3 + ], + [ + 37, + 26, + 42, + 4, + 300, + 0, + 0, + 0 + ], + [ + 43, + 3, + 43, + 22, + 1423, + 0, + 1, + 1 + ], + [ + 29, + 32, + 29, + 41, + 1423, + 1, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 0, + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp", + "packages/react-native/ReactCommon/react/debug/__debug__/ac8ab4a6d0b5d5e4/buck-headers/react/debug/react_native_assert.h" + ], + "name": "_ZNK8facebook5react11RawPropsKeycvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEv", + "regions": [ + [ + 46, + 52, + 52, + 2, + 0, + 0, + 0, + 0 + ], + [ + 50, + 3, + 50, + 22, + 0, + 0, + 1, + 1 + ], + [ + 29, + 32, + 29, + 41, + 0, + 1, + 0, + 0 + ] + ] +}, +{ + "branches": [ + [ + 63, + 10, + 63, + 44, + 7703, + 161966, + 0, + 0, + 4 + ], + [ + 64, + 7, + 64, + 45, + 7703, + 0, + 0, + 0, + 4 + ], + [ + 65, + 7, + 65, + 45, + 7529, + 174, + 0, + 0, + 4 + ] + ], + "count": 169669, + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp" + ], + "name": "_ZN8facebook5reacteqERKNS0_11RawPropsKeyES3_", + "regions": [ + [ + 61, + 74, + 66, + 2, + 169669, + 0, + 0, + 0 + ], + [ + 62, + 1, + 62, + 36, + 0, + 0, + 0, + 2 + ], + [ + 63, + 10, + 63, + 44, + 169669, + 0, + 0, + 0 + ], + [ + 63, + 10, + 64, + 45, + 169669, + 0, + 0, + 0 + ], + [ + 64, + 7, + 64, + 45, + 7703, + 0, + 0, + 0 + ], + [ + 65, + 7, + 65, + 45, + 7703, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [], + "count": 7525, + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp" + ], + "name": "_ZN8facebook5reactneERKNS0_11RawPropsKeyES3_", + "regions": [ + [ + 68, + 74, + 70, + 2, + 7525, + 0, + 0, + 0 + ] + ] +}, +{ + "branches": [ + [ + 55, + 7, + 55, + 21, + 11558, + 173517, + 0, + 0, + 4 + ], + [ + 55, + 25, + 55, + 39, + 0, + 173517, + 0, + 0, + 4 + ], + [ + 58, + 10, + 58, + 20, + 11377, + 162140, + 0, + 0, + 4 + ], + [ + 58, + 24, + 58, + 45, + 0, + 162140, + 0, + 0, + 4 + ] + ], + "count": 185075, + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp" + ], + "name": "RawPropsKey.cpp:_ZN8facebook5reactL14areFieldsEqualEPKcS2_", + "regions": [ + [ + 54, + 62, + 59, + 2, + 185075, + 0, + 0, + 0 + ], + [ + 55, + 7, + 55, + 21, + 185075, + 0, + 0, + 0 + ], + [ + 55, + 7, + 55, + 39, + 185075, + 0, + 0, + 0 + ], + [ + 55, + 25, + 55, + 39, + 173517, + 0, + 0, + 0 + ], + [ + 55, + 40, + 55, + 41, + 11558, + 0, + 0, + 3 + ], + [ + 55, + 41, + 57, + 4, + 11558, + 0, + 0, + 0 + ], + [ + 57, + 4, + 58, + 3, + 173517, + 0, + 0, + 3 + ], + [ + 58, + 3, + 58, + 45, + 173517, + 0, + 0, + 0 + ], + [ + 58, + 10, + 58, + 20, + 173517, + 0, + 0, + 0 + ], + [ + 58, + 24, + 58, + 45, + 162140, + 0, + 0, + 0 + ] + ] +} +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.json new file mode 100644 index 00000000000..95e56e20cdb --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.json @@ -0,0 +1,725 @@ +{ + "branches": [ + [ + 24, + 7, + 24, + 24, + 300, + 1123, + 0, + 0, + 4 + ], + [ + 37, + 7, + 37, + 24, + 300, + 1123, + 0, + 0, + 4 + ], + [ + 63, + 10, + 63, + 44, + 7703, + 161966, + 0, + 0, + 4 + ], + [ + 64, + 7, + 64, + 45, + 7703, + 0, + 0, + 0, + 4 + ], + [ + 65, + 7, + 65, + 45, + 7529, + 174, + 0, + 0, + 4 + ], + [ + 55, + 7, + 55, + 21, + 11558, + 173517, + 0, + 0, + 4 + ], + [ + 55, + 25, + 55, + 39, + 0, + 173517, + 0, + 0, + 4 + ], + [ + 58, + 10, + 58, + 20, + 11377, + 162140, + 0, + 0, + 4 + ], + [ + 58, + 24, + 58, + 45, + 0, + 162140, + 0, + 0, + 4 + ] + ], + "expansions": [ + { + "branches": [], + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp", + "packages/react-native/ReactCommon/react/debug/__debug__/ac8ab4a6d0b5d5e4/buck-headers/react/debug/react_native_assert.h" + ], + "source_region": [ + 43, + 3, + 43, + 22, + 1423, + 0, + 1, + 1 + ], + "target_regions": [ + [ + 20, + 20, + 44, + 2, + 1423, + 0, + 0, + 0 + ], + [ + 22, + 1, + 23, + 12, + 0, + 0, + 0, + 2 + ], + [ + 24, + 7, + 24, + 24, + 1423, + 0, + 0, + 0 + ], + [ + 24, + 25, + 24, + 26, + 300, + 0, + 0, + 3 + ], + [ + 24, + 26, + 29, + 4, + 300, + 0, + 0, + 0 + ], + [ + 30, + 1, + 31, + 10, + 0, + 0, + 0, + 2 + ], + [ + 35, + 1, + 36, + 12, + 0, + 0, + 0, + 2 + ], + [ + 37, + 7, + 37, + 24, + 1423, + 0, + 0, + 0 + ], + [ + 37, + 25, + 37, + 26, + 300, + 0, + 0, + 3 + ], + [ + 37, + 26, + 42, + 4, + 300, + 0, + 0, + 0 + ], + [ + 43, + 3, + 43, + 22, + 1423, + 0, + 1, + 1 + ], + [ + 29, + 32, + 29, + 41, + 1423, + 1, + 0, + 0 + ] + ] + }, + { + "branches": [], + "filenames": [ + "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp", + "packages/react-native/ReactCommon/react/debug/__debug__/ac8ab4a6d0b5d5e4/buck-headers/react/debug/react_native_assert.h" + ], + "source_region": [ + 50, + 3, + 50, + 22, + 0, + 0, + 1, + 1 + ], + "target_regions": [ + [ + 46, + 52, + 52, + 2, + 0, + 0, + 0, + 0 + ], + [ + 50, + 3, + 50, + 22, + 0, + 0, + 1, + 1 + ], + [ + 29, + 32, + 29, + 41, + 0, + 1, + 0, + 0 + ] + ] + } + ], + "filename": "packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp", + "segments": [ + [ + 20, + 20, + 1423, + true, + true, + false + ], + [ + 22, + 1, + 0, + false, + true, + false + ], + [ + 23, + 12, + 1423, + true, + false, + false + ], + [ + 24, + 7, + 1423, + true, + true, + false + ], + [ + 24, + 24, + 1423, + true, + false, + false + ], + [ + 24, + 25, + 300, + true, + false, + true + ], + [ + 24, + 26, + 300, + true, + true, + false + ], + [ + 29, + 4, + 1423, + true, + false, + false + ], + [ + 30, + 1, + 0, + false, + true, + false + ], + [ + 31, + 10, + 1423, + true, + false, + false + ], + [ + 35, + 1, + 0, + false, + true, + false + ], + [ + 36, + 12, + 1423, + true, + false, + false + ], + [ + 37, + 7, + 1423, + true, + true, + false + ], + [ + 37, + 24, + 1423, + true, + false, + false + ], + [ + 37, + 25, + 300, + true, + false, + true + ], + [ + 37, + 26, + 300, + true, + true, + false + ], + [ + 42, + 4, + 1423, + true, + false, + false + ], + [ + 43, + 3, + 1423, + true, + true, + false + ], + [ + 43, + 22, + 1423, + true, + false, + false + ], + [ + 44, + 2, + 0, + false, + false, + false + ], + [ + 46, + 52, + 0, + true, + true, + false + ], + [ + 50, + 3, + 0, + true, + true, + false + ], + [ + 50, + 22, + 0, + true, + false, + false + ], + [ + 52, + 2, + 0, + false, + false, + false + ], + [ + 54, + 62, + 185075, + true, + true, + false + ], + [ + 55, + 7, + 185075, + true, + true, + false + ], + [ + 55, + 21, + 185075, + true, + false, + false + ], + [ + 55, + 25, + 173517, + true, + true, + false + ], + [ + 55, + 39, + 185075, + true, + false, + false + ], + [ + 55, + 40, + 11558, + true, + false, + true + ], + [ + 55, + 41, + 11558, + true, + true, + false + ], + [ + 57, + 4, + 173517, + true, + false, + true + ], + [ + 58, + 3, + 173517, + true, + true, + false + ], + [ + 58, + 10, + 173517, + true, + true, + false + ], + [ + 58, + 20, + 173517, + true, + false, + false + ], + [ + 58, + 24, + 162140, + true, + true, + false + ], + [ + 58, + 45, + 185075, + true, + false, + false + ], + [ + 59, + 2, + 0, + false, + false, + false + ], + [ + 61, + 74, + 169669, + true, + true, + false + ], + [ + 62, + 1, + 0, + false, + true, + false + ], + [ + 62, + 36, + 169669, + true, + false, + false + ], + [ + 63, + 10, + 169669, + true, + true, + false + ], + [ + 63, + 44, + 169669, + true, + false, + false + ], + [ + 64, + 7, + 7703, + true, + true, + false + ], + [ + 64, + 45, + 169669, + true, + false, + false + ], + [ + 65, + 7, + 7703, + true, + true, + false + ], + [ + 65, + 45, + 169669, + true, + false, + false + ], + [ + 66, + 2, + 0, + false, + false, + false + ], + [ + 68, + 74, + 7525, + true, + true, + false + ], + [ + 70, + 2, + 0, + false, + false, + false + ] + ], + "summary": { + "branches": { + "count": 18, + "covered": 15, + "notcovered": 3, + "percent": 83.333333333333343 + }, + "functions": { + "count": 5, + "covered": 4, + "percent": 80 + }, + "instantiations": { + "count": 5, + "covered": 4, + "percent": 80 + }, + "lines": { + "count": 40, + "covered": 33, + "percent": 82.5 + }, + "regions": { + "count": 22, + "covered": 20, + "notcovered": 2, + "percent": 90.909090909090907 + } + } +} diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.lcov.json b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.lcov.json new file mode 100644 index 00000000000..e09e2693b7e --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.lcov.json @@ -0,0 +1,78 @@ +[ + "SF:packages/react-native/ReactCommon/react/renderer/core/RawPropsKey.cpp", + "FN:20,_ZNK8facebook5react11RawPropsKey6renderEPcPt", + "FN:46,_ZNK8facebook5react11RawPropsKeycvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEv", + "FN:61,_ZN8facebook5reacteqERKNS0_11RawPropsKeyES3_", + "FN:68,_ZN8facebook5reactneERKNS0_11RawPropsKeyES3_", + "FN:54,RawPropsKey.cpp:_ZN8facebook5reactL14areFieldsEqualEPKcS2_", + "FNDA:1423,_ZNK8facebook5react11RawPropsKey6renderEPcPt", + "FNDA:0,_ZNK8facebook5react11RawPropsKeycvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEv", + "FNDA:169669,_ZN8facebook5reacteqERKNS0_11RawPropsKeyES3_", + "FNDA:7525,_ZN8facebook5reactneERKNS0_11RawPropsKeyES3_", + "FNDA:185075,RawPropsKey.cpp:_ZN8facebook5reactL14areFieldsEqualEPKcS2_", + "FNF:5", + "FNH:4", + "DA:20,1423", + "DA:21,1423", + "DA:24,1423", + "DA:25,300", + "DA:26,300", + "DA:27,300", + "DA:28,300", + "DA:29,300", + "DA:32,1423", + "DA:33,1423", + "DA:34,1423", + "DA:37,1423", + "DA:38,300", + "DA:39,300", + "DA:40,300", + "DA:41,300", + "DA:42,300", + "DA:43,1423", + "DA:44,1423", + "DA:46,0", + "DA:47,0", + "DA:48,0", + "DA:49,0", + "DA:50,0", + "DA:51,0", + "DA:52,0", + "DA:54,185075", + "DA:55,185075", + "DA:56,11558", + "DA:57,11558", + "DA:58,173517", + "DA:59,185075", + "DA:61,169669", + "DA:63,169669", + "DA:64,169669", + "DA:65,169669", + "DA:66,169669", + "DA:68,7525", + "DA:69,7525", + "DA:70,7525", + "BRDA:24,0,0,300", + "BRDA:24,0,1,1123", + "BRDA:37,0,0,300", + "BRDA:37,0,1,1123", + "BRDA:55,0,0,11558", + "BRDA:55,0,1,173517", + "BRDA:55,1,2,0", + "BRDA:55,1,3,173517", + "BRDA:58,0,0,11377", + "BRDA:58,0,1,162140", + "BRDA:58,1,2,0", + "BRDA:58,1,3,162140", + "BRDA:63,0,0,7703", + "BRDA:63,0,1,161966", + "BRDA:64,0,0,7703", + "BRDA:64,0,1,0", + "BRDA:65,0,0,7529", + "BRDA:65,0,1,174", + "BRF:18", + "BRH:15", + "LF:40", + "LH:33", + "end_of_record" +] diff --git a/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.source b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.source new file mode 100644 index 00000000000..81ecb15e260 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__test_utils__/resources/RawPropsKey.cpp.source @@ -0,0 +1,72 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "RawPropsKey.h" + +#include +#include +#include + +#include +#include + +namespace facebook::react { + +void RawPropsKey::render(char* buffer, RawPropsPropNameLength* length) + const noexcept { + *length = 0; + + // Prefix + if (prefix != nullptr) { + auto prefixLength = + static_cast(std::strlen(prefix)); + std::memcpy(buffer, prefix, prefixLength); + *length = prefixLength; + } + + // Name + auto nameLength = static_cast(std::strlen(name)); + std::memcpy(buffer + *length, name, nameLength); + *length += nameLength; + + // Suffix + if (suffix != nullptr) { + auto suffixLength = + static_cast(std::strlen(suffix)); + std::memcpy(buffer + *length, suffix, suffixLength); + *length += suffixLength; + } + react_native_assert(*length < kPropNameLengthHardCap); +} + +RawPropsKey::operator std::string() const noexcept { + auto buffer = std::array(); + RawPropsPropNameLength length = 0; + render(buffer.data(), &length); + react_native_assert(length < kPropNameLengthHardCap); + return std::string{buffer.data(), length}; +} + +static bool areFieldsEqual(const char* lhs, const char* rhs) { + if (lhs == nullptr || rhs == nullptr) { + return lhs == rhs; + } + return lhs == rhs || strcmp(lhs, rhs) == 0; +} + +bool operator==(const RawPropsKey& lhs, const RawPropsKey& rhs) noexcept { + // Note: We check the name first. + return areFieldsEqual(lhs.name, rhs.name) && + areFieldsEqual(lhs.prefix, rhs.prefix) && + areFieldsEqual(lhs.suffix, rhs.suffix); +} + +bool operator!=(const RawPropsKey& lhs, const RawPropsKey& rhs) noexcept { + return !(lhs == rhs); +} + +} // namespace facebook::react diff --git a/private/react-native-fantom/runner/coverage/__tests__/FantomCoverage-test.js b/private/react-native-fantom/runner/coverage/__tests__/FantomCoverage-test.js new file mode 100644 index 00000000000..b9b604d3946 --- /dev/null +++ b/private/react-native-fantom/runner/coverage/__tests__/FantomCoverage-test.js @@ -0,0 +1,113 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + * @oncall react_native + */ + +import loadLLVMCoverage from '../__test_utils__/loadLLVMCoverage'; +import convertLLVMCoverage from '../convertLLVMCoverage'; +// $FlowExpectedError[untyped-import] +import {createFileCoverage} from 'istanbul-lib-coverage'; + +( + [ + 'AppSettings.cpp', + 'Class.h', + 'DevSettingsModule.h', + 'NativeFantom.h', + 'NativeFantom.cpp', + 'RawPropsKey.cpp', + ] as const +).forEach(filename => { + describe(`FantomCoverage ${filename}`, () => { + const {file, functions, lcov} = loadLLVMCoverage(filename); + const fileCoverage = createFileCoverage( + convertLLVMCoverage(file, functions), + ); + + // Parse expected DA lines from reference LCOV + const expectedDALines: Map = new Map(); + for (const line of lcov) { + const match = line.match(/^DA:(\d+),(\d+)$/); + if (match) { + expectedDALines.set(Number(match[1]), Number(match[2])); + } + } + + // Parse expected FNDA lines from reference LCOV + const expectedFNDA: Map = new Map(); + for (const line of lcov) { + const match = line.match(/^FNDA:(\d+),(.+)$/); + if (match) { + expectedFNDA.set(match[2], Number(match[1])); + } + } + + it('correctly converts line coverage', () => { + const lineCoverage = fileCoverage.getLineCoverage(); + + // Every line in the expected LCOV should be present with correct count + for (const [line, expectedCount] of expectedDALines) { + expect({line, count: lineCoverage[line]}).toEqual({ + line, + count: expectedCount, + }); + } + + // No extra lines should be present + const actualLines = Object.keys(lineCoverage).map(Number); + const expectedLines = [...expectedDALines.keys()]; + expect(actualLines.sort((a, b) => a - b)).toEqual( + expectedLines.sort((a, b) => a - b), + ); + }); + + it('correctly converts branches', () => { + expect(fileCoverage.toSummary().branches.total).toBe( + file.summary.branches.count, + ); + // Istanbul returns 100% when total is 0, LLVM returns 0% + if (file.summary.branches.count === 0) { + expect(fileCoverage.toSummary().branches.pct).toBe(100); + } else { + // Allow small precision differences due to truncation + expect(fileCoverage.toSummary().branches.pct).toBeCloseTo( + file.summary.branches.percent, + 1, + ); + } + }); + + it('correctly converts functions', () => { + expect(fileCoverage.toSummary().functions.total).toBe( + file.summary.functions.count, + ); + + expect(fileCoverage.toSummary().functions.covered).toBe( + file.summary.functions.covered, + ); + }); + + it('correctly converts function execution counts', () => { + const json = fileCoverage.toJSON(); + + for (const key of Object.keys(json.fnMap)) { + const fnName = json.fnMap[key].name; + const actualCount = json.f[key]; + const expectedCount = expectedFNDA.get(fnName); + + if (expectedCount != null) { + expect({name: fnName, count: actualCount}).toEqual({ + name: fnName, + count: expectedCount, + }); + } + } + }); + }); +}); diff --git a/private/react-native-fantom/runner/coverage/convertLLVMCoverage.js b/private/react-native-fantom/runner/coverage/convertLLVMCoverage.js new file mode 100644 index 00000000000..bcf0da3e27e --- /dev/null +++ b/private/react-native-fantom/runner/coverage/convertLLVMCoverage.js @@ -0,0 +1,345 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + * @oncall react_native + */ + +// LLVM-cov segment format: [line, col, count, hasCount, isRegionEntry, isGapRegion] +import type {FileCoverageData} from './types.flow'; + +type LLVMSegment = [ + number, // line (1-based) + number, // column (1-based) + number, // execution count + boolean, // hasCount + boolean, // isRegionEntry + boolean, // isGapRegion +]; + +// LLVM-cov branch format: [startLine, startCol, endLine, endCol, trueCount, falseCount, ?, ?, branchType] +type LLVMBranch = [ + number, // startLine + number, // startCol + number, // endLine + number, // endCol + number, // trueCount (executions when true) + number, // falseCount (executions when false) + number, // unused + number, // unused + number, // branchType +]; + +// LLVM-cov region format: [startLine, startCol, endLine, endCol, count, ?, ?, regionType] +type LLVMRegion = [ + number, // startLine + number, // startCol + number, // endLine + number, // endCol + number, // execution count + number, // fileId + number, // expandedFileId + number, // regionType (0=Code, 1=Expansion, 2=Skipped, 3=Gap, 4=Branch) +]; + +// LLVM-cov expansion format: represents macro/inline expansions +type LLVMExpansion = { + branches: Array, + filenames: Array, + source_region: LLVMRegion, + target_regions: Array, +}; + +type LLVMSummaryEntry = { + count: number, + covered: number, + percent: number, + notcovered?: number, +}; + +type LLVMSummary = { + branches: LLVMSummaryEntry, + functions: LLVMSummaryEntry, + lines: LLVMSummaryEntry, + regions: LLVMSummaryEntry, + instantiations?: LLVMSummaryEntry, +}; + +export type LLVMFileData = { + branches: Array, + expansions: Array, + filename: string, + segments: Array, + summary: LLVMSummary, +}; + +export type LLVMFunctionData = { + branches: Array, + count: number, + filenames: Array, + name: string, + regions: Array, +}; + +// LLVM region types +const REGION_TYPE_CODE = 0; + +// A segment is a "start of region" if it has a count, is a region entry, +// and is not a gap region. This matches LLVM's isStartOfRegion() function. +function isStartOfRegion(segment: LLVMSegment): boolean { + const [, , , hasCount, isRegionEntry, isGapRegion] = segment; + return hasCount && isRegionEntry && !isGapRegion; +} + +export default function convertLLVMCoverage( + file: LLVMFileData, + functions: Array, +): FileCoverageData { + const coverageData: FileCoverageData = { + path: file.filename, + statementMap: {}, + fnMap: {}, + branchMap: {}, + s: {}, + f: {}, + b: {}, + }; + + // Phase 1: Line coverage from segments + // LLVM segments describe a state machine where each segment marks a point + // where the coverage count changes. We walk through lines and track a + // "wrapped segment" (the last segment from a previous line) to determine + // which lines are instrumented and their execution counts. + const segmentsByLine: Map> = new Map(); + let maxLine = 0; + + for (const segment of file.segments) { + const line = segment[0]; + let lineSegs = segmentsByLine.get(line); + if (lineSegs == null) { + lineSegs = []; + segmentsByLine.set(line, lineSegs); + } + lineSegs.push(segment); + maxLine = Math.max(maxLine, line); + } + + let wrappedSegment: LLVMSegment | null = null; + let statementIndex = 0; + + for (let line = 1; line <= maxLine; line++) { + const lineSegs = segmentsByLine.get(line); + + let mapped = false; + let count = 0; + + if (lineSegs != null) { + // Check for region starts on this line + for (const seg of lineSegs) { + if (isStartOfRegion(seg)) { + mapped = true; + count = Math.max(count, seg[2]); + } + } + + if (mapped) { + // When a line has region starts AND a valid wrapped segment, + // include the wrapped segment's count in the max. The wrapped + // segment represents the enclosing scope, which may have a higher + // execution count than the inner region starts (e.g. an else-if + // branch with count=0 inside a function with count=1). + if (wrappedSegment != null && wrappedSegment[3] === true) { + count = Math.max(count, wrappedSegment[2]); + } + } else { + // No region starts on this line. Check the wrapped segment. + // A segment with isRegionEntry=true but hasCount=false (e.g. an + // expansion or skipped region entry) blocks the wrapped segment + // from covering this line. + const hasUnmappedRegionEntry = lineSegs.some( + s => s[4] === true && s[3] === false, + ); + + if ( + !hasUnmappedRegionEntry && + wrappedSegment != null && + wrappedSegment[3] === true + ) { + mapped = true; + count = wrappedSegment[2]; + } + } + + // Update wrapped segment to the last segment on this line + wrappedSegment = lineSegs[lineSegs.length - 1]; + } else { + // No segments on this line — use the wrapped segment if it has a count. + if (wrappedSegment != null && wrappedSegment[3] === true) { + mapped = true; + count = wrappedSegment[2]; + } + } + + if (mapped) { + const key = String(statementIndex); + coverageData.statementMap[key] = { + start: {line, column: 0}, + end: {line, column: 0}, + }; + coverageData.s[key] = count; + statementIndex++; + } + } + + // Phase 2: Function coverage + // We use file.summary.functions.count for the total number of unique functions. + // The 'functions' array may contain multiple instantiations of template functions, + // but we only report unique function names to match LLVM's summary. + const totalFunctions = file.summary?.functions?.count ?? 0; + + const seenFunctionNames: Set = new Set(); + let functionIndex = 0; + + for (const func of functions) { + if (functionIndex >= totalFunctions) { + break; + } + + // Skip duplicate function names (different instantiations of same function) + if (seenFunctionNames.has(func.name)) { + continue; + } + + // Find the first code region for this function + const codeRegion = func.regions.find(r => r[7] === REGION_TYPE_CODE); + if (codeRegion == null) { + continue; + } + + seenFunctionNames.add(func.name); + + const [startLine, startCol, endLine, endCol] = codeRegion; + const key = String(functionIndex); + + coverageData.fnMap[key] = { + name: func.name, + decl: { + start: {line: startLine, column: startCol}, + end: {line: endLine, column: endCol}, + }, + loc: { + start: {line: startLine, column: startCol}, + end: {line: endLine, column: endCol}, + }, + line: startLine, + }; + + // Use the actual execution count from LLVM + coverageData.f[key] = func.count; + functionIndex++; + } + + // Populate branch map from file branches + // CRITICAL: Only process branches if LLVM's summary says there are branches. + // Template instantiation branches appear in the branches array but are not + // counted in the file's branch summary. We must match LLVM's summary count. + const summaryBranchCount = file.summary?.branches?.count ?? 0; + if (summaryBranchCount === 0) { + // No branches according to LLVM summary - return early with custom coverage + return coverageData; + } + + // LLVM BRDA format uses cumulative case indices across all branches on the same line. + // For example, if line 39 has 2 branches: + // Branch 0: cases 0,1 + // Branch 1: cases 2,3 (cumulative from previous branch) + // + // LLVM also uses "-" for branches where both true and false counts are 0 (not executed). + // We represent this with null in the array, which Istanbul will convert to "-". + // + // To achieve this, we group branches by line and use a single branchMap entry per line + // with all cases accumulated. + + // Group branches by line + const branchesByLine: Map< + number, + Array<{ + startCol: number, + endCol: number, + trueCount: number, + falseCount: number, + }>, + > = new Map(); + + for (const branch of file.branches) { + const [startLine, startCol, , endCol, trueCount, falseCount] = branch; + let lineBranches = branchesByLine.get(startLine); + if (lineBranches == null) { + lineBranches = []; + branchesByLine.set(startLine, lineBranches); + } + lineBranches.push({startCol, endCol, trueCount, falseCount}); + } + + // Sort lines and create branch entries with cumulative case indices + const sortedBranchLines = [...branchesByLine.keys()].sort((a, b) => a - b); + let branchIndex = 0; + + for (const line of sortedBranchLines) { + const lineBranches = branchesByLine.get(line); + if (lineBranches == null) { + continue; + } + + // Sort branches on same line by column + lineBranches.sort((a, b) => a.startCol - b.startCol); + + // Each branch on this line gets its own branchMap entry with key = branchIndex + // But case indices are cumulative across all branches on the line + for (const branchData of lineBranches) { + const key = String(branchIndex); + const loc = { + start: {line, column: branchData.startCol}, + end: {line, column: branchData.endCol}, + }; + + // Generate locations with cumulative case indices + // Each branch has 2 cases: true (cumulativeCaseIndex) and false (cumulativeCaseIndex + 1) + const locations = []; + for (let i = 0; i < 2; i++) { + locations.push({ + start: {line, column: branchData.startCol}, + end: {line, column: branchData.endCol}, + }); + } + + coverageData.branchMap[key] = { + type: 'branch', + line, + loc, + locations, + }; + + // For branches where both counts are 0, LLVM outputs "-" (unknown/not executed) + // We use "-" string to represent this in the LCOV output + const trueVal = + branchData.trueCount === 0 && branchData.falseCount === 0 + ? '-' + : branchData.trueCount; + const falseVal = + branchData.trueCount === 0 && branchData.falseCount === 0 + ? '-' + : branchData.falseCount; + + coverageData.b[key] = [trueVal, falseVal]; + + branchIndex++; + } + } + + return coverageData; +} diff --git a/private/react-native-fantom/runner/coverage/types.flow.js b/private/react-native-fantom/runner/coverage/types.flow.js new file mode 100644 index 00000000000..583ed751eda --- /dev/null +++ b/private/react-native-fantom/runner/coverage/types.flow.js @@ -0,0 +1,56 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + * @oncall react_native + */ + +// Istanbul location types +type Location = { + line: number, + column: number, +}; + +type Range = { + start: Location, + end: Location, +}; + +type StatementMap = {[key: string]: Range}; + +type FnMap = { + [key: string]: { + name: string, + decl: Range, + loc: Range, + line: number, + }, +}; + +type BranchMap = { + [key: string]: { + type: string, + line: number, + loc: Range, + locations: Array, + }, +}; + +// Istanbul FileCoverage data format +export type FileCoverageData = { + path: string, + statementMap: StatementMap, + fnMap: FnMap, + branchMap: BranchMap, + s: {[key: string]: number}, + f: {[key: string]: number}, + b: {[key: string]: Array}, +}; + +export type CoverageMap = { + [key: string]: FileCoverageData, +}; diff --git a/private/react-native-fantom/runner/runner.js b/private/react-native-fantom/runner/runner.js index eb0e2b9975b..96835ea8944 100644 --- a/private/react-native-fantom/runner/runner.js +++ b/private/react-native-fantom/runner/runner.js @@ -9,13 +9,13 @@ */ import type { - CoverageMap, FailureDetail, TestCaseResult, TestSuiteResult, } from '../runtime/setup'; import type {TestSnapshotResults} from '../runtime/snapshotContext'; import type {BenchmarkResult} from '../src/Benchmark'; +import type {CoverageMap} from './coverage/types.flow'; import type { AsyncCommandResult, ConsoleLogMessage, diff --git a/private/react-native-fantom/runtime/setup.js b/private/react-native-fantom/runtime/setup.js index c4d174910a2..31bcd574fe4 100644 --- a/private/react-native-fantom/runtime/setup.js +++ b/private/react-native-fantom/runtime/setup.js @@ -8,6 +8,7 @@ * @format */ +import type {CoverageMap} from '../runner/coverage/types.flow'; import type {BenchmarkResult} from '../src/Benchmark'; import type {SnapshotConfig, TestSnapshotResults} from './snapshotContext'; @@ -36,8 +37,6 @@ export type FailureDetail = { cause?: FailureDetail, }; -export opaque type CoverageMap = unknown; - export type TestSuiteResult = | { testResults: Array, From e1c296869d65ce530428f74e01bd972819c8f65d Mon Sep 17 00:00:00 2001 From: Andrew Datsenko Date: Tue, 3 Mar 2026 09:28:25 -0800 Subject: [PATCH 035/595] add cpp coverage (#54637) Summary: Changelog: [Internal] Pull Request resolved: https://github.com/facebook/react-native/pull/54637 Add c++ code-coverage mode for Fantom and set up custom output path for it. Reviewed By: sammy-SC Differential Revision: D87548065 fbshipit-source-id: 5462582ca467051f7e9a155fd82bfb7045380097 --- .../runner/executables/hermesc.js | 42 ++-- .../runner/executables/tester.js | 85 +++++--- .../runner/global-setup/build.js | 16 +- .../runner/global-setup/globalSetup.js | 12 +- .../runner/llvm/processLLVMCoverage.js | 188 ++++++++++++++++++ private/react-native-fantom/runner/runner.js | 80 ++++++-- private/react-native-fantom/runner/utils.js | 58 ++++-- 7 files changed, 395 insertions(+), 86 deletions(-) create mode 100644 private/react-native-fantom/runner/llvm/processLLVMCoverage.js diff --git a/private/react-native-fantom/runner/executables/hermesc.js b/private/react-native-fantom/runner/executables/hermesc.js index eddcc226ff2..cc7d910f024 100644 --- a/private/react-native-fantom/runner/executables/hermesc.js +++ b/private/react-native-fantom/runner/executables/hermesc.js @@ -24,22 +24,22 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; -type TesterOptions = Readonly<{ - isOptimizedMode: boolean, +type HermescOptions = Readonly<{ + enableCoverage: boolean, + enableOptimized: boolean, hermesVariant: HermesVariant, }>; function getHermesCompilerPath({ - isOptimizedMode, + enableOptimized, hermesVariant, -}: TesterOptions): string { +}: HermescOptions): string { return path.join( NATIVE_BUILD_OUTPUT_PATH, - `hermesc-${(hermesVariant as string).toLowerCase()}-${isOptimizedMode ? 'opt' : 'dev'}`, + `hermesc-${(hermesVariant as string).toLowerCase()}-${enableOptimized ? 'opt' : 'dev'}`, ); } - -export function build(options: TesterOptions): void { +export function build(options: HermescOptions): void { const destPath = getHermesCompilerPath(options); if (fs.existsSync(destPath)) { return; @@ -54,14 +54,20 @@ export function build(options: TesterOptions): void { const destTmpPath = destPath + '-' + Date.now() + '-' + process.pid; try { - const result = runBuck2Sync([ - 'build', - ...getBuckModesForPlatform(options.isOptimizedMode), - ...getBuckOptionsForHermes(options.hermesVariant), - getHermesCompilerTarget(options.hermesVariant), - '--out', - tmpPath, - ]); + const result = runBuck2Sync( + [ + 'build', + ...getBuckModesForPlatform({ + enableOptimized: options.enableOptimized, + enableCoverage: options.enableCoverage, + }), + ...getBuckOptionsForHermes(options.hermesVariant), + getHermesCompilerTarget(options.hermesVariant), + '--out', + tmpPath, + ], + {}, + ); if (result.status !== 0) { throw new Error(getDebugInfoFromCommandResult(result)); @@ -75,7 +81,7 @@ export function build(options: TesterOptions): void { // Remove extended attributes to avoid "Operation not permitted" errors // when copying to EdenFS/NFS-backed directories on macOS if (os.platform() === 'darwin') { - runCommandSync('xattr', ['-rc', tmpPath]); + runCommandSync('xattr', ['-rc', tmpPath], {}); } fs.copyFileSync(tmpPath, destTmpPath); @@ -104,11 +110,11 @@ export function build(options: TesterOptions): void { export function run( args: ReadonlyArray, - options: TesterOptions, + options: HermescOptions, ): SyncCommandResult { if (!isCI) { build(options); } - return runCommandSync(getHermesCompilerPath(options), args); + return runCommandSync(getHermesCompilerPath(options), args, {}); } diff --git a/private/react-native-fantom/runner/executables/tester.js b/private/react-native-fantom/runner/executables/tester.js index 13417bdac58..05b09edb6ec 100644 --- a/private/react-native-fantom/runner/executables/tester.js +++ b/private/react-native-fantom/runner/executables/tester.js @@ -8,7 +8,11 @@ * @format */ -import type {AsyncCommandResult, HermesVariant} from '../utils'; +import type { + AsyncCommandResult, + EnvironmentOverrides, + HermesVariant, +} from '../utils'; import {debugCpp, isCI, profileCpp} from '../EnvironmentOptions'; import {CPP_TRACES_OUTPUT_PATH, NATIVE_BUILD_OUTPUT_PATH} from '../paths'; @@ -29,21 +33,22 @@ const FANTOM_TESTER_BUCK_TARGET = 'fbsource//xplat/js/react-native-github/private/react-native-fantom/tester:tester'; type TesterOptions = Readonly<{ - isOptimizedMode: boolean, + enableCoverage: boolean, + enableOptimized: boolean, hermesVariant: HermesVariant, }>; -function getFantomTesterPath({ - isOptimizedMode, +export function getFantomTesterPath({ hermesVariant, + ...options }: TesterOptions): string { return path.join( NATIVE_BUILD_OUTPUT_PATH, - `fantom-tester-${(hermesVariant as string).toLowerCase()}-${isOptimizedMode ? 'opt' : 'dev'}`, + `fantom-tester-${(hermesVariant as string).toLowerCase()}-${options.enableOptimized ? 'opt' : 'dev'}${options.enableCoverage ? '-coverage' : ''}`, ); } -export function build(options: TesterOptions): void { +export function build(options: TesterOptions, env: EnvironmentOverrides): void { const destPath = getFantomTesterPath(options); if (fs.existsSync(destPath)) { return; @@ -58,14 +63,23 @@ export function build(options: TesterOptions): void { const destTmpPath = destPath + '-' + Date.now() + '-' + process.pid; try { - const result = runBuck2Sync([ - 'build', - ...getBuckModesForPlatform(options.isOptimizedMode), - ...getBuckOptionsForHermes(options.hermesVariant), - FANTOM_TESTER_BUCK_TARGET, - '--out', - tmpPath, - ]); + const result = runBuck2Sync( + [ + 'build', + ...getBuckModesForPlatform({ + enableOptimized: options.enableOptimized, + enableCoverage: options.enableCoverage, + }), + ...getBuckOptionsForHermes(options.hermesVariant), + FANTOM_TESTER_BUCK_TARGET, + '--out', + tmpPath, + ], + env, + { + withFDB: false, + }, + ); if (result.status !== 0) { throw new Error(getDebugInfoFromCommandResult(result)); @@ -79,7 +93,7 @@ export function build(options: TesterOptions): void { // Remove extended attributes to avoid "Operation not permitted" errors // when copying to EdenFS/NFS-backed directories on macOS if (os.platform() === 'darwin') { - runCommandSync('xattr', ['-rc', tmpPath]); + runCommandSync('xattr', ['-rc', tmpPath], {}); } fs.copyFileSync(tmpPath, destTmpPath); @@ -109,6 +123,7 @@ export function build(options: TesterOptions): void { export function run( args: ReadonlyArray, options: TesterOptions, + env: EnvironmentOverrides, ): AsyncCommandResult { if (isCI && debugCpp) { throw new Error('Cannot run Fantom with C++ debugging on CI'); @@ -119,19 +134,23 @@ export function run( } if (!isCI && !debugCpp) { - build(options); + build(options, env); } if (debugCpp) { return runBuck2( [ 'run', - ...getBuckModesForPlatform(options.isOptimizedMode), + ...getBuckModesForPlatform({ + enableOptimized: options.enableOptimized, + enableCoverage: options.enableCoverage, + }), ...getBuckOptionsForHermes(options.hermesVariant), FANTOM_TESTER_BUCK_TARGET, '--', ...args, ], + env, { withFDB: true, }, @@ -156,19 +175,23 @@ export function run( // -g: enable call-graph (stack traces) // -F 997: sample at 997 Hz (prime number to avoid aliasing) // --call-graph dwarf: use DWARF for accurate stack traces - const result = runCommand('perf', [ - 'record', - '-g', - '-F', - '997', - '--call-graph', - 'dwarf', - '-o', - perfOutputPath, - '--', - testerPath, - ...args, - ]); + const result = runCommand( + 'perf', + [ + 'record', + '-g', + '-F', + '997', + '--call-graph', + 'dwarf', + '-o', + perfOutputPath, + '--', + testerPath, + ...args, + ], + {}, + ); // Log the output path after the command starts console.log( @@ -179,5 +202,5 @@ export function run( return result; } - return runCommand(testerPath, args); + return runCommand(testerPath, args, env); } diff --git a/private/react-native-fantom/runner/global-setup/build.js b/private/react-native-fantom/runner/global-setup/build.js index 929984ab0eb..a1c9b7bc7c9 100644 --- a/private/react-native-fantom/runner/global-setup/build.js +++ b/private/react-native-fantom/runner/global-setup/build.js @@ -8,6 +8,8 @@ * @format */ +import type {EnvironmentOverrides} from '../utils'; + import {createBundle} from '../bundling'; import {isCI} from '../EnvironmentOptions'; import {build as buildHermesCompiler} from '../executables/hermesc'; @@ -37,7 +39,10 @@ async function tryOrLog( } } -export default async function build(): Promise { +export default async function build( + enableCoverage: boolean, + env: EnvironmentOverrides, +): Promise { try { fs.rmSync(NATIVE_BUILD_OUTPUT_PATH, {recursive: true}); } catch {} @@ -45,10 +50,13 @@ export default async function build(): Promise { fs.mkdirSync(NATIVE_BUILD_OUTPUT_PATH, {recursive: true}); if (isCI) { - for (const isOptimizedMode of [false, true]) { + for (const enableOptimized of [false, true]) { for (const hermesVariant of HermesVariant.members()) { - buildFantomTester({isOptimizedMode, hermesVariant}); - buildHermesCompiler({isOptimizedMode, hermesVariant}); + buildFantomTester( + {enableOptimized, hermesVariant, enableCoverage}, + env, + ); + buildHermesCompiler({enableOptimized, hermesVariant, enableCoverage}); } } diff --git a/private/react-native-fantom/runner/global-setup/globalSetup.js b/private/react-native-fantom/runner/global-setup/globalSetup.js index 7102759a1ee..e23b46f8b25 100644 --- a/private/react-native-fantom/runner/global-setup/globalSetup.js +++ b/private/react-native-fantom/runner/global-setup/globalSetup.js @@ -12,6 +12,7 @@ import type {DevToolLauncher} from '@react-native/dev-middleware'; import type {ConfigT} from 'metro-config'; import {isOSS, validateEnvironmentVariables} from '../EnvironmentOptions'; +import {getTestBuildOutputPath} from '../paths'; import build from './build'; import {createDevMiddleware} from '@react-native/dev-middleware'; import connect from 'connect'; @@ -20,7 +21,10 @@ import {Server} from 'net'; import path from 'path'; export default async function globalSetup( - globalConfig: {...}, + globalConfig: { + collectCoverage: boolean, + ... + }, projectConfig: {...}, ): Promise { process.env.__FANTOM_RUN_ID__ ??= `run-${Date.now()}`; @@ -30,7 +34,11 @@ export default async function globalSetup( await startMetroServer(); if (!isOSS) { - await build(); + await build(globalConfig.collectCoverage, { + LLVM_PROFILE_FILE: globalConfig.collectCoverage + ? getTestBuildOutputPath() + 'fantom.profraw' + : undefined, + }); } } diff --git a/private/react-native-fantom/runner/llvm/processLLVMCoverage.js b/private/react-native-fantom/runner/llvm/processLLVMCoverage.js new file mode 100644 index 00000000000..02ea7e9ec07 --- /dev/null +++ b/private/react-native-fantom/runner/llvm/processLLVMCoverage.js @@ -0,0 +1,188 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +import type { + LLVMFileData, + LLVMFunctionData, +} from '../coverage/convertLLVMCoverage'; +import type {FileCoverageData} from '../coverage/types.flow'; + +import convertLLVMCoverage from '../coverage/convertLLVMCoverage'; +import * as EnvironmentOptions from '../EnvironmentOptions'; +import { + getDebugInfoFromCommandResult, + printConsoleLog, + runCommand, + runCommandSync, +} from '../utils'; +import fs from 'fs'; +import os from 'os'; +import path from 'path'; + +const FANTOM_DIR = path.resolve(__dirname, '..', '..'); +const RN_ROOT = path.resolve(FANTOM_DIR, '..', '..'); + +let _repoRoot: ?string = null; +function getRepoRoot(): string { + if (_repoRoot != null) { + return _repoRoot; + } + + const res = runCommandSync('hg', ['root'], {}); + if (res.status !== 0) { + throw new Error( + `Failed to get repo root: ${getDebugInfoFromCommandResult(res)}`, + ); + } + _repoRoot = res.stdout.trim(); + return _repoRoot; +} + +function getLLVMCommand(command: 'llvm-profdata' | 'llvm-cov'): string { + return path.join( + getRepoRoot(), + 'arvr', + 'third-party', + 'toolchains', + 'platform010', + 'build', + 'llvm-fb', + '17', + 'bin', + command, + ); +} + +export default async function processLLVMCoverage( + profrawFilePath: string, + binaryPath: string, +): Promise<{[string]: FileCoverageData}> { + if (!fs.existsSync(profrawFilePath)) { + printConsoleLog({ + type: 'console-log', + level: 'warn', + message: `No .profraw file found at ${profrawFilePath}, skipping C++ coverage`, + }); + return {}; + } + + const profdataFilePath = profrawFilePath.replace('.profraw', '.profdata'); + const coverageJsonPath = profrawFilePath.replace('.profraw', '-cpp.json'); + + if (os.platform() !== 'linux') { + printConsoleLog({ + type: 'console-log', + level: 'warn', + message: `C++ coverage is only supported on Linux`, + }); + return {}; + } + + if (EnvironmentOptions.isOSS) { + printConsoleLog({ + type: 'console-log', + level: 'warn', + message: `C++ coverage is not supported in OSS mode`, + }); + return {}; + } + + try { + const mergeResult = runCommandSync( + getLLVMCommand('llvm-profdata'), + ['merge', '-sparse', profrawFilePath, '-o', profdataFilePath], + {}, + ); + + if (mergeResult.status !== 0) { + printConsoleLog({ + type: 'console-log', + level: 'error', + message: `Failed to merge .profraw file`, + }); + return {}; + } + const exportCommand = runCommand( + 'sh', + [ + '-c', + `${getLLVMCommand('llvm-cov')} ${[ + 'export', + `-instr-profile=${profdataFilePath}`, + '-format=text', + `-path-equivalence=/re_cwd,${getRepoRoot()}`, + binaryPath, + '--sources', + RN_ROOT, + ] + .map(arg => `"${arg}"`) + .join(' ')} > "${coverageJsonPath}"`, + ], + {}, + ); + + const exportResult = await exportCommand.done; + + if (exportResult.status !== 0) { + printConsoleLog({ + type: 'console-log', + level: 'error', + message: `Failed to export coverage data: ${getDebugInfoFromCommandResult(exportResult)}`, + }); + return {}; + } + + const coverageData = fs.readFileSync(coverageJsonPath, 'utf8'); + // Parse the JSON data + const {data} = JSON.parse(coverageData) as { + data: Array<{ + files: Array, + functions: Array, + }>, + }; + + // Group functions by filename + const functionsMap: Map> = new Map(); + for (const {functions} of data) { + for (const func of functions) { + for (const filename of func.filenames) { + let funcList = functionsMap.get(filename); + if (funcList == null) { + funcList = []; + functionsMap.set(filename, funcList); + } + funcList.push(func); + } + } + } + + const result: {[filename: string]: FileCoverageData} = {}; + for (const {files} of data) { + for (const file of files) { + const funcList = functionsMap.get(file.filename) ?? []; + const fileCoverage = convertLLVMCoverage(file, funcList); + fileCoverage.path = fileCoverage.path.replace( + /^\/re_cwd/, + getRepoRoot(), + ); + result[fileCoverage.path] = fileCoverage; + } + } + + return result; + } catch (error) { + printConsoleLog({ + type: 'console-log', + level: 'error', + message: `Error processing C++ coverage: ${String(error)}`, + }); + return {}; + } +} diff --git a/private/react-native-fantom/runner/runner.js b/private/react-native-fantom/runner/runner.js index 96835ea8944..20883c00377 100644 --- a/private/react-native-fantom/runner/runner.js +++ b/private/react-native-fantom/runner/runner.js @@ -19,6 +19,7 @@ import type {CoverageMap} from './coverage/types.flow'; import type { AsyncCommandResult, ConsoleLogMessage, + EnvironmentOverrides, HermesVariant, } from './utils'; @@ -28,9 +29,13 @@ import {shouldCollectCoverage} from './coverageUtils'; import entrypointTemplate from './entrypoint-template'; import * as EnvironmentOptions from './EnvironmentOptions'; import {run as runHermesCompiler} from './executables/hermesc'; -import {run as runFantomTester} from './executables/tester'; +import { + getFantomTesterPath, + run as runFantomTester, +} from './executables/tester'; import formatFantomConfig from './formatFantomConfig'; import getFantomTestConfigs from './getFantomTestConfigs'; +import processLLVMCoverage from './llvm/processLLVMCoverage'; import { JS_HEAP_SNAPSHOTS_OUTPUT_PATH, JS_TRACES_OUTPUT_PATH, @@ -163,18 +168,20 @@ async function processRNTesterCommandResult( function generateBytecodeBundle({ sourcePath, bytecodePath, - isOptimizedMode, + enableOptimized, hermesVariant, + enableCoverage, }: { - sourcePath: string, bytecodePath: string, - isOptimizedMode: boolean, + enableCoverage: boolean, + enableOptimized: boolean, hermesVariant: HermesVariant, + sourcePath: string, }): void { const hermesCompilerCommandResult = runHermesCompiler( [ '-emit-binary', - isOptimizedMode ? '-O' : null, + enableOptimized ? '-O' : null, '-max-diagnostic-width', '80', '-out', @@ -182,8 +189,9 @@ function generateBytecodeBundle({ sourcePath, ].filter(Boolean), { - isOptimizedMode, + enableOptimized, hermesVariant, + enableCoverage, }, ); @@ -208,7 +216,7 @@ module.exports = async function runTest( runtime: {...}, testPath: string, ): unknown { - let coverageMap: CoverageMap | void; + let coverageMap: CoverageMap = {}; const snapshotResolver = await buildSnapshotResolver(config); const snapshotPath = snapshotResolver.resolveSnapshotPath(testPath); const snapshotState = new SnapshotState(snapshotPath, { @@ -326,6 +334,7 @@ module.exports = async function runTest( ); const testJSBundlePath = entrypointPath + '.bundle.js'; const testBytecodeBundlePath = testJSBundlePath + '.hbc'; + const testCoveragePath = entrypointPath + '.profraw'; fs.mkdirSync(path.dirname(entrypointPath), {recursive: true}); fs.writeFileSync(entrypointPath, entrypointContents, 'utf8'); @@ -335,6 +344,12 @@ module.exports = async function runTest( path.basename(testJSBundlePath, '.js') + '.map', ); + const collectCoverage = shouldCollectCoverage( + testPath, + testContents, + globalConfig, + ); + const bundleOptions = { testPath, entry: entrypointPath, @@ -344,11 +359,7 @@ module.exports = async function runTest( sourceMap: true, sourceMapUrl: sourceMapPath, customTransformOptions: { - collectCoverage: shouldCollectCoverage( - testPath, - testContents, - globalConfig, - ), + collectCoverage, }, }; @@ -361,7 +372,8 @@ module.exports = async function runTest( generateBytecodeBundle({ sourcePath: testJSBundlePath, bytecodePath: testBytecodeBundlePath, - isOptimizedMode: testConfig.isJsOptimized, + enableCoverage: collectCoverage, + enableOptimized: testConfig.isJsOptimized, hermesVariant: testConfig.hermesVariant, }); } @@ -382,15 +394,22 @@ module.exports = async function runTest( ); } + const env: EnvironmentOverrides = { + LLVM_PROFILE_FILE: collectCoverage ? testCoveragePath : undefined, + }; + + const rnTesterOptions = { + enableOptimized: testConfig.isNativeOptimized, + hermesVariant: testConfig.hermesVariant, + enableCoverage: collectCoverage, + }; const rnTesterCommandResult = EnvironmentOptions.isOSS ? runCommand( path.join(__dirname, '..', 'build', 'tester', 'fantom_tester'), rnTesterCommandArgs, + env, ) - : runFantomTester(rnTesterCommandArgs, { - isOptimizedMode: testConfig.isNativeOptimized, - hermesVariant: testConfig.hermesVariant, - }); + : runFantomTester(rnTesterCommandArgs, rnTesterOptions, env); const [processedResult, benchmarkResult] = await processRNTesterCommandResult(rnTesterCommandResult); @@ -468,7 +487,32 @@ module.exports = async function runTest( testResultsByConfig.push(testResults); - coverageMap = processedResult.coverageMap; + coverageMap = processedResult.coverageMap || {}; + + if (globalConfig.collectCoverage) { + try { + const binaryPath = EnvironmentOptions.isOSS + ? path.join(__dirname, '..', 'build', 'tester', 'fantom_tester') + : getFantomTesterPath(rnTesterOptions); + + const cppCoverageMap = await processLLVMCoverage( + testCoveragePath, + binaryPath, + ); + + Object.entries(cppCoverageMap || {}).forEach( + ([filename, fileCoverage]) => { + coverageMap[filename] = fileCoverage; + }, + ); + } catch (error) { + printConsoleLog({ + type: 'console-log', + level: 'warn', + message: `Failed to process C++ coverage: ${String(error)} ${String(error.stack)}`, + }); + } + } } const endTime = Date.now(); diff --git a/private/react-native-fantom/runner/utils.js b/private/react-native-fantom/runner/utils.js index b7ccb6ea304..b92125235b3 100644 --- a/private/react-native-fantom/runner/utils.js +++ b/private/react-native-fantom/runner/utils.js @@ -24,6 +24,10 @@ export enum HermesVariant { StaticHermesExperimental, // Static Hermes Trunk } +export type EnvironmentOverrides = { + LLVM_PROFILE_FILE?: string, +}; + export function getBuckOptionsForHermes( variant: HermesVariant, ): ReadonlyArray { @@ -51,16 +55,16 @@ export function getHermesCompilerTarget(variant: HermesVariant): string { } } -export function getBuckModesForPlatform( - enableRelease: boolean = false, -): ReadonlyArray { - let modes = ['@//xplat/mode/react-native/granite']; - if (enableRelease) { - modes.push('@//xplat/mode/hermes/opt'); - } +export function getBuckModesForPlatform({ + enableCoverage, + enableOptimized, +}: { + enableCoverage: boolean, + enableOptimized: boolean, +}): $ReadOnlyArray { + let mode = enableCoverage ? 'code-coverage' : enableOptimized ? 'opt' : 'dev'; - let mode = enableRelease ? 'opt' : 'dev'; - if (enableRelease) { + if (enableOptimized) { if (EnvironmentOptions.enableASAN || EnvironmentOptions.enableTSAN) { printConsoleLog({ type: 'console-log', @@ -105,8 +109,21 @@ export function getBuckModesForPlatform( throw new Error(`Unsupported platform: ${os.platform()}`); } - modes.push(osPlatform); - return modes; + const result: Array = [ + '@//xplat/mode/react-native/granite', + osPlatform, + ]; + + if (enableCoverage) { + result.push( + '-c', + 'code_coverage.enabled=filtered', + '-c', + 'code_coverage.folder_path_filter=xplat/js/react-native-github', + ); + } + + return result; } export type AsyncCommandResult = { @@ -137,9 +154,19 @@ function maybeLogCommand(command: string, args: ReadonlyArray): void { } } +function toEnv(env: EnvironmentOverrides): {[string]: string} { + return Object.keys(env).reduce<{[string]: string}>((acc, key) => { + if (env[key] != null) { + acc[key] = env[key]; + } + return acc; + }, {}); +} + export function runCommand( command: string, args: ReadonlyArray, + env: EnvironmentOverrides, ): AsyncCommandResult { maybeLogCommand(command, args); @@ -151,6 +178,7 @@ export function runCommand( encoding: 'utf8', env: { ...process.env, + ...toEnv(env), PATH: `/usr/local/bin:/usr/bin:${process.env.PATH ?? ''}`, }, }, @@ -184,6 +212,7 @@ export function runCommand( export function runCommandSync( command: string, args: ReadonlyArray, + env: EnvironmentOverrides, ): SyncCommandResult { maybeLogCommand(command, args); @@ -191,6 +220,7 @@ export function runCommandSync( encoding: 'utf8', env: { ...process.env, + ...toEnv(env), PATH: `/usr/local/bin:/usr/bin:${process.env.PATH ?? ''}`, }, }); @@ -249,6 +279,7 @@ function getCommandAndArgsWithFDB( export function runBuck2( args: Array, + env: EnvironmentOverrides, options?: {withFDB: boolean}, ): AsyncCommandResult { const [actualCommand, actualArgs] = getCommandAndArgsWithFDB( @@ -256,11 +287,12 @@ export function runBuck2( processArgsForBuck(args), options?.withFDB ?? false, ); - return runCommand(actualCommand, actualArgs); + return runCommand(actualCommand, actualArgs, env); } export function runBuck2Sync( args: Array, + env: EnvironmentOverrides, options?: {withFDB: boolean}, ): SyncCommandResult { const [actualCommand, actualArgs] = getCommandAndArgsWithFDB( @@ -268,7 +300,7 @@ export function runBuck2Sync( processArgsForBuck(args), options?.withFDB ?? false, ); - return runCommandSync(actualCommand, actualArgs); + return runCommandSync(actualCommand, actualArgs, env); } function processArgsForBuck(args: Array): Array { From 21e6aa3aa59688ccef61618d3604dec2a22ad665 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Tue, 3 Mar 2026 13:12:23 -0800 Subject: [PATCH 036/595] Fix Fantom getRenderedOutput not reflecting removed props (#55891) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55891 `RenderOutput::renderView` merged old cached props with new debug props via `mergeDynamicProps`. Since `getDebugProps()` omits default-valued props, removed props were never cleared from the cache. Also, `renderedViews_.insert()` never overwrote existing entries. Changelog: [Internal] Reviewed By: javache Differential Revision: D95055704 fbshipit-source-id: 6cdcbde0473a1d03785f49a9eac79be18395a0bf --- .../Components/View/__tests__/View-itest.js | 22 +++++++++++++++ .../tester/src/render/RenderOutput.cpp | 28 +------------------ .../tester/src/render/RenderOutput.h | 2 -- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js index e860b09779f..97ce3c373ce 100644 --- a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js +++ b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js @@ -670,6 +670,28 @@ describe('', () => { ); }); }); + + describe('nativeID', () => { + it('resets nativeID when removed', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render(); + }); + + expect(root.getRenderedOutput({props: ['nativeID']}).toJSX()).toEqual( + , + ); + + Fantom.runTask(() => { + root.render(); + }); + + expect(root.getRenderedOutput({props: ['nativeID']}).toJSX()).toEqual( + , + ); + }); + }); }); describe('ref', () => { diff --git a/private/react-native-fantom/tester/src/render/RenderOutput.cpp b/private/react-native-fantom/tester/src/render/RenderOutput.cpp index e67d48759e7..28ab558d2f2 100644 --- a/private/react-native-fantom/tester/src/render/RenderOutput.cpp +++ b/private/react-native-fantom/tester/src/render/RenderOutput.cpp @@ -9,7 +9,6 @@ #include #include #include -#include namespace facebook::react { @@ -35,15 +34,6 @@ std::string RenderOutput::render( result.push_back(renderView(*child, options)); } - // Remove any views from renderedViews_ that are no longer in the tree. - for (auto it = renderedViews_.begin(); it != renderedViews_.end();) { - if (!tree.hasTag(it->first)) { - it = renderedViews_.erase(it); - } else { - ++it; - } - } - treesMutated_.erase(tree.getRootStubView().surfaceId); return folly::toJson(result); } @@ -51,25 +41,11 @@ std::string RenderOutput::render( folly::dynamic RenderOutput::renderView( const StubView& view, const RenderFormatOptions& options) { - if (!treesMutated_.contains(view.surfaceId)) { - if (auto it = renderedViews_.find(view.tag); it != renderedViews_.end()) { - return it->second; - } - } - folly::dynamic element = folly::dynamic::object; element["type"] = view.componentName; #if RN_DEBUG_STRING_CONVERTIBLE - folly::dynamic props = nullptr; - if (auto it = renderedViews_.find(view.tag); it != renderedViews_.end()) { - props = mergeDynamicProps( - it->second["props"], - renderProps(view.props->getDebugProps()), - NullValueStrategy::Override); - } else { - props = renderProps(view.props->getDebugProps()); - } + folly::dynamic props = renderProps(view.props->getDebugProps()); #else folly::dynamic props = folly::dynamic::object; #endif @@ -96,8 +72,6 @@ folly::dynamic RenderOutput::renderView( #endif element["props"] = props; - renderedViews_.insert({view.tag, element}); - return element; } diff --git a/private/react-native-fantom/tester/src/render/RenderOutput.h b/private/react-native-fantom/tester/src/render/RenderOutput.h index 81d3da93604..7d627a3cae4 100644 --- a/private/react-native-fantom/tester/src/render/RenderOutput.h +++ b/private/react-native-fantom/tester/src/render/RenderOutput.h @@ -31,8 +31,6 @@ class RenderOutput { folly::dynamic renderAttributedString(const Tag &selfTag, const AttributedString &string); - std::unordered_map renderedViews_{}; - // If true, the next call to render() will re-render the entire tree. std::unordered_set treesMutated_{}; }; From 1d476932305f2563d773eb04f0f78a9bdd2525e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Tue, 3 Mar 2026 16:44:41 -0800 Subject: [PATCH 037/595] Fix unsafe rawPointer access in cloneMultiple (#55613) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55613 The cloneMultiple method was written in a way to accept a list of families that are presumed to be owned by the api caller. This designe was mostly aimed at reanimated, that holds refernces to ShadowNodes (that own these families). In the case of AnimationBackend this didn't work properly, as when the view is unmounted we would lose the ShadowNodeFamily shared_ptr that we hold and it could get deallocated. Since now we can get an owning reference to ShadowNodeFamily from ShadowNode::getFamilyShared, we don't have to keep this old unsafe api. Instead we require the caller to have an owning reference with the api itself. This `cloneMultiple` method isn't really adopted in the community, so the breaking change shouldn't be a big problem. Changelog: [General][Breaking] - fix unsafe rawPointer access in cloneMultiple. Reviewed By: zeyap, javache Differential Revision: D93596770 fbshipit-source-id: c4d99b51875968ebce50358c19502cba02c50685 --- .../AnimatedPropsRegistry.cpp | 4 ++- .../animationbackend/AnimatedPropsRegistry.h | 6 ++--- .../animationbackend/AnimationBackend.cpp | 5 ++-- .../AnimationBackendCommitHook.cpp | 7 ++--- .../react/renderer/core/ShadowNode.cpp | 27 ++++++++++--------- .../react/renderer/core/ShadowNode.h | 2 +- .../renderer/core/tests/ShadowNodeTest.cpp | 8 +++--- 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.cpp b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.cpp index 09ee3620c6f..041eac315d5 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.cpp @@ -55,7 +55,9 @@ void AnimatedPropsRegistry::update( } } -std::pair&, SnapshotMap&> +std::pair< + std::unordered_set>&, + SnapshotMap&> AnimatedPropsRegistry::getMap(SurfaceId surfaceId) { auto lock = std::lock_guard(mutex_); auto& [pendingMap, map, pendingFamilies, families] = diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.h b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.h index ead82a63539..f577519762b 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.h +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.h @@ -24,11 +24,11 @@ struct PropsSnapshot { struct SurfaceContext { std::unordered_map> pendingMap, map; - std::unordered_set pendingFamilies, families; + std::unordered_set> pendingFamilies, families; }; struct SurfaceUpdates { - std::unordered_set families; + std::unordered_set> families; std::unordered_map propsMap; bool hasLayoutUpdates{false}; }; @@ -39,7 +39,7 @@ class AnimatedPropsRegistry { public: void update(const std::unordered_map &surfaceUpdates); void clear(SurfaceId surfaceId); - std::pair &, SnapshotMap &> getMap(SurfaceId surfaceId); + std::pair> &, SnapshotMap &> getMap(SurfaceId surfaceId); private: std::unordered_map surfaceContexts_; diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp index 3ad43b8e021..9fb2e5ecf94 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp @@ -71,7 +71,7 @@ void AnimationBackend::onAnimationFrame(AnimationTimestamp timestamp) { auto& [families, updates, hasLayoutUpdates] = surfaceUpdates[family->getSurfaceId()]; hasLayoutUpdates |= mutation.hasLayoutUpdates; - families.insert(family.get()); + families.insert(family); updates[mutation.tag] = std::move(mutation.props); } } @@ -146,7 +146,8 @@ void AnimationBackend::commitUpdates( const ShadowNode& shadowNode, const ShadowNodeFragment& fragment) { auto newProps = ShadowNodeFragment::propsPlaceholder(); - if (surfaceFamilies.contains(&shadowNode.getFamily())) { + if (surfaceFamilies.contains( + shadowNode.getFamilyShared())) { auto& animatedProps = updates.at(shadowNode.getTag()); newProps = cloneProps(animatedProps, shadowNode); } diff --git a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackendCommitHook.cpp b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackendCommitHook.cpp index 4a00926b0e2..cb547d9e367 100644 --- a/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackendCommitHook.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackendCommitHook.cpp @@ -43,9 +43,10 @@ RootShadowNode::Unshared AnimationBackendCommitHook::shadowTreeWillCommit( const ShadowNodeFragment& fragment) { auto newProps = ShadowNodeFragment::propsPlaceholder(); std::shared_ptr viewProps = nullptr; - if (surfaceFamilies.contains(&shadowNode.getFamily()) && - updates.contains(shadowNode.getTag())) { - auto& snapshot = updates.at(shadowNode.getTag()); + if (auto updatesIter = updates.find(shadowNode.getTag()); + updatesIter != updates.end() && + surfaceFamilies.contains(shadowNode.getFamilyShared())) { + auto& snapshot = updatesIter->second; if (!snapshot->propNames.empty() || snapshot->rawProps) { PropsParserContext propsParserContext{ shadowNode.getSurfaceId(), diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp index 168dd4079d4..acbc5aea1cf 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp @@ -413,17 +413,16 @@ namespace { std::shared_ptr cloneMultipleRecursive( const ShadowNode& shadowNode, - const std::unordered_map& childrenCount, + const std::unordered_map& childrenCount, const std::function(const ShadowNode&, const ShadowNodeFragment&)>& callback) { - const auto* family = &shadowNode.getFamily(); auto& children = shadowNode.getChildren(); std::shared_ptr>> newChildren; - auto count = childrenCount.at(family); + auto count = childrenCount.at(shadowNode.getTag()); for (size_t i = 0; count > 0 && i < children.size(); i++) { - const auto childFamily = &children[i]->getFamily(); - if (childrenCount.contains(childFamily)) { + const auto childTag = children[i]->getTag(); + if (childrenCount.contains(childTag)) { count--; if (!newChildren) { newChildren = @@ -441,37 +440,39 @@ std::shared_ptr cloneMultipleRecursive( } // namespace std::shared_ptr ShadowNode::cloneMultiple( - const std::unordered_set& familiesToUpdate, + const std::unordered_set>& + familiesToUpdate, const std::function( const ShadowNode& oldShadowNode, const ShadowNodeFragment& fragment)>& callback) const { - std::unordered_map childrenCount; + std::unordered_map childrenCount; for (const auto& family : familiesToUpdate) { - if (childrenCount.contains(family)) { + if (childrenCount.contains(family->getTag())) { continue; } - childrenCount[family] = 0; + childrenCount[family->getTag()] = 0; auto ancestor = family->parent_.lock(); while ((ancestor != nullptr) && ancestor != family_) { - auto ancestorIt = childrenCount.find(ancestor.get()); + auto ancestorTag = ancestor->getTag(); + auto ancestorIt = childrenCount.find(ancestorTag); if (ancestorIt != childrenCount.end()) { ancestorIt->second++; break; } - childrenCount[ancestor.get()] = 1; + childrenCount[ancestorTag] = 1; ancestor = ancestor->parent_.lock(); } if (ancestor == family_) { - childrenCount[ancestor.get()]++; + childrenCount[ancestor->getTag()]++; } } - if (!childrenCount.contains(&this->getFamily())) { + if (!childrenCount.contains(getTag())) { return nullptr; } diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h index a27d70aae7b..4a804c63dfb 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h @@ -109,7 +109,7 @@ class ShadowNode : public Sealable, public DebugStringConvertible, public jsi::N * Returns `nullptr` if the operation cannot be performed successfully. */ std::shared_ptr cloneMultiple( - const std::unordered_set &familiesToUpdate, + const std::unordered_set> &familiesToUpdate, const std::function< std::shared_ptr(const ShadowNode &oldShadowNode, const ShadowNodeFragment &fragment)> &callback) const; diff --git a/packages/react-native/ReactCommon/react/renderer/core/tests/ShadowNodeTest.cpp b/packages/react-native/ReactCommon/react/renderer/core/tests/ShadowNodeTest.cpp index bc4c5eb2b54..cc53b101e11 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/tests/ShadowNodeTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/tests/ShadowNodeTest.cpp @@ -316,7 +316,7 @@ TEST_F(ShadowNodeTest, handleRuntimeReferenceTransferOnClone) { TEST_F(ShadowNodeTest, cloneMultiple) { auto newProps = std::make_shared(); auto newRoot = nodeA_->cloneMultiple( - {&nodeA_->getFamily(), &nodeAB_->getFamily()}, + {nodeA_->getFamilyShared(), nodeAB_->getFamilyShared()}, [&](const ShadowNode& oldShadowNode, const ShadowNodeFragment& fragment) { return oldShadowNode.clone({ .props = newProps, @@ -346,7 +346,7 @@ TEST_F(ShadowNodeTest, cloneMultiple) { TEST_F(ShadowNodeTest, cloneMultipleWithSingleFamily) { auto newProps = std::make_shared(); auto newRoot = nodeA_->cloneMultiple( - {&nodeAB_->getFamily()}, + {nodeAB_->getFamilyShared()}, [&](const ShadowNode& oldShadowNode, const ShadowNodeFragment& fragment) { return oldShadowNode.clone({ .props = newProps, @@ -379,7 +379,7 @@ TEST_F(ShadowNodeTest, cloneMultipleReturnsNullptrWhenFamilyHasNoPathToRoot) { auto newProps = std::make_shared(); // nodeZ_ is not part of nodeA_'s tree auto result = nodeA_->cloneMultiple( - {&nodeZ_->getFamily()}, + {nodeZ_->getFamilyShared()}, [&](const ShadowNode& oldShadowNode, const ShadowNodeFragment& fragment) { return oldShadowNode.clone({ .props = newProps, @@ -396,7 +396,7 @@ TEST_F(ShadowNodeTest, cloneMultipleWithMixOfValidAndInvalidFamilies) { auto newProps = std::make_shared(); // nodeAB_ is in the tree, nodeZ_ is not auto result = nodeA_->cloneMultiple( - {&nodeAB_->getFamily(), &nodeZ_->getFamily()}, + {nodeAB_->getFamilyShared(), nodeZ_->getFamilyShared()}, [&](const ShadowNode& oldShadowNode, const ShadowNodeFragment& fragment) { return oldShadowNode.clone({ .props = newProps, From 50ae4c883828f128d0d77c447f32d9449e414fcc Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Tue, 3 Mar 2026 16:45:00 -0800 Subject: [PATCH 038/595] Do not use hermesNightly on the release branch (#55890) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55890 Changelog: [Internal] This was done manually on `0.84-stable` and `0.85-stable`. Discovered due to the failure when pushing the new `0.85-stable` branch: https://github.com/facebook/react-native/actions/runs/22592250332/job/65471130298. Reviewed By: cortinico Differential Revision: D95051387 fbshipit-source-id: 2a9f0cfeef37ec1903d42259bec3518af721410c --- scripts/releases/create-release-commit.js | 6 +++++ scripts/releases/utils/hermes-utils.js | 29 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/scripts/releases/create-release-commit.js b/scripts/releases/create-release-commit.js index 09d4f7cc888..78411be4c6c 100644 --- a/scripts/releases/create-release-commit.js +++ b/scripts/releases/create-release-commit.js @@ -9,6 +9,9 @@ */ const {setVersion} = require('../releases/set-version'); +const { + setStableHermesForReleaseBranch, +} = require('../releases/utils/hermes-utils'); const {getBranchName} = require('../releases/utils/scm-utils'); const { writeReleaseAssetUrlsToDotSlashFiles, @@ -52,6 +55,9 @@ async function main() { console.info('Setting version for monorepo packages and react-native'); await setVersion(version, false); // version, skip-react-native + console.info('Set stable Hermes for release branch'); + await setStableHermesForReleaseBranch(); + console.info('Writing release asset URLs to DotSlash files'); await writeReleaseAssetUrlsToDotSlashFiles(version); diff --git a/scripts/releases/utils/hermes-utils.js b/scripts/releases/utils/hermes-utils.js index dd067788afb..f911f4240e2 100644 --- a/scripts/releases/utils/hermes-utils.js +++ b/scripts/releases/utils/hermes-utils.js @@ -25,6 +25,13 @@ const MAVEN_VERSIONS_FILE_PATH = path.join( 'version.properties', ); +const GRADLE_PROPERTIES_PATH = path.join( + REACT_NATIVE_PACKAGE_DIR, + '..', + '..', + 'gradle.properties', +); + async function getLatestHermesNightlyVersion() /*: Promise<{ compilerVersion: string, compilerV1Version: string, @@ -51,6 +58,27 @@ async function getLatestHermesNightlyVersion() /*: Promise<{ }; } +/** + * Updates gradle.properties to use stable Hermes instead of nightly. + * This is needed because main uses nightly Hermes, but release branches + * should use stable Hermes from Maven Central. + */ +async function setStableHermesForReleaseBranch() { + let content = await fs.readFile(GRADLE_PROPERTIES_PATH, 'utf8'); + + content = content.replace( + 'react.internal.useHermesStable=false', + 'react.internal.useHermesStable=true', + ); + content = content.replace( + 'react.internal.useHermesNightly=true', + 'react.internal.useHermesNightly=false', + ); + + await fs.writeFile(GRADLE_PROPERTIES_PATH, content, 'utf8'); + console.info('Switched gradle.properties to use stable Hermes'); +} + async function updateHermesCompilerVersionInDependencies( hermesVersion /*: string */, ) /*: Promise */ { @@ -95,6 +123,7 @@ async function updateHermesVersionsToNightly() { } module.exports = { + setStableHermesForReleaseBranch, updateHermesVersionsToNightly, updateHermesCompilerVersionInDependencies, updateHermesRuntimeDependenciesVersions, From 41b009f989cbb339d2013dba2d1ed4ad6e9b7f95 Mon Sep 17 00:00:00 2001 From: hobostay <110hqc@gmail.com> Date: Tue, 3 Mar 2026 16:45:12 -0800 Subject: [PATCH 039/595] Fix typos: "boostrap" -> "bootstrap" and "informations" -> "information" (#55849) Summary: This PR fixes simple typos found in error messages: - **apple.js**: Fixed "boostrap" -> "bootstrap" in error messages (lines 67, 169) - **CppHelpers.js**: Fixed "informations" -> "information" in error messages (lines 75, 87, 101) Note: "information" is an uncountable noun in English and should not be pluralized. Changelog: [Internal] [Changed] - Pull Request resolved: https://github.com/facebook/react-native/pull/55849 Test Plan: These are typo fixes in error message strings. No code behavior changes. Reviewed By: cipolleschi Differential Revision: D94905006 Pulled By: cortinico fbshipit-source-id: a6a7185cf3aeb8739212a06115100ede097b0b4c --- packages/core-cli-utils/src/private/apple.js | 4 ++-- .../src/generators/components/CppHelpers.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core-cli-utils/src/private/apple.js b/packages/core-cli-utils/src/private/apple.js index 691a6147ba1..9bea66afbb1 100644 --- a/packages/core-cli-utils/src/private/apple.js +++ b/packages/core-cli-utils/src/private/apple.js @@ -64,7 +64,7 @@ function checkPodfileInSyncWithManifest( ); } } catch (e) { - throw new Error('Please run: yarn run boostrap ios: ' + e.message); + throw new Error('Please run: yarn run bootstrap ios: ' + e.message); } } @@ -166,7 +166,7 @@ export const tasks = { fs.constants.F_OK | fs.constants.R_OK, ); } catch (e) { - throw new Error('Please run: yarn run boostrap ios: ' + e.message); + throw new Error('Please run: yarn run bootstrap ios: ' + e.message); } } checkPodfileInSyncWithManifest( diff --git a/packages/react-native-codegen/src/generators/components/CppHelpers.js b/packages/react-native-codegen/src/generators/components/CppHelpers.js index d027eb2b153..e09977af105 100644 --- a/packages/react-native-codegen/src/generators/components/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/components/CppHelpers.js @@ -72,7 +72,7 @@ function getCppArrayTypeForAnnotation( case 'object': if (!structParts) { throw new Error( - `Trying to generate the event emitter for an Array of ${typeElement.type} without informations to generate the generic type`, + `Trying to generate the event emitter for an Array of ${typeElement.type} without information to generate the generic type`, ); } return `std::vector<${generateEventStructName(structParts)}>`; @@ -84,7 +84,7 @@ function getCppArrayTypeForAnnotation( ) { if (!structParts) { throw new Error( - `Trying to generate the event emitter for an Array of ${typeElement.type} without informations to generate the generic type`, + `Trying to generate the event emitter for an Array of ${typeElement.type} without information to generate the generic type`, ); } return `std::vector<${generateEventStructName(structParts)}>`; From 7f1a1e6c93ec1acd34b5756656210ccea97fb4a6 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 3 Mar 2026 18:55:45 -0800 Subject: [PATCH 040/595] Fix ClipboardUsage: Suppress lint in ClipboardModule (#55889) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55889 Fixed ClipboardUsage androidlint error in ClipboardModule.kt by adding SuppressLint("ClipboardUsage") annotations to the getString() and setString() methods. ClipboardModule is a React Native module whose sole purpose is to provide clipboard read/write functionality to JavaScript. Accessing the system ClipboardManager is fundamental to its operation, so the lint suppression is the appropriate fix. This follows the same pattern used by other clipboard-accessing code in the codebase (e.g., MobileHomeClipboardManager, WorkCopyPasteManager, SystemClipboardReader). changelog: [internal] internal Reviewed By: cortinico Differential Revision: D95008585 fbshipit-source-id: a1ff6a2247a32cb56e17bd8cb290355317f53e1f --- .../com/facebook/react/modules/clipboard/ClipboardModule.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/clipboard/ClipboardModule.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/clipboard/ClipboardModule.kt index c549acec9a7..74a7975e284 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/clipboard/ClipboardModule.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/clipboard/ClipboardModule.kt @@ -7,6 +7,7 @@ package com.facebook.react.modules.clipboard +import android.annotation.SuppressLint import android.content.ClipData import android.content.ClipboardManager import android.content.Context @@ -22,6 +23,7 @@ internal class ClipboardModule(context: ReactApplicationContext) : NativeClipboa private val clipboardService: ClipboardManager get() = reactApplicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + @SuppressLint("ClipboardUsage") override fun getString(promise: Promise) { try { val clipboard = clipboardService @@ -37,6 +39,7 @@ internal class ClipboardModule(context: ReactApplicationContext) : NativeClipboa } } + @SuppressLint("ClipboardUsage") override fun setString(text: String?) { val clipdata: ClipData = ClipData.newPlainText(null, text) clipboardService.setPrimaryClip(clipdata) From 9ebb3259f0d59b4cee0f84272f56354674dba030 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Tue, 3 Mar 2026 23:53:36 -0800 Subject: [PATCH 041/595] Add getDefinedEventHandlers API (#55861) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55861 Add `Fantom.getDefinedEventHandlers(element)` which returns the names of event handlers registered on a component. It Reads committed memoizedProps from the React fiber, so it works for any component type — including component-specific events like ScrollView's onScroll. The alternative we considered was reading the ViewEvents bitmap from `BaseViewProps` in the ShadowNode (C++). That approach only covers View-specific touch/pointer events and onLayout; it misses component-specific events dispatched imperatively (e.g. ScrollView's onScroll), requiring a separate codepath per component type. Changelog: [Internal] Reviewed By: javache Differential Revision: D94936370 fbshipit-source-id: f48b6e37a9e7cf252f396db69e1a43ecca82db96 --- .../__tests__/FantomEventHandlers-itest.js | 80 +++++++++++++++++++ private/react-native-fantom/src/index.js | 31 ++++++- .../tester/src/NativeFantom.cpp | 7 +- 3 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 packages/react-native/Libraries/Components/View/__tests__/FantomEventHandlers-itest.js diff --git a/packages/react-native/Libraries/Components/View/__tests__/FantomEventHandlers-itest.js b/packages/react-native/Libraries/Components/View/__tests__/FantomEventHandlers-itest.js new file mode 100644 index 00000000000..3964061110e --- /dev/null +++ b/packages/react-native/Libraries/Components/View/__tests__/FantomEventHandlers-itest.js @@ -0,0 +1,80 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment'; + +import * as Fantom from '@react-native/fantom'; +import * as React from 'react'; +import {createRef} from 'react'; +import {ScrollView, View} from 'react-native'; + +describe('Fantom.getDefinedEventHandlers', () => { + it('returns event handler names registered on a view', () => { + const root = Fantom.createRoot(); + const ref = createRef>(); + + Fantom.runTask(() => { + root.render( + {}} onTouchStart={() => {}} />, + ); + }); + + const handlers = Fantom.getDefinedEventHandlers(ref); + expect(handlers).toContain('onLayout'); + expect(handlers).toContain('onTouchStart'); + }); + + it('returns an empty array when no event handlers are registered', () => { + const root = Fantom.createRoot(); + const ref = createRef>(); + + Fantom.runTask(() => { + root.render(); + }); + + expect(Fantom.getDefinedEventHandlers(ref)).toEqual([]); + }); + + it('returns multiple event handler names when multiple are registered', () => { + const root = Fantom.createRoot(); + const ref = createRef>(); + + Fantom.runTask(() => { + root.render( + {}} + onTouchStart={() => {}} + onTouchEnd={() => {}} + onTouchCancel={() => {}} + onClick={() => {}} + />, + ); + }); + + const handlers = Fantom.getDefinedEventHandlers(ref); + expect(handlers).toContain('onLayout'); + expect(handlers).toContain('onTouchStart'); + expect(handlers).toContain('onTouchEnd'); + expect(handlers).toContain('onTouchCancel'); + expect(handlers).toContain('onClick'); + }); + + it('detects onScroll on a ScrollView', () => { + const root = Fantom.createRoot(); + const ref = createRef>(); + + Fantom.runTask(() => { + root.render( {}} />); + }); + + expect(Fantom.getDefinedEventHandlers(ref)).toContain('onScroll'); + }); +}); diff --git a/private/react-native-fantom/src/index.js b/private/react-native-fantom/src/index.js index c5cad6b86be..85978d9669f 100644 --- a/private/react-native-fantom/src/index.js +++ b/private/react-native-fantom/src/index.js @@ -23,7 +23,10 @@ import {LogBox} from 'react-native'; import NativeFantom, { NativeEventCategory, } from 'react-native/src/private/testing/fantom/specs/NativeFantom'; -import {getNativeNodeReference} from 'react-native/src/private/webapis/dom/nodes/internals/NodeInternals'; +import { + getInstanceHandle, + getNativeNodeReference, +} from 'react-native/src/private/webapis/dom/nodes/internals/NodeInternals'; import ReadOnlyNode from 'react-native/src/private/webapis/dom/nodes/ReadOnlyNode'; const nativeRuntimeScheduler = global.nativeRuntimeScheduler; @@ -237,6 +240,32 @@ export function unstable_getFabricUpdateProps(nodeOrRef: NodeOrRef): Readonly<{ return NativeFantom.getFabricUpdateProps(shadowNode); } +/** + * Returns the names of event handlers registered on a component's shadow node. + * + * @param nodeOrRef - The node or ref for which to retrieve event handlers. + * @returns Array of event handler prop names (e.g. `['onLayout', 'onTouchStart']`) + */ +export function getDefinedEventHandlers( + nodeOrRef: NodeOrRef, +): ReadonlyArray { + const node = getNode(nodeOrRef); + const instanceHandle = getInstanceHandle(node); + if (typeof instanceHandle !== 'object' || instanceHandle == null) { + return []; + } + // WARNING: This uses React private API (fiber internals). + // $FlowExpectedError[incompatible-type] + const memoizedProps = (instanceHandle as {memoizedProps?: {[string]: mixed}}) + .memoizedProps; + if (memoizedProps == null) { + return []; + } + return Object.keys(memoizedProps).filter( + key => key.startsWith('on') && typeof memoizedProps[key] === 'function', + ); +} + /** * Simulates running a task on the UI thread and forces side effect to drain * the event queue, scheduling events to be dispatched to JavaScript. diff --git a/private/react-native-fantom/tester/src/NativeFantom.cpp b/private/react-native-fantom/tester/src/NativeFantom.cpp index 5b677922876..5b18de49145 100644 --- a/private/react-native-fantom/tester/src/NativeFantom.cpp +++ b/private/react-native-fantom/tester/src/NativeFantom.cpp @@ -86,7 +86,8 @@ std::string NativeFantom::getRenderedOutput( SurfaceId surfaceId, NativeFantomGetRenderedOutputRenderFormatOptions options) { RenderFormatOptions formatOptions{ - options.includeRoot, options.includeLayoutMetrics}; + .includeRoot = options.includeRoot, + .includeLayoutMetrics = options.includeLayoutMetrics}; auto viewTree = appDelegate_.mountingManager_->getViewTree(surfaceId); return appDelegate_.mountingManager_->renderer()->render( @@ -124,10 +125,10 @@ void NativeFantom::enqueueNativeEvent( std::optional isUnique) { if (isUnique.value_or(false)) { shadowNode->getEventEmitter()->dispatchUniqueEvent( - std::move(type), payload.value_or(folly::dynamic::object())); + type, payload.value_or(folly::dynamic::object())); } else { shadowNode->getEventEmitter()->dispatchEvent( - std::move(type), + type, payload.value_or(folly::dynamic::object()), category.value_or(RawEvent::Category::Unspecified)); } From 863f76bd490b2e7a9621f9a7c03d0b4295e32e60 Mon Sep 17 00:00:00 2001 From: Luke Harvey Date: Wed, 4 Mar 2026 00:35:41 -0800 Subject: [PATCH 042/595] Fix autoCapitalize bitmask collision with numeric inputType flags (#55786) Summary: `setAutoCapitalize` applies `AUTOCAPITALIZE_FLAGS` (`0x7000`) to all input types, but this mask overlaps `TYPE_NUMBER_FLAG_SIGNED` (`0x1000`) and `TYPE_NUMBER_FLAG_DECIMAL` (`0x2000`). On every Fabric re-render, this strips the signed/decimal flags from numeric inputs, causing `commitStagedInputType` to call `setInputType()` with corrupted flags, which restarts the IME and breaks composing-based input (e.g. Samsung keyboards' shared `.`/`-` key). The fix skips `setAutoCapitalize` for `TYPE_CLASS_NUMBER` inputs, where autocapitalize is meaningless. ## Changelog: [Android] [Fixed] - Fix `setAutoCapitalize` stripping numeric `TextInput` flags (`TYPE_NUMBER_FLAG_SIGNED`/`DECIMAL`), affecting minus sign input on Samsung keyboards Pull Request resolved: https://github.com/facebook/react-native/pull/55786 Test Plan: A unit test was added to `ReactTextInputPropertyTest.kt` that verifies `setAutoCapitalize` does not strip `TYPE_NUMBER_FLAG_SIGNED` or `TYPE_NUMBER_FLAG_DECIMAL` when the input type class is `TYPE_CLASS_NUMBER`. Reviewed By: javache Differential Revision: D95049029 Pulled By: NickGerleman fbshipit-source-id: 695b1394f7df04ace782319c5847b40bfd2a5d7f --- .../react/views/textinput/ReactEditText.kt | 1 + .../views/textinput/ReactTextInputManager.kt | 27 ++++++++- .../textinput/ReactTextInputPropertyTest.kt | 59 +++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt index ff410da5cae..f1dffff8552 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt @@ -117,6 +117,7 @@ public open class ReactEditText public constructor(context: Context) : AppCompat private var listeners: CopyOnWriteArrayList? public var stagedInputType: Int + internal var stagedAutoCapitalize: Int = 0 public var submitBehavior: String? = null public var dragAndDropFilter: List? = null diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt index 83cbb9a7533..b48698d33ff 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt @@ -718,7 +718,9 @@ public open class ReactTextInputManager public constructor() : } } - updateStagedInputTypeFlag(view, AUTOCAPITALIZE_FLAGS, autoCapitalizeValue) + // Deferred to onAfterUpdateTransaction() so we can reconcile with the resolved + // keyboard type — AUTOCAPITALIZE_FLAGS collides with numeric inputType flags. + view.stagedAutoCapitalize = autoCapitalizeValue } @ReactProp(name = "keyboardType") @@ -882,6 +884,7 @@ public open class ReactTextInputManager public constructor() : override fun onAfterUpdateTransaction(view: ReactEditText) { super.onAfterUpdateTransaction(view) view.maybeUpdateTypeface() + reconcileAutoCapitalize(view) view.commitStagedInputType() } @@ -1129,6 +1132,28 @@ public open class ReactTextInputManager public constructor() : private const val IME_ACTION_ID = 0x670 + // AUTOCAPITALIZE_FLAGS (0x7000) shares bit positions with TYPE_NUMBER_FLAG_SIGNED + // (0x1000) and TYPE_NUMBER_FLAG_DECIMAL (0x2000). We apply autocapitalize here + // after all props are set so the resolved input class determines whether the + // flags are meaningful. + private fun reconcileAutoCapitalize(view: ReactEditText) { + val autoCapValue = view.stagedAutoCapitalize + val inputClass = view.stagedInputType and InputType.TYPE_MASK_CLASS + + // Only strip 0x4000 (CAP_SENTENCES) for non-text classes — 0x1000/0x2000 are + // valid numeric flags (SIGNED/DECIMAL) and must not be cleared. + val reconciled = + if (inputClass == InputType.TYPE_CLASS_TEXT) { + (view.stagedInputType and AUTOCAPITALIZE_FLAGS.inv()) or autoCapValue + } else { + view.stagedInputType and InputType.TYPE_TEXT_FLAG_CAP_SENTENCES.inv() + } + + if (view.stagedInputType != reconciled) { + view.stagedInputType = reconciled + } + } + // Sets the correct password type, since numeric and text passwords have different types private fun checkPasswordType(view: ReactEditText) { if ( diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.kt index 1fc4004dc54..844e237e69c 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.kt @@ -125,6 +125,65 @@ class ReactTextInputPropertyTest { assertThat(view.inputType and InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS).isZero } + @Test + fun testAutoCapitalizeDoesNotStripNumericFlags() { + val numericTypeFlags = + (InputType.TYPE_CLASS_NUMBER or + InputType.TYPE_NUMBER_FLAG_DECIMAL or + InputType.TYPE_NUMBER_FLAG_SIGNED) + + manager.updateProperties(view, buildStyles("keyboardType", "numeric")) + assertThat(view.inputType and numericTypeFlags).isEqualTo(numericTypeFlags) + + manager.updateProperties( + view, + buildStyles("autoCapitalize", InputType.TYPE_TEXT_FLAG_CAP_SENTENCES), + ) + assertThat(view.inputType and InputType.TYPE_NUMBER_FLAG_SIGNED).isNotZero + assertThat(view.inputType and InputType.TYPE_NUMBER_FLAG_DECIMAL).isNotZero + } + + @Test + fun testAutoCapitalizeAndNumericKeyboardInSameTransaction() { + val numericTypeFlags = + (InputType.TYPE_CLASS_NUMBER or + InputType.TYPE_NUMBER_FLAG_DECIMAL or + InputType.TYPE_NUMBER_FLAG_SIGNED) + + manager.updateProperties( + view, + buildStyles( + "autoCapitalize", + InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, + "keyboardType", + "numeric", + ), + ) + assertThat(view.inputType and numericTypeFlags).isEqualTo(numericTypeFlags) + assertThat(view.inputType and InputType.TYPE_TEXT_FLAG_CAP_SENTENCES).isZero + } + + @Test + fun testAutoCapitalizeReappliesWhenKeyboardTypeChangesFromNumericToText() { + // CAP_SENTENCES (0x4000) doesn't share a bit position with any numeric flag, + // unlike CAP_WORDS (0x2000) / CAP_CHARACTERS (0x1000). + manager.updateProperties( + view, + buildStyles( + "autoCapitalize", + InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, + "keyboardType", + "numeric", + ), + ) + assertThat(view.inputType and InputType.TYPE_MASK_CLASS).isEqualTo(InputType.TYPE_CLASS_NUMBER) + assertThat(view.inputType and InputType.TYPE_TEXT_FLAG_CAP_SENTENCES).isZero + + manager.updateProperties(view, buildStyles("keyboardType", "default")) + assertThat(view.inputType and InputType.TYPE_MASK_CLASS).isEqualTo(InputType.TYPE_CLASS_TEXT) + assertThat(view.inputType and InputType.TYPE_TEXT_FLAG_CAP_SENTENCES).isNotZero + } + @Test fun testPlaceholder() { manager.updateProperties(view, buildStyles()) From a3a8991d646a5734435e14b11692dbe10b538b9a Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 4 Mar 2026 01:07:00 -0800 Subject: [PATCH 043/595] Add reset tests for View prop transformations (#55893) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55893 add tests to validate that aria-* props are set back to default correctly when set to undefined Changelog: [Internal] Reviewed By: javache Differential Revision: D95061571 fbshipit-source-id: c035132638fe7223ef544fb422c1a12f57c5fdb6 --- .../Components/View/__tests__/View-itest.js | 170 +++++++++++++++++- 1 file changed, 169 insertions(+), 1 deletion(-) diff --git a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js index 97ce3c373ce..0ad79c3d02d 100644 --- a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js +++ b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js @@ -403,9 +403,35 @@ describe('', () => { root.render(); }); - expect(root.getRenderedOutput().toJSX()).toEqual( + expect( + root + .getRenderedOutput({props: ['importantForAccessibility']}) + .toJSX(), + ).toEqual( + , + ); + }); + + it('resets importantForAccessibility when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root + .getRenderedOutput({props: ['importantForAccessibility']}) + .toJSX(), + ).toEqual( , ); + Fantom.runTask(() => { + root.render(); + }); + expect( + root + .getRenderedOutput({props: ['importantForAccessibility']}) + .toJSX(), + ).toEqual(); }); }); @@ -534,6 +560,22 @@ describe('', () => { root.getRenderedOutput({props: ['accessibilityLabel']}).toJSX(), ).toEqual(); }); + + it('resets accessibilityLabel when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityLabel']}).toJSX(), + ).toEqual(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityLabel']}).toJSX(), + ).toEqual(); + }); }); describe('aria-live', () => { @@ -550,6 +592,26 @@ describe('', () => { .toJSX(), ).toEqual(); }); + + it('resets accessibilityLiveRegion when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root + .getRenderedOutput({props: ['accessibilityLiveRegion']}) + .toJSX(), + ).toEqual(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root + .getRenderedOutput({props: ['accessibilityLiveRegion']}) + .toJSX(), + ).toEqual(); + }); }); describe('aria-busy', () => { @@ -566,6 +628,24 @@ describe('', () => { , ); }); + + it('resets accessibilityState when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual(); + }); }); describe('aria-disabled', () => { @@ -582,6 +662,24 @@ describe('', () => { , ); }); + + it('resets accessibilityState when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual(); + }); }); describe('aria-expanded', () => { @@ -598,6 +696,24 @@ describe('', () => { , ); }); + + it('resets accessibilityState when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual(); + }); }); describe('aria-selected', () => { @@ -614,6 +730,24 @@ describe('', () => { , ); }); + + it('resets accessibilityState when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual(); + }); }); describe('aria-checked', () => { @@ -630,6 +764,24 @@ describe('', () => { , ); }); + + it('resets accessibilityState when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + Fantom.runTask(() => { + root.render(); + }); + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual(); + }); }); }); @@ -669,6 +821,22 @@ describe('', () => { , ); }); + + it('resets nativeID when set to undefined', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + expect(root.getRenderedOutput({props: ['nativeID']}).toJSX()).toEqual( + , + ); + Fantom.runTask(() => { + root.render(); + }); + expect(root.getRenderedOutput({props: ['nativeID']}).toJSX()).toEqual( + , + ); + }); }); describe('nativeID', () => { From 851e5ae546ea27db5ba657630e236f2945a8c929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Wed, 4 Mar 2026 01:55:35 -0800 Subject: [PATCH 044/595] Parser refactor (#55772) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55772 The `main.py` increases rapidly in size. This diff refactors that into the `utils.py` and `builder.py` to form more modularized and easier to read structure. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94072940 fbshipit-source-id: f4b7b3c3bf4e2cf387829ced039d5645e2ad4b3e --- scripts/cxx-api/parser/builders.py | 561 +++++++++++++ scripts/cxx-api/parser/main.py | 754 +----------------- scripts/cxx-api/parser/member.py | 44 +- scripts/cxx-api/parser/utils/__init__.py | 12 + .../cxx-api/parser/utils/text_resolution.py | 225 ++++++ .../snapshot.api | 2 +- 6 files changed, 836 insertions(+), 762 deletions(-) create mode 100644 scripts/cxx-api/parser/builders.py create mode 100644 scripts/cxx-api/parser/utils/text_resolution.py diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py new file mode 100644 index 00000000000..cbdded7612d --- /dev/null +++ b/scripts/cxx-api/parser/builders.py @@ -0,0 +1,561 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Builder functions for extracting members from Doxygen XML and creating scopes. + +This module contains: +- Member extraction functions (get_*_member) +- Scope creation functions (create_*_scope) +""" + +from __future__ import annotations + +import re + +from doxmlparser import compound + +from .member import ( + ConceptMember, + EnumMember, + FriendMember, + FunctionMember, + PropertyMember, + TypedefMember, + VariableMember, +) +from .scope import InterfaceScopeKind, ProtocolScopeKind, StructLikeScopeKind +from .snapshot import Snapshot +from .template import Template +from .utils import ( + Argument, + extract_qualifiers, + InitializerType, + parse_qualified_path, + resolve_linked_text_name, + resolve_ref_text_name, +) + + +###################### +# Member extraction +###################### + + +def get_base_classes( + compound_object: compound.CompounddefType, + base_class=StructLikeScopeKind.Base, +) -> list: + """ + Get the base classes of a compound object. + """ + base_classes = [] + if compound_object.basecompoundref: + for base in compound_object.basecompoundref: + # base is a compoundRefType with: + # - refid: reference ID to the base class definition + # - prot: protection level (public, protected, private) + # - virt: virtual inheritance (non-virtual, virtual, pure-virtual) + # - valueOf_: the name of the base class + base_name = base.valueOf_ + base_prot = base.prot + base_virt = base.virt + base_refid = base.refid + + if base_prot == "private": + # Ignore private base classes + continue + + base_classes.append( + base_class( + base_name, + base_prot, + base_virt == "virtual", + base_refid, + ) + ) + return base_classes + + +def get_template_params( + compound_object: compound.CompounddefType, +) -> [Template]: + """ + Get the template parameters of a compound object. + """ + template_params = [] + if compound_object.templateparamlist is not None: + for param in compound_object.templateparamlist.param: + template_value = ( + resolve_linked_text_name(param.defval)[0] if param.defval else None + ) + template_name = param.defname + template_type = resolve_linked_text_name(param.get_type())[0] + + if template_name is None: + # Split type string and extract name from the end + # Handles: "typename T", "class T", "int N", etc. + parts = template_type.strip().split() + if len(parts) >= 2: + template_type = " ".join(parts[:-1]) + template_name = parts[-1] + elif len(parts) == 1: + # Check if this is an unnamed template parameter + # (just "typename" or "class" with or without a default value) + # In this case, we leave name as None/empty + if parts[0] in ("typename", "class"): + # Unnamed template parameter + # e.g., "typename" or "typename = std::enable_if_t<...>" + template_name = None + else: + # Just a name like "T" with no type keyword + template_name = parts[0] + + template_params.append( + Template(template_type, template_name, template_value) + ) + return template_params + + +def get_variable_member( + member_def: compound.MemberdefType, + visibility: str, + is_static: bool = False, +) -> VariableMember: + """ + Get the variable member from a member definition. + """ + variable_name = member_def.get_name() + + if len(variable_name) == 0: + # Ignore anonymous variables + return None + + (variable_type, _) = resolve_linked_text_name(member_def.get_type()) + variable_value = None + variable_definition = member_def.definition + variable_argstring = member_def.get_argsstring() + + is_constexpr = member_def.constexpr == "yes" + is_mutable = member_def.mutable == "yes" + + if is_constexpr and variable_type.find("constexpr") != -1: + variable_type = variable_type.replace("constexpr", "").strip() + + is_const = variable_type.startswith("const") + if is_const: + variable_type = variable_type[5:].strip() + + is_brace_initializer = False + if member_def.initializer is not None: + (variable_value, initializer_type) = resolve_linked_text_name( + member_def.initializer, + strip_initializers=True, + ) + if initializer_type == InitializerType.BRACE: + is_brace_initializer = True + + return VariableMember( + variable_name, + variable_type, + visibility, + is_const, + is_static, + is_constexpr, + is_mutable, + variable_value, + variable_definition, + variable_argstring, + is_brace_initializer, + ) + + +def get_doxygen_params( + function_def: compound.MemberdefType, +) -> list[tuple[str | None, str, str | None, str | None]] | None: + """ + Extract structured parameter information from doxygen elements. + + Returns a list of Argument tuples (qualifiers, type, name, default_value), + or None if no elements are available. + """ + params = function_def.param + if not params: + return None + + arguments: list[Argument] = [] + for param in params: + param_type = ( + resolve_linked_text_name(param.get_type())[0].strip() + if param.get_type() + else "" + ) + param_name = param.declname or param.defname or None + param_default = ( + resolve_linked_text_name(param.defval)[0].strip() if param.defval else None + ) + + # Doxygen splits array dimensions into a separate element. + # For complex declarators like "PropNameID (&&propertyNames)[N]", + # doxygen gives type="PropNameID(&&)", name="propertyNames", + # array="[N]". We must reconstruct the full declarator with the + # name embedded inside the grouping parentheses: + # PropNameID(&&propertyNames)[N] + param_array = param.array + if param_array: + # Match type ending with a pointer/reference declarator group: + # e.g. "PropNameID(&&)", "int(&)", "void(*)" + m = re.search(r"\([*&]+\)\s*$", param_type) + if m and param_name: + # Insert name before the closing ')' and append array + insert_pos = m.end() - 1 # position of trailing ')' + param_type = ( + param_type[:insert_pos] + + param_name + + param_type[insert_pos:] + + param_array + ) + param_name = None + else: + param_type += param_array + + qualifiers, core_type = extract_qualifiers(param_type) + arguments.append((qualifiers, core_type, param_name, param_default)) + + return arguments + + +def get_function_member( + function_def: compound.MemberdefType, + visibility: str, + is_static: bool = False, +) -> FunctionMember: + """ + Get the function member from a member definition. + """ + function_name = function_def.get_name() + function_type = resolve_linked_text_name(function_def.get_type())[0] + function_arg_string = function_def.get_argsstring() + is_pure_virtual = function_def.get_virt() == "pure-virtual" + function_virtual = function_def.get_virt() == "virtual" or is_pure_virtual + is_constexpr = function_def.constexpr == "yes" + + # Doxygen incorrectly merges "=0" into the return type for pure-virtual + # functions using trailing return types (e.g. "auto f() -> T = 0"). + # Strip the trailing "=0" from the type string. + function_type = re.sub(r"\s*=\s*0\s*$", "", function_type) + + # For constexpr constructors, Doxygen outputs "constexpr" both as an + # attribute (constexpr="yes") and as the return type (constexpr). + # Remove the redundant type to avoid "constexpr constexpr" in output. + if is_constexpr and function_type == "constexpr": + function_type = "" + + doxygen_params = get_doxygen_params(function_def) + + function = FunctionMember( + function_name, + function_type, + visibility, + function_arg_string, + function_virtual, + is_pure_virtual, + is_static, + doxygen_params, + is_constexpr, + ) + + function.add_template(get_template_params(function_def)) + + return function + + +def get_typedef_member( + typedef_def: compound.memberdefType, visibility: str +) -> TypedefMember: + typedef_name = typedef_def.get_name() + typedef_type = resolve_ref_text_name(typedef_def.get_type()) + typedef_argstring = typedef_def.get_argsstring() + typedef_definition = typedef_def.definition + + typedef_keyword = "using" + if typedef_definition.startswith("typedef"): + typedef_keyword = "typedef" + + typedef = TypedefMember( + typedef_name, + typedef_type, + typedef_argstring, + visibility, + typedef_keyword, + ) + + typedef.add_template(get_template_params(typedef_def)) + + return typedef + + +def get_concept_member( + concept_def: compound.CompounddefType, +) -> ConceptMember: + """ + Get the concept member from a compound definition. + """ + concept_name = concept_def.compoundname + concept_path = parse_qualified_path(concept_name) + unqualified_name = concept_path[-1] + + initializer = concept_def.initializer + constraint = "" + + if initializer: + # The initializer contains the entire constraind definition. + # We want to extract the constraint part after "=" + initializer_text = resolve_linked_text_name(initializer)[0] + eq_pos = initializer_text.find("=") + if eq_pos != -1: + constraint = initializer_text[eq_pos + 1 :].strip() + + concept = ConceptMember(unqualified_name, constraint) + concept.add_template(get_template_params(concept_def)) + + return concept + + +def get_property_member( + member_def: compound.MemberdefType, + visibility: str, + is_static: bool = False, +) -> PropertyMember: + """ + Get the property member from a member definition. + """ + property_name = member_def.get_name() + property_type = resolve_ref_text_name(member_def.get_type()).strip() + accessor = member_def.accessor if hasattr(member_def, "accessor") else None + is_readable = getattr(member_def, "readable", "no") == "yes" + is_writable = getattr(member_def, "writable", "no") == "yes" + + return PropertyMember( + property_name, + property_type, + visibility, + is_static, + accessor, + is_readable, + is_writable, + ) + + +###################### +# Scope creation +###################### + + +def create_enum_scope(snapshot: Snapshot, enum_def: compound.EnumdefType) -> None: + """ + Create an enum scope in the snapshot. + """ + scope = snapshot.create_enum(enum_def.qualifiedname) + scope.kind.type = resolve_ref_text_name(enum_def.get_type()) + scope.location = enum_def.location.file + + for enum_value_def in enum_def.enumvalue: + value_name = enum_value_def.get_name() + value_value = None + + if enum_value_def.initializer is not None: + value_value = resolve_linked_text_name(enum_value_def.initializer) + + scope.add_member( + EnumMember( + value_name, + value_value, + ), + ) + + +def _process_objc_sections( + snapshot: Snapshot, + scope, + section_defs: list, + location_file: str, + scope_type: str, +) -> None: + """ + Common section processing for protocols and interfaces. + """ + for section_def in section_defs: + kind = section_def.kind + parts = kind.split("-") + visibility = parts[0] + is_static = "static" in parts + member_type = parts[-1] + + if visibility == "private": + pass + elif visibility in ("public", "protected"): + if member_type == "attrib": + for member_def in section_def.memberdef: + if member_def.kind == "variable": + scope.add_member( + get_variable_member(member_def, visibility, is_static) + ) + elif member_type == "func": + for function_def in section_def.memberdef: + scope.add_member( + get_function_member(function_def, visibility, is_static) + ) + elif member_type == "type": + for member_def in section_def.memberdef: + if member_def.kind == "enum": + create_enum_scope(snapshot, member_def) + elif member_def.kind == "typedef": + scope.add_member(get_typedef_member(member_def, visibility)) + else: + print( + f"Unknown section member kind: {member_def.kind} in {location_file}" + ) + else: + print(f"Unknown {scope_type} section kind: {kind} in {location_file}") + elif visibility == "property": + for member_def in section_def.memberdef: + if member_def.kind == "property": + scope.add_member( + get_property_member(member_def, "public", is_static) + ) + else: + print(f"Unknown {scope_type} visibility: {visibility} in {location_file}") + + +def create_protocol_scope( + snapshot: Snapshot, scope_def: compound.CompounddefType +) -> None: + """ + Create a protocol scope in the snapshot. + """ + protocol_name = scope_def.compoundname + if protocol_name.endswith("-p"): + protocol_name = protocol_name[:-2] + + protocol_scope = snapshot.create_protocol(protocol_name) + base_classes = get_base_classes(scope_def, base_class=ProtocolScopeKind.Base) + for base in base_classes: + base.name = base.name.strip("<>") + protocol_scope.kind.add_base(base_classes) + protocol_scope.location = scope_def.location.file + + _process_objc_sections( + snapshot, + protocol_scope, + scope_def.sectiondef, + scope_def.location.file, + "protocol", + ) + + +def create_interface_scope( + snapshot: Snapshot, scope_def: compound.CompounddefType +) -> None: + """ + Create an interface scope in the snapshot (Objective-C @interface). + """ + interface_name = scope_def.compoundname + + interface_scope = snapshot.create_interface(interface_name) + base_classes = get_base_classes(scope_def, base_class=InterfaceScopeKind.Base) + interface_scope.kind.add_base(base_classes) + interface_scope.location = scope_def.location.file + + _process_objc_sections( + snapshot, + interface_scope, + scope_def.sectiondef, + scope_def.location.file, + "interface", + ) + + +def create_class_scope( + snapshot: Snapshot, compound_object: compound.CompounddefType +) -> None: + """ + Create a class/struct/union scope in the snapshot. + """ + if compound_object.kind == "class": + class_scope = snapshot.create_struct_like( + compound_object.compoundname, StructLikeScopeKind.Type.CLASS + ) + elif compound_object.kind == "struct": + class_scope = snapshot.create_struct_like( + compound_object.compoundname, StructLikeScopeKind.Type.STRUCT + ) + else: + class_scope = snapshot.create_struct_like( + compound_object.compoundname, StructLikeScopeKind.Type.UNION + ) + + class_scope.kind.add_base(get_base_classes(compound_object)) + class_scope.kind.add_template(get_template_params(compound_object)) + class_scope.location = compound_object.location.file + + for section_def in compound_object.sectiondef: + kind = section_def.kind + parts = kind.split("-") + visibility = parts[0] + is_static = "static" in parts + member_type = parts[-1] + + if visibility == "private": + pass + elif visibility in ("public", "protected"): + if member_type == "attrib": + for member_def in section_def.memberdef: + if member_def.kind == "variable": + (var_type, _) = resolve_linked_text_name(member_def.get_type()) + + # Skip anonymous variables + if "@" in var_type: + continue + + if var_type == "friend": + class_scope.add_member( + FriendMember(member_def.get_name(), visibility) + ) + else: + class_scope.add_member( + get_variable_member(member_def, visibility, is_static) + ) + elif member_type == "func": + for function_def in section_def.memberdef: + class_scope.add_member( + get_function_member(function_def, visibility, is_static) + ) + elif member_type == "type": + for member_def in section_def.memberdef: + if member_def.kind == "enum": + create_enum_scope(snapshot, member_def) + elif member_def.kind == "typedef": + class_scope.add_member( + get_typedef_member(member_def, visibility) + ) + else: + print( + f"Unknown section member kind: {member_def.kind} in {compound_object.location.file}" + ) + else: + print( + f"Unknown class section kind: {kind} in {compound_object.location.file}" + ) + elif visibility == "friend": + pass + elif visibility == "property": + print( + f"Property not supported: {compound_object.compoundname} in {compound_object.location.file}" + ) + else: + print( + f"Unknown class visibility: {visibility} in {compound_object.location.file}" + ) diff --git a/scripts/cxx-api/parser/main.py b/scripts/cxx-api/parser/main.py index 2db54b9f26a..989fc2b1545 100644 --- a/scripts/cxx-api/parser/main.py +++ b/scripts/cxx-api/parser/main.py @@ -3,668 +3,28 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. +""" +Main entry point for building API snapshots from Doxygen XML output. +""" + from __future__ import annotations import os -import re -from enum import Enum from doxmlparser import compound, index -from .member import ( - ConceptMember, - EnumMember, - FriendMember, - FunctionMember, - PropertyMember, - TypedefMember, - VariableMember, +from .builders import ( + create_class_scope, + create_enum_scope, + create_interface_scope, + create_protocol_scope, + get_concept_member, + get_function_member, + get_typedef_member, + get_variable_member, ) -from .scope import InterfaceScopeKind, ProtocolScopeKind, StructLikeScopeKind from .snapshot import Snapshot -from .template import Template -from .utils import Argument, extract_qualifiers, parse_qualified_path - - -def decode_doxygen_template_encoding(encoded: str) -> str: - """Decode Doxygen's encoding for template specializations in refids. - - Doxygen encodes special characters in refids using underscore-prefixed codes: - - '_3' = '<' (template open) - - '_4' = '>' (template close) - - '_01' = ' ' (space) - - '_07' = '(' (open paren) - - '_08' = ')' (close paren) - - '_8_8_8' = '...' (variadic ellipsis) - - '_00' = ',' (comma) - - '_02' = '*' (pointer) - - '_05' = '=' (equals) - - '_06' = '&' (reference) - - e.g. 'SyncCallback_3_01R_07Args_8_8_8_08_4' -> 'SyncCallback< R(Args...)>' - """ - result = encoded - - # Process longer patterns first to avoid partial matches - result = result.replace("_8_8_8", "...") # Variadic ellipsis - - # Process two-char patterns (_0X codes) - result = result.replace("_00", ", ") # Comma (with space for readability) - result = result.replace("_01", " ") # Space - result = result.replace("_02", "*") # Pointer - result = result.replace("_05", "=") # Equals - result = result.replace("_06", "&") # Reference - result = result.replace("_07", "(") # Open paren - result = result.replace("_08", ")") # Close paren - - # Process single-char patterns last - result = result.replace("_3", "<") # Template open - result = result.replace("_4", ">") # Template close - - return result - - -def _strip_template_args(name: str) -> str: - """Strip template arguments from a type name. - - e.g. 'SyncCallback< R(Args...)>' -> 'SyncCallback' - """ - angle_idx = name.find("<") - return name[:angle_idx].rstrip() if angle_idx != -1 else name - - -def _qualify_text_with_refid(text: str, refid: str) -> str: - """Qualify a text symbol using the namespace extracted from its doxygen refid. - - For ref elements, doxygen provides a refid that encodes the fully qualified - path to the referenced symbol. This function extracts the namespace from - that refid and prepends it to the text, avoiding redundant qualification. - - Args: - text: The symbol text (e.g., "SyncCallback") - refid: The doxygen refid (e.g., "classfacebook_1_1react_1_1SyncCallback...") - - Returns: - The qualified text (e.g., "facebook::react::SyncCallback") - """ - ns = extract_namespace_from_refid(refid) - - # Skip re-qualification if text is already globally qualified - # (starts with "::") - it's already an absolute path - if not ns or text.startswith(ns) or text.startswith("::"): - return text - - # The text may already start with a trailing portion of the namespace. - # For example ns="facebook::react::HighResDuration" and - # text="HighResDuration::zero". We need to find the longest suffix of ns - # that is a prefix of text (on a "::" boundary) and only prepend the - # missing part. - ns_parts = ns.split("::") - prepend = ns - - for i in range(1, len(ns_parts)): - suffix = "::".join(ns_parts[i:]) - # Also compare without template args - for template specializations - # like "SyncCallback< R(Args...)>", text "SyncCallback" should match - base_suffix = _strip_template_args(ns_parts[i]) - if ( - text.startswith(suffix + "::") - or text == suffix - or text.startswith(base_suffix + "::") - or text == base_suffix - ): - prepend = "::".join(ns_parts[:i]) - break - - return prepend + "::" + text - - -def normalize_angle_brackets(text: str) -> str: - """Doxygen adds spaces around < and > to avoid XML ambiguity. - e.g. "NSArray< id< RCTBridgeMethod > > *" -> "NSArray> *" - """ - text = re.sub(r"<\s+", "<", text) - text = re.sub(r"\s+>", ">", text) - return text - - -def extract_namespace_from_refid(refid: str) -> str: - """Extract the namespace prefix from a doxygen refid. - e.g. 'namespacefacebook_1_1yoga_1a...' -> 'facebook::yoga' - 'structfacebook_1_1react_1_1detail_1_1is__dynamic' -> 'facebook::react::detail::is_dynamic' - 'classfacebook_1_1react_1_1SyncCallback_3_01R_07Args_8_8_8_08_4' -> 'facebook::react::SyncCallback< R(Args...)>' - - Doxygen encoding: - - '::' is encoded as '_1_1' - - '_' in identifiers is encoded as '__' (double underscore) - - Template specializations are encoded with hex-like codes (see decode_doxygen_template_encoding) - """ - for prefix in ("namespace", "struct", "class", "union"): - if refid.startswith(prefix): - compound_part = refid[len(prefix) :] - idx = compound_part.find("_1a") - if idx != -1: - compound_part = compound_part[:idx] - # First replace '::' encoding (_1_1 -> ::) - result = compound_part.replace("_1_1", "::") - # Then replace double underscore with single underscore - # (Doxygen encodes '_' in identifiers as '__') - result = result.replace("__", "_") - # Decode template specialization encodings - result = decode_doxygen_template_encoding(result) - return result - return "" - - -class InitializerType(Enum): - NONE = (0,) - ASSIGNMENT = (1,) - BRACE = 2 - - -def resolve_linked_text_name( - type_def: compound.linkedTextType, - strip_initializers: bool = False, -) -> (str, InitializerType): - """ - Resolve the full text content of a linkedTextType, including all text - fragments and ref elements. - """ - name = "" - in_string = False - - if hasattr(type_def, "content_") and type_def.content_: - for part in type_def.content_: - if part.category == 1: # MixedContainer.CategoryText - in_string = part.value.count('"') % 2 != in_string - name += part.value - elif part.category == 3: # MixedContainer.CategoryComplex (ref element) - # For ref elements, get the text content and fully qualify using refid - text = "" - if hasattr(part.value, "get_valueOf_"): - text = part.value.get_valueOf_() - elif hasattr(part.value, "valueOf_"): - text = part.value.valueOf_ - else: - text = str(part.value) - - # Don't resolve refs inside string literals - doxygen may - # incorrectly treat symbols in strings as references - refid = getattr(part.value, "refid", None) - if refid and not in_string: - text = _qualify_text_with_refid(text, refid) - - name += text - elif type_def.ref: - name = type_def.ref[0].get_valueOf_() - else: - name = type_def.get_valueOf_() - - initialier_type = InitializerType.NONE - if strip_initializers: - if name.startswith("="): - # Detect assignment initializers: = value - initialier_type = InitializerType.ASSIGNMENT - name = name[1:] - elif name.startswith("{") and name.endswith("}"): - # Detect brace initializers: {value} - initialier_type = InitializerType.BRACE - name = name[1:-1].strip() - - return (normalize_angle_brackets(name.strip()), initialier_type) - - -def get_base_classes( - compound_object: compound.CompounddefType, - base_class=StructLikeScopeKind.Base, -) -> list: - """ - Get the base classes of a compound object. - """ - base_classes = [] - if compound_object.basecompoundref: - for base in compound_object.basecompoundref: - # base is a compoundRefType with: - # - refid: reference ID to the base class definition - # - prot: protection level (public, protected, private) - # - virt: virtual inheritance (non-virtual, virtual, pure-virtual) - # - valueOf_: the name of the base class - base_name = base.valueOf_ - base_prot = base.prot - base_virt = base.virt - base_refid = base.refid - - if base_prot == "private": - # Ignore private base classes - continue - - base_classes.append( - base_class( - base_name, - base_prot, - base_virt == "virtual", - base_refid, - ) - ) - return base_classes - - -def get_template_params( - compound_object: compound.CompounddefType, -) -> [Template]: - """ - Get the template parameters of a compound object. - """ - template_params = [] - if compound_object.templateparamlist is not None: - for param in compound_object.templateparamlist.param: - template_value = ( - resolve_linked_text_name(param.defval)[0] if param.defval else None - ) - template_name = param.defname - template_type = resolve_linked_text_name(param.get_type())[0] - - if template_name is None: - # Split type string and extract name from the end - # Handles: "typename T", "class T", "int N", etc. - parts = template_type.strip().split() - if len(parts) >= 2: - template_type = " ".join(parts[:-1]) - template_name = parts[-1] - elif len(parts) == 1: - # Check if this is an unnamed template parameter - # (just "typename" or "class" with or without a default value) - # In this case, we leave name as None/empty - if parts[0] in ("typename", "class"): - # Unnamed template parameter - # e.g., "typename" or "typename = std::enable_if_t<...>" - template_name = None - else: - # Just a name like "T" with no type keyword - template_name = parts[0] - - template_params.append( - Template(template_type, template_name, template_value) - ) - return template_params - - -def get_variable_member( - member_def: compound.MemberdefType, - visibility: str, - is_static: bool = False, -) -> VariableMember: - """ - Get the variable member from a member definition. - """ - variable_name = member_def.get_name() - - if len(variable_name) == 0: - # Ignore anonymous variables - return None - - (variable_type, _) = resolve_linked_text_name(member_def.get_type()) - variable_value = None - variable_definition = member_def.definition - variable_argstring = member_def.get_argsstring() - - is_constexpr = member_def.constexpr == "yes" - is_mutable = member_def.mutable == "yes" - - if is_constexpr and variable_type.find("constexpr") != -1: - variable_type = variable_type.replace("constexpr", "").strip() - - is_const = variable_type.startswith("const") - if is_const: - variable_type = variable_type[5:].strip() - - is_brace_initializer = False - if member_def.initializer is not None: - (variable_value, initializer_type) = resolve_linked_text_name( - member_def.initializer, - strip_initializers=True, - ) - if initializer_type == InitializerType.BRACE: - is_brace_initializer = True - - return VariableMember( - variable_name, - variable_type, - visibility, - is_const, - is_static, - is_constexpr, - is_mutable, - variable_value, - variable_definition, - variable_argstring, - is_brace_initializer, - ) - - -def get_doxygen_params( - function_def: compound.MemberdefType, -) -> list[tuple[str | None, str, str | None, str | None]] | None: - """ - Extract structured parameter information from doxygen elements. - - Returns a list of Argument tuples (qualifiers, type, name, default_value), - or None if no elements are available. - """ - params = function_def.param - if not params: - return None - - arguments: list[Argument] = [] - for param in params: - param_type = ( - resolve_linked_text_name(param.get_type())[0].strip() - if param.get_type() - else "" - ) - param_name = param.declname or param.defname or None - param_default = ( - resolve_linked_text_name(param.defval)[0].strip() if param.defval else None - ) - - # Doxygen splits array dimensions into a separate element. - # For complex declarators like "PropNameID (&&propertyNames)[N]", - # doxygen gives type="PropNameID(&&)", name="propertyNames", - # array="[N]". We must reconstruct the full declarator with the - # name embedded inside the grouping parentheses: - # PropNameID(&&propertyNames)[N] - param_array = param.array - if param_array: - # Match type ending with a pointer/reference declarator group: - # e.g. "PropNameID(&&)", "int(&)", "void(*)" - m = re.search(r"\([*&]+\)\s*$", param_type) - if m and param_name: - # Insert name before the closing ')' and append array - insert_pos = m.end() - 1 # position of trailing ')' - param_type = ( - param_type[:insert_pos] - + param_name - + param_type[insert_pos:] - + param_array - ) - param_name = None - else: - param_type += param_array - - qualifiers, core_type = extract_qualifiers(param_type) - arguments.append((qualifiers, core_type, param_name, param_default)) - - return arguments - - -def get_function_member( - function_def: compound.MemberdefType, - visibility: str, - is_static: bool = False, -) -> FunctionMember: - """ - Get the function member from a member definition. - """ - function_name = function_def.get_name() - function_type = resolve_linked_text_name(function_def.get_type())[0] - function_arg_string = function_def.get_argsstring() - is_pure_virtual = function_def.get_virt() == "pure-virtual" - function_virtual = function_def.get_virt() == "virtual" or is_pure_virtual - is_constexpr = function_def.constexpr == "yes" - - # Doxygen incorrectly merges "=0" into the return type for pure-virtual - # functions using trailing return types (e.g. "auto f() -> T = 0"). - # Strip the trailing "=0" from the type string. - function_type = re.sub(r"\s*=\s*0\s*$", "", function_type) - - # For constexpr constructors, Doxygen outputs "constexpr" both as an - # attribute (constexpr="yes") and as the return type (constexpr). - # Remove the redundant type to avoid "constexpr constexpr" in output. - if is_constexpr and function_type == "constexpr": - function_type = "" - - doxygen_params = get_doxygen_params(function_def) - - function = FunctionMember( - function_name, - function_type, - visibility, - function_arg_string, - function_virtual, - is_pure_virtual, - is_static, - doxygen_params, - is_constexpr, - ) - - function.add_template(get_template_params(function_def)) - - return function - - -def get_typedef_member( - typedef_def: compound.memberdefType, visibility: str -) -> TypedefMember: - typedef_name = typedef_def.get_name() - typedef_type = resolve_linked_text_name(typedef_def.get_type())[0] - typedef_argstring = typedef_def.get_argsstring() - typedef_definition = typedef_def.definition - - typedef_keyword = "using" - if typedef_definition.startswith("typedef"): - typedef_keyword = "typedef" - - typedef = TypedefMember( - typedef_name, - typedef_type, - typedef_argstring, - visibility, - typedef_keyword, - ) - - typedef.add_template(get_template_params(typedef_def)) - - return typedef - - -def get_concept_member( - concept_def: compound.CompounddefType, -) -> ConceptMember: - """ - Get the concept member from a compound definition. - """ - concept_name = concept_def.compoundname - concept_path = parse_qualified_path(concept_name) - unqualified_name = concept_path[-1] - - initializer = concept_def.initializer - constraint = "" - - if initializer: - # The initializer contains the entire constraind definition. - # We want to extract the constraint part after "=" - initializer_text = resolve_linked_text_name(initializer)[0] - eq_pos = initializer_text.find("=") - if eq_pos != -1: - constraint = initializer_text[eq_pos + 1 :].strip() - - concept = ConceptMember(unqualified_name, constraint) - concept.add_template(get_template_params(concept_def)) - - return concept - - -def get_property_member( - member_def: compound.MemberdefType, - visibility: str, - is_static: bool = False, -) -> PropertyMember: - """ - Get the property member from a member definition. - """ - property_name = member_def.get_name() - property_type = resolve_linked_text_name(member_def.get_type())[0].strip() - accessor = member_def.accessor if hasattr(member_def, "accessor") else None - is_readable = getattr(member_def, "readable", "no") == "yes" - is_writable = getattr(member_def, "writable", "no") == "yes" - - return PropertyMember( - property_name, - property_type, - visibility, - is_static, - accessor, - is_readable, - is_writable, - ) - - -def create_enum_scope(snapshot: Snapshot, enum_def: compound.EnumdefType): - """ - Create an enum scope in the snapshot. - """ - scope = snapshot.create_enum(enum_def.qualifiedname) - scope.kind.type = resolve_linked_text_name(enum_def.get_type())[0] - scope.location = enum_def.location.file - - for enum_value_def in enum_def.enumvalue: - value_name = enum_value_def.get_name() - value_value = None - - if enum_value_def.initializer is not None: - (value_value, _) = resolve_linked_text_name(enum_value_def.initializer) - - scope.add_member( - EnumMember( - value_name, - value_value, - ), - ) - - -def create_protocol_scope(snapshot: Snapshot, scope_def: compound.CompounddefType): - """ - Create a protocol scope in the snapshot. - """ - # Doxygen appends "-p" to ObjC protocol compound names - protocol_name = scope_def.compoundname - if protocol_name.endswith("-p"): - protocol_name = protocol_name[:-2] - - protocol_scope = snapshot.create_protocol(protocol_name) - base_classes = get_base_classes(scope_def, base_class=ProtocolScopeKind.Base) - for base in base_classes: - base.name = base.name.strip("<>") - protocol_scope.kind.add_base(base_classes) - protocol_scope.location = scope_def.location.file - - for section_def in scope_def.sectiondef: - kind = section_def.kind - parts = kind.split("-") - visibility = parts[0] - is_static = "static" in parts - member_type = parts[-1] - - if visibility == "private": - pass - elif visibility in ("public", "protected"): - if member_type == "attrib": - for member_def in section_def.memberdef: - if member_def.kind == "variable": - protocol_scope.add_member( - get_variable_member(member_def, visibility, is_static) - ) - elif member_type == "func": - for function_def in section_def.memberdef: - protocol_scope.add_member( - get_function_member(function_def, visibility, is_static) - ) - elif member_type == "type": - for member_def in section_def.memberdef: - if member_def.kind == "enum": - create_enum_scope(snapshot, member_def) - elif member_def.kind == "typedef": - protocol_scope.add_member( - get_typedef_member(member_def, visibility) - ) - else: - print( - f"Unknown section member kind: {member_def.kind} in {scope_def.location.file}" - ) - else: - print( - f"Unknown protocol section kind: {kind} in {scope_def.location.file}" - ) - elif visibility == "property": - for member_def in section_def.memberdef: - if member_def.kind == "property": - protocol_scope.add_member( - get_property_member(member_def, "public", is_static) - ) - else: - print( - f"Unknown protocol visibility: {visibility} in {scope_def.location.file}" - ) - - -def create_interface_scope(snapshot: Snapshot, scope_def: compound.CompounddefType): - """ - Create an interface scope in the snapshot (Objective-C @interface). - """ - interface_name = scope_def.compoundname - - interface_scope = snapshot.create_interface(interface_name) - base_classes = get_base_classes(scope_def, base_class=InterfaceScopeKind.Base) - interface_scope.kind.add_base(base_classes) - interface_scope.location = scope_def.location.file - - for section_def in scope_def.sectiondef: - kind = section_def.kind - parts = kind.split("-") - visibility = parts[0] - is_static = "static" in parts - member_type = parts[-1] - - if visibility == "private": - pass - elif visibility in ("public", "protected"): - if member_type == "attrib": - for member_def in section_def.memberdef: - if member_def.kind == "variable": - interface_scope.add_member( - get_variable_member(member_def, visibility, is_static) - ) - elif member_type == "func": - for function_def in section_def.memberdef: - interface_scope.add_member( - get_function_member(function_def, visibility, is_static) - ) - elif member_type == "type": - for member_def in section_def.memberdef: - if member_def.kind == "enum": - create_enum_scope(snapshot, member_def) - elif member_def.kind == "typedef": - interface_scope.add_member( - get_typedef_member(member_def, visibility) - ) - else: - print( - f"Unknown section member kind: {member_def.kind} in {scope_def.location.file}" - ) - else: - print( - f"Unknown interface section kind: {kind} in {scope_def.location.file}" - ) - elif visibility == "property": - for member_def in section_def.memberdef: - if member_def.kind == "property": - interface_scope.add_member( - get_property_member(member_def, "public", is_static) - ) - else: - print( - f"Unknown interface visibility: {visibility} in {scope_def.location.file}" - ) +from .utils import parse_qualified_path def build_snapshot(xml_dir: str) -> Snapshot: @@ -704,91 +64,7 @@ def build_snapshot(xml_dir: str) -> Snapshot: if is_objc_interface: create_interface_scope(snapshot, compound_object) continue - class_scope = ( - snapshot.create_struct_like( - compound_object.compoundname, StructLikeScopeKind.Type.CLASS - ) - if compound_object.kind == "class" - else snapshot.create_struct_like( - compound_object.compoundname, StructLikeScopeKind.Type.STRUCT - ) - if compound_object.kind == "struct" - else snapshot.create_struct_like( - compound_object.compoundname, StructLikeScopeKind.Type.UNION - ) - ) - - class_scope.kind.add_base(get_base_classes(compound_object)) - class_scope.kind.add_template(get_template_params(compound_object)) - class_scope.location = compound_object.location.file - - for section_def in compound_object.sectiondef: - kind = section_def.kind - parts = kind.split("-") - visibility = parts[0] - is_static = "static" in parts - member_type = parts[-1] - - if visibility == "private": - pass - elif visibility in ("public", "protected"): - if member_type == "attrib": - for member_def in section_def.memberdef: - if member_def.kind == "variable": - (var_type, _) = resolve_linked_text_name( - member_def.get_type() - ) - - # Skip anonymous variables - if "@" in var_type: - continue - - if var_type == "friend": - class_scope.add_member( - FriendMember( - member_def.get_name(), visibility - ) - ) - else: - class_scope.add_member( - get_variable_member( - member_def, visibility, is_static - ) - ) - elif member_type == "func": - for function_def in section_def.memberdef: - class_scope.add_member( - get_function_member( - function_def, visibility, is_static - ) - ) - elif member_type == "type": - for member_def in section_def.memberdef: - if member_def.kind == "enum": - create_enum_scope(snapshot, member_def) - elif member_def.kind == "typedef": - class_scope.add_member( - get_typedef_member(member_def, visibility) - ) - else: - print( - f"Unknown section member kind: {member_def.kind} in {compound_object.location.file}" - ) - else: - print( - f"Unknown class section kind: {kind} in {compound_object.location.file}" - ) - elif visibility == "friend": - # Ignore friend declarations, they are not meaningful for the public API surface - pass - elif visibility == "property": - print( - f"Property not supported: {compound_object.compoundname} in {compound_object.location.file}" - ) - else: - print( - f"Unknown class visibility: {visibility} in {compound_object.location.file}" - ) + create_class_scope(snapshot, compound_object) elif compound_object.kind == "namespace": # Skip anonymous namespaces (internal linkage, not public API). # Doxygen encodes them with a '@' prefix in the compound name. diff --git a/scripts/cxx-api/parser/member.py b/scripts/cxx-api/parser/member.py index e4cb35cc8b7..407fa078aec 100644 --- a/scripts/cxx-api/parser/member.py +++ b/scripts/cxx-api/parser/member.py @@ -359,28 +359,6 @@ def to_string( return result -class FriendMember(Member): - def __init__(self, name: str, visibility: str = "public") -> None: - super().__init__(name, visibility) - - @property - def member_kind(self) -> MemberKind: - return MemberKind.FRIEND - - def to_string( - self, - indent: int = 0, - qualification: str | None = None, - hide_visibility: bool = False, - ) -> str: - name = self._get_qualified_name(qualification) - result = " " * indent - if not hide_visibility: - result += self.visibility + " " - result += f"friend {name};" - return result - - class PropertyMember(Member): def __init__( self, @@ -431,6 +409,28 @@ def to_string( return result +class FriendMember(Member): + def __init__(self, name: str, visibility: str = "public") -> None: + super().__init__(name, visibility) + + @property + def member_kind(self) -> MemberKind: + return MemberKind.FRIEND + + def to_string( + self, + indent: int = 0, + qualification: str | None = None, + hide_visibility: bool = False, + ) -> str: + name = self._get_qualified_name(qualification) + result = " " * indent + if not hide_visibility: + result += self.visibility + " " + result += f"friend {name};" + return result + + class ConceptMember(Member): def __init__( self, diff --git a/scripts/cxx-api/parser/utils/__init__.py b/scripts/cxx-api/parser/utils/__init__.py index b711a41f4e2..5af0c5ebdb0 100644 --- a/scripts/cxx-api/parser/utils/__init__.py +++ b/scripts/cxx-api/parser/utils/__init__.py @@ -14,14 +14,24 @@ parse_type_with_argstrings, ) from .qualified_path import parse_qualified_path +from .text_resolution import ( + extract_namespace_from_refid, + InitializerType, + normalize_angle_brackets, + resolve_linked_text_name, + resolve_ref_text_name, +) from .type_qualification import qualify_arguments, qualify_parsed_type, qualify_type_str __all__ = [ "Argument", + "extract_namespace_from_refid", "extract_qualifiers", "format_arguments", "format_parsed_type", "FunctionModifiers", + "InitializerType", + "normalize_angle_brackets", "parse_arg_string", "parse_function_pointer_argstring", "parse_qualified_path", @@ -29,4 +39,6 @@ "qualify_arguments", "qualify_parsed_type", "qualify_type_str", + "resolve_linked_text_name", + "resolve_ref_text_name", ] diff --git a/scripts/cxx-api/parser/utils/text_resolution.py b/scripts/cxx-api/parser/utils/text_resolution.py new file mode 100644 index 00000000000..a55c1a43800 --- /dev/null +++ b/scripts/cxx-api/parser/utils/text_resolution.py @@ -0,0 +1,225 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Functions for resolving text content from Doxygen XML types. +""" + +from __future__ import annotations + +import re +from enum import Enum + +from doxmlparser import compound + + +def decode_doxygen_template_encoding(encoded: str) -> str: + """Decode Doxygen's encoding for template specializations in refids. + + Doxygen encodes special characters in refids using underscore-prefixed codes: + - '_3' = '<' (template open) + - '_4' = '>' (template close) + - '_01' = ' ' (space) + - '_07' = '(' (open paren) + - '_08' = ')' (close paren) + - '_8_8_8' = '...' (variadic ellipsis) + - '_00' = ',' (comma) + - '_02' = '*' (pointer) + - '_05' = '=' (equals) + - '_06' = '&' (reference) + + e.g. 'SyncCallback_3_01R_07Args_8_8_8_08_4' -> 'SyncCallback< R(Args...)>' + """ + result = encoded + + # Process longer patterns first to avoid partial matches + result = result.replace("_8_8_8", "...") # Variadic ellipsis + + # Process two-char patterns (_0X codes) + result = result.replace("_00", ", ") # Comma (with space for readability) + result = result.replace("_01", " ") # Space + result = result.replace("_02", "*") # Pointer + result = result.replace("_05", "=") # Equals + result = result.replace("_06", "&") # Reference + result = result.replace("_07", "(") # Open paren + result = result.replace("_08", ")") # Close paren + + # Process single-char patterns last + result = result.replace("_3", "<") # Template open + result = result.replace("_4", ">") # Template close + + return result + + +def extract_namespace_from_refid(refid: str) -> str: + """Extract the namespace prefix from a doxygen refid. + e.g. 'namespacefacebook_1_1yoga_1a...' -> 'facebook::yoga' + 'structfacebook_1_1react_1_1detail_1_1is__dynamic' -> 'facebook::react::detail::is_dynamic' + 'classfacebook_1_1react_1_1SyncCallback_3_01R_07Args_8_8_8_08_4' -> 'facebook::react::SyncCallback< R(Args...)>' + + Doxygen encoding: + - '::' is encoded as '_1_1' + - '_' in identifiers is encoded as '__' (double underscore) + - Template specializations are encoded with hex-like codes (see decode_doxygen_template_encoding) + """ + for prefix in ("namespace", "struct", "class", "union"): + if refid.startswith(prefix): + compound_part = refid[len(prefix) :] + idx = compound_part.find("_1a") + if idx != -1: + compound_part = compound_part[:idx] + # First replace '::' encoding (_1_1 -> ::) + result = compound_part.replace("_1_1", "::") + # Then replace double underscore with single underscore + # (Doxygen encodes '_' in identifiers as '__') + result = result.replace("__", "_") + # Decode template specialization encodings + result = decode_doxygen_template_encoding(result) + return result + return "" + + +def normalize_angle_brackets(text: str) -> str: + """Doxygen adds spaces around < and > to avoid XML ambiguity. + e.g. "NSArray< id< RCTBridgeMethod > > *" -> "NSArray> *" + """ + text = re.sub(r"<\s+", "<", text) + text = re.sub(r"\s+>", ">", text) + return text + + +def resolve_ref_text_name(type_def: compound.refTextType) -> str: + """Resolve the text content of a refTextType.""" + if hasattr(type_def, "content_") and type_def.content_: + name = "" + for part in type_def.content_: + if part.category == 1: # MixedContainer.CategoryText + name += part.value + elif part.category == 3: # MixedContainer.CategoryComplex (ref element) + if hasattr(part.value, "get_valueOf_"): + name += part.value.get_valueOf_() + elif hasattr(part.value, "valueOf_"): + name += part.value.valueOf_ + else: + name += str(part.value) + return name + + if type_def.ref: + return type_def.ref[0].get_valueOf_() + + return type_def.get_valueOf_() + + +class InitializerType(Enum): + NONE = (0,) + ASSIGNMENT = (1,) + BRACE = 2 + + +def resolve_linked_text_name( + type_def: compound.linkedTextType, + strip_initializers: bool = False, +) -> (str, InitializerType): + """ + Resolve the full text content of a linkedTextType, including all text + fragments and ref elements. + """ + name = "" + in_string = False + + if hasattr(type_def, "content_") and type_def.content_: + for part in type_def.content_: + if part.category == 1: # MixedContainer.CategoryText + in_string = part.value.count('"') % 2 != in_string + name += part.value + elif part.category == 3: # MixedContainer.CategoryComplex (ref element) + # For ref elements, get the text content and fully qualify using refid + text = "" + if hasattr(part.value, "get_valueOf_"): + text = part.value.get_valueOf_() + elif hasattr(part.value, "valueOf_"): + text = part.value.valueOf_ + else: + text = str(part.value) + + # Don't resolve refs inside string literals - doxygen may + # incorrectly treat symbols in strings as references + refid = getattr(part.value, "refid", None) + if refid and not in_string: + text = _qualify_text_with_refid(text, refid) + + name += text + elif type_def.ref: + name = type_def.ref[0].get_valueOf_() + else: + name = type_def.get_valueOf_() + + initialier_type = InitializerType.NONE + if strip_initializers: + if name.startswith("="): + # Detect assignment initializers: = value + initialier_type = InitializerType.ASSIGNMENT + name = name[1:] + elif name.startswith("{") and name.endswith("}"): + # Detect brace initializers: {value} + initialier_type = InitializerType.BRACE + name = name[1:-1].strip() + + return (normalize_angle_brackets(name.strip()), initialier_type) + + +def _qualify_text_with_refid(text: str, refid: str) -> str: + """Qualify a text symbol using the namespace extracted from its doxygen refid. + + For ref elements, doxygen provides a refid that encodes the fully qualified + path to the referenced symbol. This function extracts the namespace from + that refid and prepends it to the text, avoiding redundant qualification. + + Args: + text: The symbol text (e.g., "SyncCallback") + refid: The doxygen refid (e.g., "classfacebook_1_1react_1_1SyncCallback...") + + Returns: + The qualified text (e.g., "facebook::react::SyncCallback") + """ + ns = extract_namespace_from_refid(refid) + + # Skip re-qualification if text is already globally qualified + # (starts with "::") - it's already an absolute path + if not ns or text.startswith(ns) or text.startswith("::"): + return text + + # The text may already start with a trailing portion of the namespace. + # For example ns="facebook::react::HighResDuration" and + # text="HighResDuration::zero". We need to find the longest suffix of ns + # that is a prefix of text (on a "::" boundary) and only prepend the + # missing part. + ns_parts = ns.split("::") + prepend = ns + + for i in range(1, len(ns_parts)): + suffix = "::".join(ns_parts[i:]) + # Also compare without template args - for template specializations + # like "SyncCallback< R(Args...)>", text "SyncCallback" should match + base_suffix = _strip_template_args(ns_parts[i]) + if ( + text.startswith(suffix + "::") + or text == suffix + or text.startswith(base_suffix + "::") + or text == base_suffix + ): + prepend = "::".join(ns_parts[:i]) + break + + return prepend + "::" + text + + +def _strip_template_args(name: str) -> str: + """Strip template arguments from a type name. + + e.g. 'SyncCallback< R(Args...)>' -> 'SyncCallback' + """ + angle_idx = name.find("<") + return name[:angle_idx].rstrip() if angle_idx != -1 else name diff --git a/scripts/cxx-api/tests/snapshots/should_qualify_const_friend_type_in_template/snapshot.api b/scripts/cxx-api/tests/snapshots/should_qualify_const_friend_type_in_template/snapshot.api index 455b89a72ea..27f2b5b2125 100644 --- a/scripts/cxx-api/tests/snapshots/should_qualify_const_friend_type_in_template/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_qualify_const_friend_type_in_template/snapshot.api @@ -1,6 +1,6 @@ struct test::ComponentDescriptor { public friend ShadowNode; - public virtual std::shared_ptr< const test::ShadowNode > clone() const = 0; + public virtual std::shared_ptr clone() const = 0; } struct test::ShadowNode { From c90843d8f83139a674fd4bc2bd579f17d9d9c11a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Wed, 4 Mar 2026 02:47:32 -0800 Subject: [PATCH 045/595] Add support for categories (#55773) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55773 This diff adds support for parsing Objective-C categories in the C++ API snapshot parser. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94076350 fbshipit-source-id: 7dd144a09b8cd5e2b91d008cb2a5882226dfd293 --- scripts/cxx-api/parser/builders.py | 38 ++++++++++++++++++- scripts/cxx-api/parser/main.py | 3 +- scripts/cxx-api/parser/scope.py | 22 +++++++++++ scripts/cxx-api/parser/snapshot.py | 26 +++++++++++++ .../should_handle_category_empty/snapshot.api | 5 +++ .../should_handle_category_empty/test.h | 14 +++++++ .../snapshot.api | 7 ++++ .../should_handle_category_with_method/test.h | 16 ++++++++ .../snapshot.api | 9 +++++ .../test.h | 17 +++++++++ .../snapshot.api | 12 ++++++ .../should_handle_multiple_categories/test.h | 22 +++++++++++ 12 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_category_empty/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_category_empty/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_category_with_method/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/test.h diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index cbdded7612d..912548fe2a9 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -26,7 +26,12 @@ TypedefMember, VariableMember, ) -from .scope import InterfaceScopeKind, ProtocolScopeKind, StructLikeScopeKind +from .scope import ( + CategoryScopeKind, + InterfaceScopeKind, + ProtocolScopeKind, + StructLikeScopeKind, +) from .snapshot import Snapshot from .template import Template from .utils import ( @@ -559,3 +564,34 @@ def create_class_scope( print( f"Unknown class visibility: {visibility} in {compound_object.location.file}" ) + + +def create_category_scope( + snapshot: Snapshot, scope_def: compound.CompounddefType +) -> None: + """ + Create a category scope in the snapshot (Objective-C category). + Categories extend existing classes with additional methods. + The compound name is in the format: ClassName(CategoryName) + """ + compound_name = scope_def.compoundname + + # Parse ClassName(CategoryName) format + match = re.match(r"^(.+)\((.+)\)$", compound_name) + if not match: + print(f"Invalid category name format: {compound_name}") + return + + class_name = match.group(1) + category_name = match.group(2) + + category_scope = snapshot.create_category(class_name, category_name) + category_scope.location = scope_def.location.file + + _process_objc_sections( + snapshot, + category_scope, + scope_def.sectiondef, + scope_def.location.file, + "category", + ) diff --git a/scripts/cxx-api/parser/main.py b/scripts/cxx-api/parser/main.py index 989fc2b1545..0c6aa1b7c34 100644 --- a/scripts/cxx-api/parser/main.py +++ b/scripts/cxx-api/parser/main.py @@ -14,6 +14,7 @@ from doxmlparser import compound, index from .builders import ( + create_category_scope, create_class_scope, create_enum_scope, create_interface_scope, @@ -121,7 +122,7 @@ def build_snapshot(xml_dir: str) -> Snapshot: elif compound_object.kind == "dir": pass elif compound_object.kind == "category": - print(f"Category not supported: {compound_object.compoundname}") + create_category_scope(snapshot, compound_object) elif compound_object.kind == "page": # Contains deprecation info pass diff --git a/scripts/cxx-api/parser/scope.py b/scripts/cxx-api/parser/scope.py index 18880f12374..d637fde2d4d 100644 --- a/scripts/cxx-api/parser/scope.py +++ b/scripts/cxx-api/parser/scope.py @@ -253,6 +253,28 @@ def to_string(self, scope: Scope) -> str: return result +class CategoryScopeKind(ScopeKind): + def __init__(self, class_name: str, category_name: str) -> None: + super().__init__("category") + self.class_name: str = class_name + self.category_name: str = category_name + + def to_string(self, scope: Scope) -> str: + result = f"{self.name} {self.class_name}({self.category_name}) {{" + + stringified_members = [] + for member in scope.get_members(): + stringified_members.append(member.to_string(2)) + stringified_members = natsorted(stringified_members) + result += ("\n" if len(stringified_members) > 0 else "") + "\n".join( + stringified_members + ) + + result += "\n}" + + return result + + class TemporaryScopeKind(ScopeKind): def __init__(self) -> None: super().__init__("temporary") diff --git a/scripts/cxx-api/parser/snapshot.py b/scripts/cxx-api/parser/snapshot.py index 87664bc8490..a7c1d154998 100644 --- a/scripts/cxx-api/parser/snapshot.py +++ b/scripts/cxx-api/parser/snapshot.py @@ -6,6 +6,7 @@ from __future__ import annotations from .scope import ( + CategoryScopeKind, EnumScopeKind, InterfaceScopeKind, NamespaceScopeKind, @@ -134,6 +135,31 @@ def create_interface(self, qualified_name: str) -> Scope[InterfaceScopeKind]: current_scope.inner_scopes[scope_name] = new_scope return new_scope + def create_category( + self, class_name: str, category_name: str + ) -> Scope[CategoryScopeKind]: + """ + Create a category in the snapshot. + Categories are stored with a unique key: "ClassName(CategoryName)" + """ + scope_key = f"{class_name}({category_name})" + current_scope = self.root_scope + + if scope_key in current_scope.inner_scopes: + scope = current_scope.inner_scopes[scope_key] + if scope.kind.name == "temporary": + scope.kind = CategoryScopeKind(class_name, category_name) + else: + raise RuntimeError( + f"Identifier {scope_key} already exists in scope {current_scope.name}" + ) + return scope + else: + new_scope = Scope(CategoryScopeKind(class_name, category_name), scope_key) + new_scope.parent_scope = current_scope + current_scope.inner_scopes[scope_key] = new_scope + return new_scope + def create_enum(self, qualified_name: str) -> Scope[EnumScopeKind]: """ Create an enum in the snapshot. diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_empty/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_category_empty/snapshot.api new file mode 100644 index 00000000000..95812de052d --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_empty/snapshot.api @@ -0,0 +1,5 @@ +category RCTConvert(EmptyCategory) { +} + +interface RCTConvert : public NSObject { +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_empty/test.h b/scripts/cxx-api/tests/snapshots/should_handle_category_empty/test.h new file mode 100644 index 00000000000..f687c85b411 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_empty/test.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTConvert : NSObject + +@end + +@interface RCTConvert (EmptyCategory) + +@end diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api new file mode 100644 index 00000000000..a09b6d80df7 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api @@ -0,0 +1,7 @@ +category RCTConvert(UIActivityIndicatorView) { + public virtual static UIActivityIndicatorViewStyle UIActivityIndicatorViewStyle:(id json); +} + +interface RCTConvert : public NSObject { + public virtual static UIActivityIndicatorViewStyle UIActivityIndicatorViewStyle:(id json); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/test.h b/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/test.h new file mode 100644 index 00000000000..48630654eaf --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTConvert : NSObject + +@end + +@interface RCTConvert (UIActivityIndicatorView) + ++ (UIActivityIndicatorViewStyle)UIActivityIndicatorViewStyle:(id)json; + +@end diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api new file mode 100644 index 00000000000..1c99214249a --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api @@ -0,0 +1,9 @@ +category RCTConvert(Transform) { + public virtual static CATransform3D CATransform3D:(id json); + public virtual static RCTTransformOrigin RCTTransformOrigin:(id json); +} + +interface RCTConvert : public NSObject { + public virtual static CATransform3D CATransform3D:(id json); + public virtual static RCTTransformOrigin RCTTransformOrigin:(id json); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/test.h b/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/test.h new file mode 100644 index 00000000000..a82888b92f4 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/test.h @@ -0,0 +1,17 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTConvert : NSObject + +@end + +@interface RCTConvert (Transform) + ++ (CATransform3D)CATransform3D:(id)json; ++ (RCTTransformOrigin)RCTTransformOrigin:(id)json; + +@end diff --git a/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api new file mode 100644 index 00000000000..32cebd4b82f --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api @@ -0,0 +1,12 @@ +category RCTConvert(CategoryOne) { + public virtual static NSString * methodOne:(id json); +} + +category RCTConvert(CategoryTwo) { + public virtual static NSString * methodTwo:(id json); +} + +interface RCTConvert : public NSObject { + public virtual static NSString * methodOne:(id json); + public virtual static NSString * methodTwo:(id json); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/test.h b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/test.h new file mode 100644 index 00000000000..bfd93aa0aac --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/test.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTConvert : NSObject + +@end + +@interface RCTConvert (CategoryOne) + ++ (NSString *)methodOne:(id)json; + +@end + +@interface RCTConvert (CategoryTwo) + ++ (NSString *)methodTwo:(id)json; + +@end From 4a3080bea3ec788d1a0a70df561a8cbd98b83188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Wed, 4 Mar 2026 03:24:39 -0800 Subject: [PATCH 046/595] Add test for parsing interfaces with deprecated attributes (#55771) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55771 Adding tests for parsing interfaces with deprecated attributes and extending the doxygen test config with `__attribute__` predefined macro. ## Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94343118 fbshipit-source-id: 2fb2f8307f324533033ea1df2f266a785dc81de7 --- .../tests/snapshots/.doxygen.config.template | 2 +- .../snapshot.api | 4 ++++ .../should_handle_method_with_attribute/test.h | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/test.h diff --git a/scripts/cxx-api/tests/snapshots/.doxygen.config.template b/scripts/cxx-api/tests/snapshots/.doxygen.config.template index 9a4e9b94f37..a01a146395a 100644 --- a/scripts/cxx-api/tests/snapshots/.doxygen.config.template +++ b/scripts/cxx-api/tests/snapshots/.doxygen.config.template @@ -2442,7 +2442,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api new file mode 100644 index 00000000000..bf63be61569 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api @@ -0,0 +1,4 @@ +interface RCTTestInterface { + public virtual NSArray * interfaceDeprecatedMethod:(id param); + public virtual void normalMethod:(NSString * name); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/test.h b/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/test.h new file mode 100644 index 00000000000..4e8157aa7ef --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/test.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTTestInterface + +- (void)normalMethod:(NSString *)name; + +- (NSArray *)interfaceDeprecatedMethod:(id)param __attribute__((deprecated("This method is deprecated."))); + +@end From ac510f5b50c2973faa61545c4249b349e82b605b Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 4 Mar 2026 04:03:25 -0800 Subject: [PATCH 047/595] Add react_renderer_viewtransition to prefab preprocessing entries (#55896) Summary: Changelog: [Internal] [Changed] - Pull Request resolved: https://github.com/facebook/react-native/pull/55896 Reviewed By: cipolleschi Differential Revision: D95189102 Pulled By: cortinico fbshipit-source-id: 74066740239c974e12574cd427e543fd8a58e899 --- packages/react-native/ReactAndroid/build.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/react-native/ReactAndroid/build.gradle.kts b/packages/react-native/ReactAndroid/build.gradle.kts index cd84f67a055..5d110d28205 100644 --- a/packages/react-native/ReactAndroid/build.gradle.kts +++ b/packages/react-native/ReactAndroid/build.gradle.kts @@ -275,6 +275,11 @@ val preparePrefab by "../ReactCommon/react/renderer/animationbackend/", "react/renderer/animationbackend/", ), + // react_renderer_viewtransition + Pair( + "../ReactCommon/react/renderer/viewtransition/", + "react/renderer/viewtransition/", + ), ), ), PrefabPreprocessingEntry( From 4f38bed19270eb780d8af791044deef84b34eab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Wed, 4 Mar 2026 04:39:21 -0800 Subject: [PATCH 048/595] Add template normalizing (#55774) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55774 Doxygen adds spaces inside angle brackets in its XML output: - Outputs: `std::vector< PropNameID >` - Expected: `std::vector` Applying `normalize_angle_brackets()` in `resolve_ref_text_name()` to normalize spacing consistently. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94232505 fbshipit-source-id: b0edc597d121cf875e74aad8a29514b52116567d --- scripts/cxx-api/parser/utils/text_resolution.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/cxx-api/parser/utils/text_resolution.py b/scripts/cxx-api/parser/utils/text_resolution.py index a55c1a43800..5995491304c 100644 --- a/scripts/cxx-api/parser/utils/text_resolution.py +++ b/scripts/cxx-api/parser/utils/text_resolution.py @@ -104,12 +104,12 @@ def resolve_ref_text_name(type_def: compound.refTextType) -> str: name += part.value.valueOf_ else: name += str(part.value) - return name + return normalize_angle_brackets(name) if type_def.ref: - return type_def.ref[0].get_valueOf_() + return normalize_angle_brackets(type_def.ref[0].get_valueOf_()) - return type_def.get_valueOf_() + return normalize_angle_brackets(type_def.get_valueOf_()) class InitializerType(Enum): From 6918b70866820c5e6a27eeda68038414e18844d5 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Wed, 4 Mar 2026 05:00:49 -0800 Subject: [PATCH 049/595] Add release-hermes-for-branch-cut.js script (#55903) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55903 Changelog: [Internal] This script automates the full Hermes release workflow during React Native branch cuts. It handles: 1. Validating the environment (must be on a stable branch, no uncommitted changes) 2. Cloning/setting up the Hermes repo at ~/git/hermes if needed 3. Fetching Hermes versions from main and 250829098.0.0-stable branches 4. Creating a release branch (release-v{version}) in Hermes 5. Triggering GitHub Actions workflows to build Hermes 6. Updating RN repo with Hermes versions (.hermesversion, .hermesv1version, version.properties, package.json dependencies) 7. Creating PRs to bump Hermes versions for the next release 8. Creating a PR to bump HERMES_V1_VERSION_NAME on RN main Features: - Interactive prompts for confirmation at key steps - --dry-run flag to preview all actions without making changes - Clear output with emoji indicators for each step - Reminder not to push RN release branch until workflows complete Usage: ./packages/react-native/scripts/hermes/release-hermes-for-branch-cut.js ./packages/react-native/scripts/hermes/release-hermes-for-branch-cut.js --dry-run Reviewed By: cipolleschi Differential Revision: D95195362 fbshipit-source-id: 6008c5fd9abaf0c7b49abc7b2cc56cfc358507ce --- .../hermes/release-hermes-for-branch-cut.js | 464 ++++++++++++++++++ 1 file changed, 464 insertions(+) create mode 100755 packages/react-native/scripts/hermes/release-hermes-for-branch-cut.js diff --git a/packages/react-native/scripts/hermes/release-hermes-for-branch-cut.js b/packages/react-native/scripts/hermes/release-hermes-for-branch-cut.js new file mode 100755 index 00000000000..ac1dcb811f4 --- /dev/null +++ b/packages/react-native/scripts/hermes/release-hermes-for-branch-cut.js @@ -0,0 +1,464 @@ +#!/usr/bin/env node +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +'use strict'; + +const { + updateHermesCompilerVersionInDependencies, + updateHermesRuntimeDependenciesVersions, +} = require('../../../../scripts/releases/utils/hermes-utils'); +const {setHermesTag} = require('./hermes-utils'); +const {execSync} = require('child_process'); +const fs = require('fs'); +// $FlowFixMe[untyped-import] +const inquirer = require('inquirer'); +const os = require('os'); +const path = require('path'); +const {exit} = require('shelljs'); +const yargs = require('yargs'); + +const argv = yargs + .option('dry-run', { + alias: 'd', + describe: + 'Run without making external changes (no branch creation, no workflow triggers, no PRs)', + type: 'boolean', + default: false, + }) + .help().argv; + +// $FlowFixMe[prop-missing] +const DRY_RUN = argv['dry-run']; + +const HERMES_REPO_PATH = path.join(os.homedir(), 'git', 'hermes'); +const HERMES_LEGACY_BRANCH = 'main'; +const HERMES_LEGACY_LABEL = 'Hermes Legacy'; +const HERMES_V1_BRANCH = '250829098.0.0-stable'; +const HERMES_V1_LABEL = 'Hermes V1'; +const RN_REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); + +async function releaseHermesForBranchCut() /*: Promise */ { + if (DRY_RUN) { + console.log('🏃 DRY RUN MODE - No external changes will be made\n'); + } + + // Step 1: Validate environment + if (!isGhInstalled()) { + console.error( + '❌ Error: GitHub CLI (gh) is not installed. Please install it first: https://cli.github.com/', + ); + exit(1); + } + + const rnBranch = getCurrentBranch(RN_REPO_ROOT); + + if (!rnBranch.endsWith('-stable')) { + console.error( + `❌ Error: Must be on a stable branch (e.g., 0.79-stable). Current branch: ${rnBranch}`, + ); + exit(1); + } + + if (hasUncommittedChanges(RN_REPO_ROOT)) { + console.error( + '❌ Error: You have uncommitted changes in the React Native repo. Please commit or stash them first.', + ); + exit(1); + } + + const {confirmStart} = await inquirer.prompt({ + type: 'confirm', + name: 'confirmStart', + message: `You are about to release Hermes for branch "${rnBranch}". Continue?`, + }); + + if (!confirmStart) { + console.log('Aborting.'); + exit(0); + } + + console.log('\n🚀 Starting Hermes branch cut workflow...\n'); + console.log(`📍 Current RN branch: ${rnBranch}`); + + // Step 2: Setup Hermes repo + await ensureHermesRepo(); + + if (hasUncommittedChanges(HERMES_REPO_PATH)) { + console.error( + '❌ Error: You have uncommitted changes in the Hermes repo. Please commit or stash them first.', + ); + exit(1); + } + + // Step 3: Get versions from Hermes + console.log('\n📥 Fetching Hermes versions...'); + + const legacyHermesVersion = fetchHermesVersion( + HERMES_LEGACY_BRANCH, + HERMES_LEGACY_LABEL, + ); + const v1HermesVersion = fetchHermesVersion(HERMES_V1_BRANCH, HERMES_V1_LABEL); + + console.log(''); + const {confirmVersions} = await inquirer.prompt({ + type: 'confirm', + name: 'confirmVersions', + message: `Double-check the Hermes versions above. Do you want to proceed?`, + }); + + if (!confirmVersions) { + console.log('Aborting.'); + exit(0); + } + + // Step 4: Create release branch in Hermes + const releaseBranch = `release-v${legacyHermesVersion}`; + console.log('\n🌿 Creating release branch for legacy Hermes...'); + execInRepo(`git checkout ${HERMES_LEGACY_BRANCH}`, HERMES_REPO_PATH, { + silent: true, + }); + + if (DRY_RUN) { + console.log(` [DRY RUN] Would create and push branch: ${releaseBranch}`); + } else { + execInRepo(`git checkout -b ${releaseBranch}`, HERMES_REPO_PATH); + execInRepo(`git push -u origin ${releaseBranch}`, HERMES_REPO_PATH); + console.log(`✅ Created and pushed branch: ${releaseBranch}`); + } + + // Step 5: Trigger GitHub workflows + console.log('\n🔄 Triggering GitHub workflows...'); + + const legacyWorkflowUrl = `https://github.com/facebook/hermes/actions/workflows/rn-build-hermes.yml?query=branch%3A${releaseBranch}`; + const v1WorkflowUrl = `https://github.com/facebook/hermes/actions/workflows/rn-build-hermes.yml?query=branch%3A${HERMES_V1_BRANCH}`; + + if (DRY_RUN) { + console.log( + ` [DRY RUN] Would trigger workflow for ${releaseBranch} with release_type=Release`, + ); + console.log( + ` [DRY RUN] Would trigger workflow for ${HERMES_V1_BRANCH} with release_type=Release`, + ); + } else { + console.log(` Triggering workflow for ${releaseBranch}...`); + execSync( + `gh workflow run rn-build-hermes.yml -R facebook/hermes -f branch=${releaseBranch} -f release_type=Release`, + {stdio: 'inherit'}, + ); + console.log(` → ${legacyWorkflowUrl}`); + + console.log(` Triggering workflow for ${HERMES_V1_BRANCH}...`); + execSync( + `gh workflow run rn-build-hermes.yml -R facebook/hermes -f branch=${HERMES_V1_BRANCH} -f release_type=Release`, + {stdio: 'inherit'}, + ); + console.log(` → ${v1WorkflowUrl}`); + + console.log('✅ Workflows triggered successfully.'); + } + + // Step 6: Update RN repo and create commit + console.log('\n⬆️ Bump Hermes version in RN release branch...'); + + if (DRY_RUN) { + console.log(` [DRY RUN] Would set Hermes tags:`); + console.log(` - .hermesversion: ${releaseBranch}`); + console.log(` - .hermesv1version: ${HERMES_V1_BRANCH}`); + console.log( + ` [DRY RUN] Would update hermes-compiler dependency to ${v1HermesVersion}`, + ); + console.log(` [DRY RUN] Would update version.properties:`); + console.log(` - HERMES_VERSION_NAME: ${legacyHermesVersion}`); + console.log(` - HERMES_V1_VERSION_NAME: ${v1HermesVersion}`); + console.log(' [DRY RUN] Would create commit: "Bump hermes version"'); + } else { + await setHermesTag(releaseBranch, HERMES_V1_BRANCH); + await updateHermesCompilerVersionInDependencies(v1HermesVersion); + await updateHermesRuntimeDependenciesVersions( + legacyHermesVersion, + v1HermesVersion, + ); + execInRepo('git add .', RN_REPO_ROOT); + execInRepo('git commit -m "Bump hermes version"', RN_REPO_ROOT); + console.log('✅ Commit created (not pushed yet).'); + } + + // Step 7: Bump Hermes versions for next release (PRs) + const newLegacyVersion = createHermesBumpPR({ + currentVersion: legacyHermesVersion, + baseBranch: HERMES_LEGACY_BRANCH, + bumpVersion: bumpMinorVersion, + label: HERMES_LEGACY_LABEL, + rnBranch, + }); + + const newV1Version = createHermesBumpPR({ + currentVersion: v1HermesVersion, + baseBranch: HERMES_V1_BRANCH, + bumpVersion: bumpPatchVersion, + label: HERMES_V1_LABEL, + rnBranch, + }); + + // Step 9: Bump RN main (PR) + console.log('\n📝 Creating PR to bump Hermes V1 version on RN main...'); + const rnBumpBranch = `bump-hermes-v1-${newV1Version}`; + + if (DRY_RUN) { + console.log(` [DRY RUN] Would create branch ${rnBumpBranch} on RN main`); + console.log( + ` [DRY RUN] Would update HERMES_V1_VERSION_NAME to ${newV1Version}`, + ); + console.log( + ` [DRY RUN] Would create PR: "Bump hermes version for RN release ${rnBranch}" → main`, + ); + } else { + execInRepo('git checkout main', RN_REPO_ROOT, {silent: true}); + execInRepo('git pull', RN_REPO_ROOT, {silent: true}); + execInRepo(`git checkout -b ${rnBumpBranch}`, RN_REPO_ROOT, {silent: true}); + + const versionPropertiesPath = path.join( + RN_REPO_ROOT, + 'packages', + 'react-native', + 'sdks', + 'hermes-engine', + 'version.properties', + ); + updateVersionProperties( + versionPropertiesPath, + 'HERMES_V1_VERSION_NAME', + newV1Version, + ); + execInRepo( + 'git add packages/react-native/sdks/hermes-engine/version.properties', + RN_REPO_ROOT, + ); + execInRepo( + `git commit -m "Bump hermes v1 version to ${newV1Version}"`, + RN_REPO_ROOT, + ); + execInRepo(`git push -u origin ${rnBumpBranch}`, RN_REPO_ROOT); + execSync( + `gh pr create --title "Bump hermes version for RN release ${rnBranch}" --body "Bumps HERMES_V1_VERSION_NAME to ${newV1Version} for the next release." --base main`, + {stdio: 'inherit', cwd: RN_REPO_ROOT}, + ); + console.log(`✅ Created PR for RN main Hermes V1 bump (${newV1Version})`); + } + + // Step 10: Return to stable branch and show summary + if (!DRY_RUN) { + execInRepo(`git checkout ${rnBranch}`, RN_REPO_ROOT, {silent: true}); + } + + if (DRY_RUN) { + console.log(` +✅ Dry run completed! Here's what would happen: + +1. Create release branch: ${releaseBranch} +2. Trigger workflows on ${releaseBranch} and ${HERMES_V1_BRANCH} +3. Update RN repo with Hermes versions and create commit +4. Create PR to bump Hermes legacy to ${newLegacyVersion} +5. Create PR to bump Hermes V1 to ${newV1Version} +6. Create PR to bump RN main HERMES_V1_VERSION_NAME to ${newV1Version} + +Workflow URLs (when created): + • Legacy Hermes: ${legacyWorkflowUrl} + • Hermes V1: ${v1WorkflowUrl} + +⚠️ IMPORTANT: Do NOT push the RN release branch until the workflows complete. +`); + } else { + console.log(` +✅ Branch cut workflow completed! + +Monitor the workflows here: + • Legacy Hermes: ${legacyWorkflowUrl} + • Hermes V1: ${v1WorkflowUrl} + +⚠️ IMPORTANT: Do NOT push the RN release branch until the workflows complete. +`); + } +} + +// Helper functions + +function createHermesBumpPR( + params /*: { + currentVersion: string, + baseBranch: string, + bumpVersion: (version: string) => string, + label: string, + rnBranch: string, +} */, +) /*: string */ { + const {currentVersion, baseBranch, bumpVersion, label, rnBranch} = params; + const newVersion = bumpVersion(currentVersion); + const bumpBranch = `bump-hermes-${newVersion}`; + + console.log(`\n📝 Creating PR to bump ${label} version...`); + + if (DRY_RUN) { + console.log( + ` [DRY RUN] Would create branch ${bumpBranch} on Hermes ${baseBranch}`, + ); + console.log( + ` [DRY RUN] Would bump hermes-compiler version to ${newVersion}`, + ); + console.log( + ` [DRY RUN] Would create PR: "Bump hermes version for RN release ${rnBranch}" → ${baseBranch}`, + ); + } else { + execInRepo(`git checkout ${baseBranch}`, HERMES_REPO_PATH, { + silent: true, + }); + execInRepo(`git checkout -b ${bumpBranch}`, HERMES_REPO_PATH, { + silent: true, + }); + updatePackageJsonVersion(HERMES_REPO_PATH, newVersion); + execInRepo('git add npm/hermes-compiler/package.json', HERMES_REPO_PATH); + execInRepo( + `git commit -m "Bump hermes version to ${newVersion}"`, + HERMES_REPO_PATH, + ); + execInRepo(`git push -u origin ${bumpBranch}`, HERMES_REPO_PATH); + execSync( + `gh pr create -R facebook/hermes --title "Bump hermes version for RN release ${rnBranch}" --body "Bumps hermes-compiler version to ${newVersion} for the next release." --base ${baseBranch}`, + {stdio: 'inherit'}, + ); + console.log(`✅ Created PR for ${label} bump (${newVersion})`); + } + + return newVersion; +} + +function fetchHermesVersion( + branch /*: string */, + label /*: string */, +) /*: string */ { + execInRepo(`git checkout ${branch}`, HERMES_REPO_PATH, {silent: true}); + execInRepo('git pull', HERMES_REPO_PATH, {silent: true}); + const version = getHermesVersionFromPackageJson(HERMES_REPO_PATH); + console.log(` ${label} version (${branch}): ${version}`); + return version; +} + +function getCurrentBranch(repoPath /*: string */) /*: string */ { + return execSync('git rev-parse --abbrev-ref HEAD', { + cwd: repoPath, + encoding: 'utf8', + }).trim(); +} + +function hasUncommittedChanges(repoPath /*: string */) /*: boolean */ { + const status = execSync('git status --porcelain', { + cwd: repoPath, + encoding: 'utf8', + }).trim(); + return status.length > 0; +} + +function isGhInstalled() /*: boolean */ { + try { + execSync('gh --version', {stdio: ['pipe', 'pipe', 'pipe']}); + return true; + } catch { + return false; + } +} + +function execInRepo( + command /*: string */, + repoPath /*: string */, + options /*: {silent?: boolean} */ = {}, +) /*: string */ { + const result = execSync(command, { + cwd: repoPath, + encoding: 'utf8', + stdio: options.silent === true ? ['pipe', 'pipe', 'pipe'] : 'inherit', + }); + return typeof result === 'string' ? result.trim() : ''; +} + +function getHermesVersionFromPackageJson(repoPath /*: string */) /*: string */ { + const packageJsonPath = path.join( + repoPath, + 'npm', + 'hermes-compiler', + 'package.json', + ); + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + return packageJson.version; +} + +function bumpMinorVersion(version /*: string */) /*: string */ { + const parts = version.split('.'); + const major = parseInt(parts[0], 10); + const minor = parseInt(parts[1], 10); + return `${major}.${minor + 1}.0`; +} + +function bumpPatchVersion(version /*: string */) /*: string */ { + const parts = version.split('.'); + const major = parseInt(parts[0], 10); + const minor = parseInt(parts[1], 10); + const patch = parseInt(parts[2], 10); + return `${major}.${minor}.${patch + 1}`; +} + +function updatePackageJsonVersion( + repoPath /*: string */, + newVersion /*: string */, +) { + const packageJsonPath = path.join( + repoPath, + 'npm', + 'hermes-compiler', + 'package.json', + ); + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + packageJson.version = newVersion; + fs.writeFileSync( + packageJsonPath, + JSON.stringify(packageJson, null, 2) + '\n', + ); +} + +function updateVersionProperties( + filePath /*: string */, + key /*: string */, + newVersion /*: string */, +) { + let content = fs.readFileSync(filePath, 'utf8'); + const regex = new RegExp(`^${key}=.*$`, 'm'); + content = content.replace(regex, `${key}=${newVersion}`); + fs.writeFileSync(filePath, content); +} + +async function ensureHermesRepo() /*: Promise */ { + if (!fs.existsSync(HERMES_REPO_PATH)) { + console.log(`\n📦 Cloning Hermes repo to ${HERMES_REPO_PATH}...`); + const parentDir = path.dirname(HERMES_REPO_PATH); + if (!fs.existsSync(parentDir)) { + fs.mkdirSync(parentDir, {recursive: true}); + } + execSync(`gh repo clone facebook/hermes ${HERMES_REPO_PATH}`, { + stdio: 'inherit', + }); + console.log('✅ Hermes repo cloned successfully.'); + } else { + console.log(`✅ Hermes repo found at ${HERMES_REPO_PATH}`); + } +} + +void releaseHermesForBranchCut().then(() => { + exit(0); +}); From 7989287801eba3553f7881af50191e4f562c368f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20LUDWIG?= Date: Wed, 4 Mar 2026 05:07:22 -0800 Subject: [PATCH 050/595] chore: update markdownlint-rule-relative-links to v5.1.0 (#55866) Summary: Maintainer of https://github.com/theoludwig/markdownlint-rule-relative-links/ Didn't know (until now) that this package was used by the react-native repository, and glad that you find it useful! :smile: Apparently, the package was downgraded in https://github.com/facebook/react-native/pull/50625 because of Node.js version requirement/mismatch, but now that (as far as I understand it), React Native uses Node.js v22+, it's fine to upgrade. ## Changelog: [Internal] [Changed] - Update markdownlint-rule-relative-links to v5.1.0 Pull Request resolved: https://github.com/facebook/react-native/pull/55866 Test Plan: `lint-markdown` script still work. Reviewed By: NickGerleman Differential Revision: D95055797 Pulled By: cipolleschi fbshipit-source-id: 60837b2efffdf20cf43fd9a174e40e6077f8a313 --- package.json | 2 +- yarn.lock | 28 +++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3c9036a2df8..dbf54992637 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "jest-snapshot": "^29.7.0", "jsonc-parser": "2.2.1", "markdownlint-cli2": "^0.17.2", - "markdownlint-rule-relative-links": "^3.0.0", + "markdownlint-rule-relative-links": "^5.1.0", "memfs": "^4.38.2", "metro-babel-register": "^0.84.2", "metro-transform-plugins": "^0.84.2", diff --git a/yarn.lock b/yarn.lock index 4fa58c9e049..c776d6fcdf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6591,6 +6591,18 @@ markdown-it@14.1.0: punycode.js "^2.3.1" uc.micro "^2.1.0" +markdown-it@14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" + integrity sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + markdownlint-cli2-formatter-default@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz#b8fde4e127f9a9c0596e6d45eed352dd0aa0ff98" @@ -6608,12 +6620,13 @@ markdownlint-cli2@^0.17.2: markdownlint-cli2-formatter-default "0.0.5" micromatch "4.0.8" -markdownlint-rule-relative-links@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/markdownlint-rule-relative-links/-/markdownlint-rule-relative-links-3.0.0.tgz#e4de472298f3859c51ea3e421350cf7649bbef12" - integrity sha512-+Ek2J8kXKtL8IcjmPYBsxtS37etKIbPE85aj/ehwSlxcWIlT0BCsA/SPHZlIICiZON786XVrLStMCJ1x25D3oA== +markdownlint-rule-relative-links@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/markdownlint-rule-relative-links/-/markdownlint-rule-relative-links-5.1.0.tgz#f84bbfa2bcc1df02e570d1ad2c9fb7f39e9f5760" + integrity sha512-0jZ3NlTXvAdV7XqWlVQ5guSee2W67acLrH102KOHk3t2nG5mzsoqGCBYUwNyeNBBpzc1hbj4bgi5maexB25V+A== dependencies: - markdown-it "14.1.0" + markdown-it "14.1.1" + mime "4.1.0" markdownlint@0.37.4: version "0.37.4" @@ -7207,6 +7220,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-4.1.0.tgz#ec55df7aa21832a36d44f0bbee5c04639b27802f" + integrity sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw== + mime@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" From ca4173701d4b398a3b43650d019ffc75fb1d21a7 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 4 Mar 2026 06:20:07 -0800 Subject: [PATCH 051/595] Derive WebSocket scheme and port from dev server URL for React DevTools (#55894) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55894 ## Summary: Derive the WebSocket scheme (ws/wss) and port from the dev server URL in `setUpReactDevTools.js` so React DevTools connections work correctly when the dev server is accessed over HTTPS. The Android `OkHttpClientProvider` and `WebSocketModule` changes from the original ATOD patch are intentionally omitted because these are production modules that cannot depend on the dev-only `DevSupportHttpClient` module due to Buck module boundaries. ## Changelog: [GENERAL][CHANGED] - Derive WebSocket scheme and port from dev server URL for React DevTools connections, supporting HTTPS dev servers ## Test Plan: Validated that the JS change correctly derives ws/wss scheme and port from the dev server URL, falling back to ws://host:8097 for local development. ## Facebook: Partially applied from nest/mobile/apps/atod-sample/patches/react-native+0.83.1+004+atod-websocket.patch (Android OkHttpClientProvider and WebSocketModule changes omitted — they create an invalid Buck dependency from production modules to dev-only modules) Reviewed By: cortinico Differential Revision: D95043354 fbshipit-source-id: 29e8c55106b645f29ca5240de66d5842027b89ac --- .../Libraries/Core/setUpReactDevTools.js | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/react-native/Libraries/Core/setUpReactDevTools.js b/packages/react-native/Libraries/Core/setUpReactDevTools.js index 9bdf66b3018..2c80b23393a 100644 --- a/packages/react-native/Libraries/Core/setUpReactDevTools.js +++ b/packages/react-native/Libraries/Core/setUpReactDevTools.js @@ -146,17 +146,34 @@ if (__DEV__) { ? guessHostFromDevServerUrl(devServer.url) : 'localhost'; - // Read the optional global variable for backward compatibility. - // It was added in https://github.com/facebook/react-native/commit/bf2b435322e89d0aeee8792b1c6e04656c2719a0. - const port = + // Derive scheme and port from the dev server URL when possible, + // falling back to ws://host:8097 for local development. + let wsScheme = 'ws'; + let port = 8097; + + if ( // $FlowFixMe[prop-missing] // $FlowFixMe[incompatible-use] window.__REACT_DEVTOOLS_PORT__ != null - ? window.__REACT_DEVTOOLS_PORT__ - : 8097; + ) { + // $FlowFixMe[prop-missing] + port = window.__REACT_DEVTOOLS_PORT__; + } else if (devServer.bundleLoadedFromServer) { + try { + const devUrl = new URL(devServer.url); + if (devUrl.protocol === 'https:') { + wsScheme = 'wss'; + } + if (devUrl.port) { + port = parseInt(devUrl.port, 10); + } else if (devUrl.protocol === 'https:') { + port = 443; + } + } catch (e) {} + } const WebSocket = require('../WebSocket/WebSocket').default; - ws = new WebSocket('ws://' + host + ':' + port); + ws = new WebSocket(wsScheme + '://' + host + ':' + port); ws.addEventListener('close', event => { isWebSocketOpen = false; }); From f3aa8c21d1349b3c968c601ef89850427dfdcf64 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 4 Mar 2026 06:20:07 -0800 Subject: [PATCH 052/595] Add SRWebSocketProvider for selective WebSocket header injection (#55870) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55870 ## Summary: Replace the blind application of dev headers on all WebSocket connections with a provider pattern that mirrors RCTHTTPRequestHandler's NSURLSessionConfigurationProvider. A custom `SRWebSocketProvider` block can be registered via `RCTSetCustomSRWebSocketProvider` to intercept WebSocket creation and selectively modify the request (e.g. injecting auth headers) for specific endpoints. If no provider is set, or if the provider returns nil, the default SRWebSocket creation logic is used. - Declare `SRWebSocketProvider` typedef and `RCTSetCustomSRWebSocketProvider` in RCTWebSocketModule.h - Implement the provider hook in RCTWebSocketModule.mm - Remove the previous blind `RCTDevSupportHttpHeaders` application ## Changelog: [IOS][CHANGED] - Add SRWebSocketProvider for selective WebSocket header injection ## Test Plan: Verified that the `SRWebSocketProvider` block is called when registered, and that returning nil falls back to the default SRWebSocket creation. When no provider is registered, behavior is unchanged from before. ## Facebook: Applied from nest/mobile/apps/atod-sample/patches/react-native+0.83.1+005+atod-websocket-ios.patch Reviewed By: cortinico Differential Revision: D95037876 fbshipit-source-id: 8e721397802db6eac9df686b0d064f597747a746 --- .../React/CoreModules/RCTWebSocketModule.h | 6 ++++++ .../React/CoreModules/RCTWebSocketModule.mm | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/react-native/React/CoreModules/RCTWebSocketModule.h b/packages/react-native/React/CoreModules/RCTWebSocketModule.h index f92bfc42e3a..0deba70671f 100644 --- a/packages/react-native/React/CoreModules/RCTWebSocketModule.h +++ b/packages/react-native/React/CoreModules/RCTWebSocketModule.h @@ -18,6 +18,12 @@ NS_ASSUME_NONNULL_BEGIN @end +@class SRWebSocket; + +typedef SRWebSocket * (^SRWebSocketProvider)(NSURLRequest *request); + +RCT_EXTERN void RCTSetCustomSRWebSocketProvider(SRWebSocketProvider provider); + @interface RCTWebSocketModule : RCTEventEmitter // Register a custom handler for a specific websocket. The handler will be strongly held by the WebSocketModule. diff --git a/packages/react-native/React/CoreModules/RCTWebSocketModule.mm b/packages/react-native/React/CoreModules/RCTWebSocketModule.mm index 20d4b948033..bd95c32accf 100644 --- a/packages/react-native/React/CoreModules/RCTWebSocketModule.mm +++ b/packages/react-native/React/CoreModules/RCTWebSocketModule.mm @@ -35,6 +35,13 @@ @interface RCTWebSocketModule () *_sockets; NSMutableDictionary> *_contentHandlers; @@ -114,7 +121,13 @@ - (void)invalidate }]; } - SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURLRequest:request protocols:protocols]; + SRWebSocket *webSocket; + if (srWebSocketProvider != nullptr) { + webSocket = srWebSocketProvider(request); + } + if (webSocket == nil) { + webSocket = [[SRWebSocket alloc] initWithURLRequest:request protocols:protocols]; + } [webSocket setDelegateDispatchQueue:[self methodQueue]]; webSocket.delegate = self; webSocket.reactTag = @(socketID); From 0c7d780aa03e7a3fccd24553fdb59ce3219139b2 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 4 Mar 2026 06:20:07 -0800 Subject: [PATCH 053/595] Add RCTHTTPRequestInterceptor for selective HTTP header injection (#55869) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55869 ## Summary: Replace the blind application of dev headers on all HTTP requests with an interceptor pattern. A custom `RCTHTTPRequestInterceptor` block can be registered via `RCTSetCustomHTTPRequestInterceptor` to inspect and modify HTTP requests before they are sent. The interceptor returns a modified request to override, or nil to use the original request unchanged. This preserves the shared NSURLSession configuration (including meta-auth mTLS) while allowing selective per-request header injection. - Declare `RCTHTTPRequestInterceptor` typedef and `RCTSetCustomHTTPRequestInterceptor` in RCTHTTPRequestHandler.h - Implement the interceptor hook in RCTHTTPRequestHandler.mm - Remove the previous blind `RCTDevSupportHttpHeaders` application ## Changelog: [IOS][CHANGED] - Add RCTHTTPRequestInterceptor for selective HTTP request modification ## Test Plan: Verified that the RCTHTTPRequestInterceptor block is called when registered, and that returning nil leaves the original request unchanged. When no interceptor is registered, behavior is unchanged from before. ## Facebook: Applied from nest/mobile/apps/atod-sample/patches/react-native+0.83.1+006+atod-ios-http-handler.patch Reviewed By: cortinico Differential Revision: D95037920 fbshipit-source-id: ccd2c99c38eecb7fb5b074e7fce6f5abc3b6b3a1 --- .../Libraries/Network/RCTHTTPRequestHandler.h | 9 +++++++++ .../Libraries/Network/RCTHTTPRequestHandler.mm | 16 +++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.h b/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.h index ee7fe8be44f..c3a27e15a04 100644 --- a/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.h +++ b/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.h @@ -14,6 +14,15 @@ typedef NSURLSessionConfiguration * (^NSURLSessionConfigurationProvider)(void); * app. */ RCT_EXTERN void RCTSetCustomNSURLSessionConfigurationProvider(NSURLSessionConfigurationProvider /*provider*/); + +typedef NSURLRequest *_Nullable (^RCTHTTPRequestInterceptor)(NSURLRequest *request); +/** + * The block provided via this function can inspect/modify HTTP requests before + * they are sent. Return a modified request to override, or nil to use the + * original request unchanged. + */ +RCT_EXTERN void RCTSetCustomHTTPRequestInterceptor(RCTHTTPRequestInterceptor /*interceptor*/); + /** * This is the default RCTURLRequestHandler implementation for HTTP requests. */ diff --git a/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.mm b/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.mm index 0303970a2e4..61de2a06415 100644 --- a/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.mm +++ b/packages/react-native/Libraries/Network/RCTHTTPRequestHandler.mm @@ -25,6 +25,13 @@ void RCTSetCustomNSURLSessionConfigurationProvider(NSURLSessionConfigurationProv urlSessionConfigurationProvider = provider; } +static RCTHTTPRequestInterceptor httpRequestInterceptor; + +void RCTSetCustomHTTPRequestInterceptor(RCTHTTPRequestInterceptor interceptor) +{ + httpRequestInterceptor = interceptor; +} + @implementation RCTHTTPRequestHandler { NSMapTable *_delegates; NSURLSession *_session; @@ -99,7 +106,14 @@ - (NSURLSessionDataTask *)sendRequest:(NSURLRequest *)request withDelegate:(id Date: Wed, 4 Mar 2026 06:20:07 -0800 Subject: [PATCH 054/595] Derive iOS inspector URL scheme from bundle URL for HTTPS support (#55871) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55871 ## Summary: Use the bundle URL's scheme (http or https) when constructing inspector device URLs and open-debugger URLs in `RCTInspectorDevServerHelper`, instead of hardcoding `http://`. This allows the inspector and debugger to work correctly when the dev server is accessed over HTTPS. ## Changelog: [IOS][CHANGED] - Derive inspector and debugger URL scheme from bundle URL to support HTTPS dev servers ## Test Plan: Verified that `getInspectorDeviceUrl` and `openDebugger` now use the bundle URL's scheme, falling back to `http` when no scheme is available. ## Facebook: Applied from nest/mobile/apps/atod-sample/patches/react-native+0.83.1+007+atod-ios-inspector-https.patch Reviewed By: cortinico Differential Revision: D95037969 fbshipit-source-id: 0e6729c2b91827655f4093dec890ad086e42facf --- .../DevSupport/RCTInspectorDevServerHelper.mm | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm b/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm index 36e18415eed..93e32af36dc 100644 --- a/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm +++ b/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm @@ -112,13 +112,15 @@ NSString *escapedInspectorDeviceId = [getInspectorDeviceId() stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]; - return [NSURL - URLWithString:[NSString stringWithFormat:@"http://%@/inspector/device?name=%@&app=%@&device=%@&profiling=%@", - getServerHost(bundleURL), - escapedDeviceName, - escapedAppName, - escapedInspectorDeviceId, - isProfilingBuild ? @"true" : @"false"]]; + NSString *scheme = [bundleURL scheme] != nullptr ? [bundleURL scheme] : @"http"; + return + [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@/inspector/device?name=%@&app=%@&device=%@&profiling=%@", + scheme, + getServerHost(bundleURL), + escapedDeviceName, + escapedAppName, + escapedInspectorDeviceId, + isProfilingBuild ? @"true" : @"false"]]; } @implementation RCTInspectorDevServerHelper @@ -150,7 +152,9 @@ + (void)openDebugger:(NSURL *)bundleURL withErrorMessage:(NSString *)errorMessag NSString *escapedInspectorDeviceId = [getInspectorDeviceId() stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]; - NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/open-debugger?device=%@", + NSString *scheme = [bundleURL scheme] != nullptr ? [bundleURL scheme] : @"http"; + NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@/open-debugger?device=%@", + scheme, getServerHost(bundleURL), escapedInspectorDeviceId]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; From 3582a8b2b5bf220013e5965bcbfa81bd0ade1b83 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 4 Mar 2026 06:20:07 -0800 Subject: [PATCH 055/595] Fix iOS inspector getServerHost to handle HTTPS correctly (#55872) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55872 ## Summary: Update `getServerHost()` in `RCTInspectorDevServerHelper` to properly handle HTTPS connections. When the bundle URL uses HTTPS, the port is omitted from the host string (the scheme implies 443). The explicit port from the URL takes priority, followed by the `RCT_METRO_PORT` environment variable, with 8081 as the default fallback for local development. ## Changelog: [IOS][FIXED] - Fix inspector server host resolution for HTTPS bundle URLs by omitting default port ## Test Plan: Verified that getServerHost returns: - `host:port` when an explicit port is in the URL - `host:envPort` when RCT_METRO_PORT is set - `host` (no port) when the scheme is https - `host:8081` as the default fallback ## Facebook: Applied from nest/mobile/apps/atod-sample/patches/react-native+0.83.1+008+atod-ios-ws-fixes.patch Reviewed By: cortinico Differential Revision: D95038004 fbshipit-source-id: 38b6f54b9e7f0346ef7ee4411099ef055769685b --- .../DevSupport/RCTInspectorDevServerHelper.mm | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm b/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm index 93e32af36dc..e2ee27e2d88 100644 --- a/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm +++ b/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm @@ -20,28 +20,33 @@ #import static NSString *const kDebuggerMsgDisable = @"{ \"id\":1,\"method\":\"Debugger.disable\" }"; +static const int kDefaultMetroPort = 8081; static NSString *getServerHost(NSURL *bundleURL) { - NSNumber *port = @8081; - NSString *portStr = [[[NSProcessInfo processInfo] environment] objectForKey:@"RCT_METRO_PORT"]; - if ((portStr != nullptr) && [portStr length] > 0) { - port = [NSNumber numberWithInt:[portStr intValue]]; - } - if ([bundleURL port] != nullptr) { - port = [bundleURL port]; - } NSString *host = [bundleURL host]; if (host == nullptr) { host = @"localhost"; } - // this is consistent with the Android implementation, where http:// is the - // hardcoded implicit scheme for the debug server. Note, packagerURL - // technically looks like it could handle schemes/protocols other than HTTP, - // so rather than force HTTP, leave it be for now, in case someone is relying - // on that ability when developing against iOS. - return [NSString stringWithFormat:@"%@:%@", host, port]; + // Use explicit port from URL if available + if ([bundleURL port] != nullptr) { + return [NSString stringWithFormat:@"%@:%@", host, [bundleURL port]]; + } + + // Check environment variable + NSString *portStr = [[[NSProcessInfo processInfo] environment] objectForKey:@"RCT_METRO_PORT"]; + if ((portStr != nullptr) && [portStr length] > 0) { + return [NSString stringWithFormat:@"%@:%@", host, portStr]; + } + + // For https, omit port — the scheme implies 443 + if ([[bundleURL scheme] isEqualToString:@"https"]) { + return host; + } + + // Default to 8081 for local development (Metro's default port) + return [NSString stringWithFormat:@"%@:%d", host, kDefaultMetroPort]; } static NSString *getSHA256(NSString *string) From b4a354496e01279ca265b6f2c1de841503ae1710 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 4 Mar 2026 08:05:56 -0800 Subject: [PATCH 056/595] Revert: chore: update markdownlint-rule-relative-links to v5.1.0 (#55907) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55907 Github OSS CI is failing because of D95055797. Reverting the diff to fix the OSS CI ## Changelog: [Internal] - Reviewed By: lenaic Differential Revision: D95204543 fbshipit-source-id: ef9d7b871baa00ae86bd0d619b151e5f8abc7782 --- package.json | 2 +- yarn.lock | 28 +++++----------------------- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index dbf54992637..3c9036a2df8 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "jest-snapshot": "^29.7.0", "jsonc-parser": "2.2.1", "markdownlint-cli2": "^0.17.2", - "markdownlint-rule-relative-links": "^5.1.0", + "markdownlint-rule-relative-links": "^3.0.0", "memfs": "^4.38.2", "metro-babel-register": "^0.84.2", "metro-transform-plugins": "^0.84.2", diff --git a/yarn.lock b/yarn.lock index c776d6fcdf6..4fa58c9e049 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6591,18 +6591,6 @@ markdown-it@14.1.0: punycode.js "^2.3.1" uc.micro "^2.1.0" -markdown-it@14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" - integrity sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - markdownlint-cli2-formatter-default@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz#b8fde4e127f9a9c0596e6d45eed352dd0aa0ff98" @@ -6620,13 +6608,12 @@ markdownlint-cli2@^0.17.2: markdownlint-cli2-formatter-default "0.0.5" micromatch "4.0.8" -markdownlint-rule-relative-links@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/markdownlint-rule-relative-links/-/markdownlint-rule-relative-links-5.1.0.tgz#f84bbfa2bcc1df02e570d1ad2c9fb7f39e9f5760" - integrity sha512-0jZ3NlTXvAdV7XqWlVQ5guSee2W67acLrH102KOHk3t2nG5mzsoqGCBYUwNyeNBBpzc1hbj4bgi5maexB25V+A== +markdownlint-rule-relative-links@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/markdownlint-rule-relative-links/-/markdownlint-rule-relative-links-3.0.0.tgz#e4de472298f3859c51ea3e421350cf7649bbef12" + integrity sha512-+Ek2J8kXKtL8IcjmPYBsxtS37etKIbPE85aj/ehwSlxcWIlT0BCsA/SPHZlIICiZON786XVrLStMCJ1x25D3oA== dependencies: - markdown-it "14.1.1" - mime "4.1.0" + markdown-it "14.1.0" markdownlint@0.37.4: version "0.37.4" @@ -7220,11 +7207,6 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-4.1.0.tgz#ec55df7aa21832a36d44f0bbee5c04639b27802f" - integrity sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw== - mime@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" From 7f7dbe758070dc00b6b9a1d9c6b23804592210c7 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 4 Mar 2026 08:35:25 -0800 Subject: [PATCH 057/595] Move View.js prop transformations to C++ prop parsing (#55853) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55853 Changelog: [Internal] `View.js` previously transformed `aria-*` props to `accessibility*` equivalents, `id` to `nativeID`, and `tabIndex` to `focusable` in JavaScript before passing to the native component. This diff moves all those transformations to the C++ prop parsing layer (`AccessibilityProps::setProp`, `Props::setProp`, and `HostPlatformViewProps::setProp`), making the JS wrapper thinner and faster. ## Benchmark Results (View vs ViewNativeComponent) | Component | Before (median ns) | After (median ns) | Change | | View | 666,750 | 546,917 | **-18%** | This change is gated for safe rollout. Reviewed By: javache, NickGerleman Differential Revision: D94219577 fbshipit-source-id: 6dee071a2a8caea533dbedd21a2294aec38307f2 --- .../Libraries/Components/View/View.js | 159 ++--- .../Components/View/__tests__/View-itest.js | 136 ++++- .../NativeComponent/BaseViewConfig.android.js | 15 + .../NativeComponent/BaseViewConfig.ios.js | 15 + .../featureflags/ReactNativeFeatureFlags.kt | 8 +- .../ReactNativeFeatureFlagsCxxAccessor.kt | 12 +- .../ReactNativeFeatureFlagsCxxInterop.kt | 4 +- .../ReactNativeFeatureFlagsDefaults.kt | 4 +- .../ReactNativeFeatureFlagsLocalAccessor.kt | 13 +- .../ReactNativeFeatureFlagsProvider.kt | 4 +- .../JReactNativeFeatureFlagsCxxInterop.cpp | 16 +- .../JReactNativeFeatureFlagsCxxInterop.h | 5 +- .../featureflags/ReactNativeFeatureFlags.cpp | 6 +- .../featureflags/ReactNativeFeatureFlags.h | 7 +- .../ReactNativeFeatureFlagsAccessor.cpp | 106 ++-- .../ReactNativeFeatureFlagsAccessor.h | 6 +- .../ReactNativeFeatureFlagsDefaults.h | 6 +- .../ReactNativeFeatureFlagsDynamicProvider.h | 11 +- .../ReactNativeFeatureFlagsProvider.h | 3 +- .../NativeReactNativeFeatureFlags.cpp | 7 +- .../NativeReactNativeFeatureFlags.h | 4 +- .../components/view/AccessibilityProps.cpp | 552 +++++++++++++++++- .../components/view/AccessibilityProps.h | 9 + .../components/view/HostPlatformViewProps.cpp | 31 +- .../ReactCommon/react/renderer/core/Props.cpp | 20 + .../ReactNativeFeatureFlags.config.js | 11 + .../featureflags/ReactNativeFeatureFlags.js | 7 +- .../specs/NativeReactNativeFeatureFlags.js | 3 +- 28 files changed, 1017 insertions(+), 163 deletions(-) diff --git a/packages/react-native/Libraries/Components/View/View.js b/packages/react-native/Libraries/Components/View/View.js index be74cb04c0d..7bf5f641944 100644 --- a/packages/react-native/Libraries/Components/View/View.js +++ b/packages/react-native/Libraries/Components/View/View.js @@ -10,6 +10,7 @@ import type {ViewProps} from './ViewPropTypes'; +import * as ReactNativeFeatureFlags from '../../../src/private/featureflags/ReactNativeFeatureFlags'; import TextAncestorContext from '../../Text/TextAncestorContext'; import ViewNativeComponent from './ViewNativeComponent'; import * as React from 'react'; @@ -28,96 +29,100 @@ component View( ) { const hasTextAncestor = use(TextAncestorContext); - const { - accessibilityState, - accessibilityValue, - 'aria-busy': ariaBusy, - 'aria-checked': ariaChecked, - 'aria-disabled': ariaDisabled, - 'aria-expanded': ariaExpanded, - 'aria-hidden': ariaHidden, - 'aria-label': ariaLabel, - 'aria-labelledby': ariaLabelledBy, - 'aria-live': ariaLive, - 'aria-selected': ariaSelected, - 'aria-valuemax': ariaValueMax, - 'aria-valuemin': ariaValueMin, - 'aria-valuenow': ariaValueNow, - 'aria-valuetext': ariaValueText, - id, - tabIndex, - ...otherProps - } = props; - - // Since we destructured props, we can now treat it as mutable - const processedProps = otherProps as {...ViewProps}; - - const parsedAriaLabelledBy = ariaLabelledBy?.split(/\s*,\s*/g); - if (parsedAriaLabelledBy !== undefined) { - processedProps.accessibilityLabelledBy = parsedAriaLabelledBy; - } + let resolvedProps = props; + if (!ReactNativeFeatureFlags.enableNativeViewPropTransformations()) { + const { + accessibilityState, + accessibilityValue, + 'aria-busy': ariaBusy, + 'aria-checked': ariaChecked, + 'aria-disabled': ariaDisabled, + 'aria-expanded': ariaExpanded, + 'aria-hidden': ariaHidden, + 'aria-label': ariaLabel, + 'aria-labelledby': ariaLabelledBy, + 'aria-live': ariaLive, + 'aria-selected': ariaSelected, + 'aria-valuemax': ariaValueMax, + 'aria-valuemin': ariaValueMin, + 'aria-valuenow': ariaValueNow, + 'aria-valuetext': ariaValueText, + id, + tabIndex, + ...otherProps + } = props; + + const processedProps = otherProps as {...ViewProps}; + + const parsedAriaLabelledBy = ariaLabelledBy?.split(/\s*,\s*/g); + if (parsedAriaLabelledBy !== undefined) { + processedProps.accessibilityLabelledBy = parsedAriaLabelledBy; + } - if (ariaLabel !== undefined) { - processedProps.accessibilityLabel = ariaLabel; - } + if (ariaLabel !== undefined) { + processedProps.accessibilityLabel = ariaLabel; + } - if (ariaLive !== undefined) { - processedProps.accessibilityLiveRegion = - ariaLive === 'off' ? 'none' : ariaLive; - } + if (ariaLive !== undefined) { + processedProps.accessibilityLiveRegion = + ariaLive === 'off' ? 'none' : ariaLive; + } - if (ariaHidden !== undefined) { - processedProps.accessibilityElementsHidden = ariaHidden; - if (ariaHidden === true) { - processedProps.importantForAccessibility = 'no-hide-descendants'; + if (ariaHidden !== undefined) { + processedProps.accessibilityElementsHidden = ariaHidden; + if (ariaHidden === true) { + processedProps.importantForAccessibility = 'no-hide-descendants'; + } } - } - if (id !== undefined) { - processedProps.nativeID = id; - } + if (id !== undefined) { + processedProps.nativeID = id; + } - if (tabIndex !== undefined) { - processedProps.focusable = !tabIndex; - } + if (tabIndex !== undefined) { + processedProps.focusable = !tabIndex; + } - if ( - accessibilityState != null || - ariaBusy != null || - ariaChecked != null || - ariaDisabled != null || - ariaExpanded != null || - ariaSelected != null - ) { - processedProps.accessibilityState = { - busy: ariaBusy ?? accessibilityState?.busy, - checked: ariaChecked ?? accessibilityState?.checked, - disabled: ariaDisabled ?? accessibilityState?.disabled, - expanded: ariaExpanded ?? accessibilityState?.expanded, - selected: ariaSelected ?? accessibilityState?.selected, - }; - } + if ( + accessibilityState != null || + ariaBusy != null || + ariaChecked != null || + ariaDisabled != null || + ariaExpanded != null || + ariaSelected != null + ) { + processedProps.accessibilityState = { + busy: ariaBusy ?? accessibilityState?.busy, + checked: ariaChecked ?? accessibilityState?.checked, + disabled: ariaDisabled ?? accessibilityState?.disabled, + expanded: ariaExpanded ?? accessibilityState?.expanded, + selected: ariaSelected ?? accessibilityState?.selected, + }; + } + + if ( + accessibilityValue != null || + ariaValueMax != null || + ariaValueMin != null || + ariaValueNow != null || + ariaValueText != null + ) { + processedProps.accessibilityValue = { + max: ariaValueMax ?? accessibilityValue?.max, + min: ariaValueMin ?? accessibilityValue?.min, + now: ariaValueNow ?? accessibilityValue?.now, + text: ariaValueText ?? accessibilityValue?.text, + }; + } - if ( - accessibilityValue != null || - ariaValueMax != null || - ariaValueMin != null || - ariaValueNow != null || - ariaValueText != null - ) { - processedProps.accessibilityValue = { - max: ariaValueMax ?? accessibilityValue?.max, - min: ariaValueMin ?? accessibilityValue?.min, - now: ariaValueNow ?? accessibilityValue?.now, - text: ariaValueText ?? accessibilityValue?.text, - }; + resolvedProps = processedProps; } const actualView = ref == null ? ( - + ) : ( - + ); if (hasTextAncestor) { diff --git a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js index 0ad79c3d02d..267d683170f 100644 --- a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js +++ b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * @flow strict-local - * @fantom_flags enableNativeCSSParsing:* + * @fantom_flags enableNativeCSSParsing:* enableNativeViewPropTransformations:* * @format */ @@ -578,6 +578,140 @@ describe('', () => { }); }); + describe('overlapping aria-label and accessibilityLabel', () => { + it('preserves accessibilityLabel when aria-label is removed', () => { + const root = Fantom.createRoot(); + + // Set both aria-label and accessibilityLabel + Fantom.runTask(() => { + root.render( + , + ); + }); + + // aria-label should take precedence + expect( + root.getRenderedOutput({props: ['accessibilityLabel']}).toJSX(), + ).toEqual(); + + // Remove aria-label but keep accessibilityLabel + Fantom.runTask(() => { + root.render( + , + ); + }); + + // accessibilityLabel should still be "native value" + expect( + root.getRenderedOutput({props: ['accessibilityLabel']}).toJSX(), + ).toEqual(); + }); + }); + + describe('overlapping aria-hidden and importantForAccessibility', () => { + it('preserves importantForAccessibility when aria-hidden is removed', () => { + const root = Fantom.createRoot(); + + // Set both aria-hidden and importantForAccessibility + Fantom.runTask(() => { + root.render( + , + ); + }); + + expect( + root + .getRenderedOutput({props: ['importantForAccessibility']}) + .toJSX(), + ).toEqual( + , + ); + + // Remove aria-hidden but keep importantForAccessibility + Fantom.runTask(() => { + root.render( + , + ); + }); + + // importantForAccessibility should still be "no-hide-descendants" + expect( + root + .getRenderedOutput({props: ['importantForAccessibility']}) + .toJSX(), + ).toEqual( + , + ); + }); + }); + + describe('aria-hidden={false} with importantForAccessibility', () => { + it('does not overwrite explicit importantForAccessibility', () => { + const root = Fantom.createRoot(); + + // Set importantForAccessibility="yes" and aria-hidden={false}. + // aria-hidden={false} should NOT reset importantForAccessibility + // to Auto, it should preserve the explicit "yes" value. + Fantom.runTask(() => { + root.render( + , + ); + }); + + expect( + root + .getRenderedOutput({props: ['importantForAccessibility']}) + .toJSX(), + ).toEqual(); + }); + }); + + describe('overlapping aria-live and accessibilityLiveRegion', () => { + it('preserves accessibilityLiveRegion when aria-live is removed', () => { + const root = Fantom.createRoot(); + + // Set both aria-live and accessibilityLiveRegion + Fantom.runTask(() => { + root.render( + , + ); + }); + + // Remove aria-live but keep accessibilityLiveRegion + Fantom.runTask(() => { + root.render( + , + ); + }); + + // accessibilityLiveRegion should still be "assertive" + expect( + root + .getRenderedOutput({props: ['accessibilityLiveRegion']}) + .toJSX(), + ).toEqual(); + }); + }); + describe('aria-live', () => { it('is mapped to accessibilityLiveRegion', () => { const root = Fantom.createRoot(); diff --git a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js index f2c8c78798d..cdd9eceaead 100644 --- a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js +++ b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.android.js @@ -214,6 +214,7 @@ const validAttributesForNonEventProps = { renderToHardwareTextureAndroid: true, testID: true, nativeID: true, + id: true, accessibilityLabelledBy: true, accessibilityLabel: true, accessibilityHint: true, @@ -226,6 +227,19 @@ const validAttributesForNonEventProps = { experimental_accessibilityOrder: true, importantForAccessibility: true, screenReaderFocusable: true, + 'aria-busy': true, + 'aria-checked': true, + 'aria-disabled': true, + 'aria-expanded': true, + 'aria-hidden': true, + 'aria-label': true, + 'aria-labelledby': true, + 'aria-live': true, + 'aria-selected': true, + 'aria-valuemax': true, + 'aria-valuemin': true, + 'aria-valuenow': true, + 'aria-valuetext': true, role: true, rotation: true, scaleX: true, @@ -368,6 +382,7 @@ const validAttributesForNonEventProps = { borderBlockEndColor: colorAttribute, borderBlockStartColor: colorAttribute, focusable: true, + tabIndex: true, backfaceVisibility: true, } as const; diff --git a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js index 913ebc34b53..2c0ca343714 100644 --- a/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js +++ b/packages/react-native/Libraries/NativeComponent/BaseViewConfig.ios.js @@ -218,7 +218,22 @@ const validAttributesForNonEventProps = { transformOrigin: true, accessibilityRole: true, accessibilityState: true, + 'aria-busy': true, + 'aria-checked': true, + 'aria-disabled': true, + 'aria-expanded': true, + 'aria-hidden': true, + 'aria-label': true, + 'aria-labelledby': true, + 'aria-live': true, + 'aria-selected': true, + 'aria-valuemax': true, + 'aria-valuemin': true, + 'aria-valuenow': true, + 'aria-valuetext': true, + tabIndex: true, nativeID: true, + id: true, pointerEvents: true, removeClippedSubviews: true, role: true, diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index a66fb344c78..eeec9f2a911 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<2ca6b65f1103a486e4e5a006de629e76>> + * @generated SignedSource<<38f50776ad2b88fa69b710dbd67315e2>> */ /** @@ -288,6 +288,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableNativeCSSParsing(): Boolean = accessor.enableNativeCSSParsing() + /** + * When enabled, View.js passes aria-*, id, and tabIndex props directly to native, relying on C++ prop parsing instead of JS-side transformations. + */ + @JvmStatic + public fun enableNativeViewPropTransformations(): Boolean = accessor.enableNativeViewPropTransformations() + /** * Enable network event reporting hooks in each native platform through `NetworkReporter` (Web Perf APIs + CDP). This flag should be combined with `fuseboxNetworkInspectionEnabled` to enable Network CDP debugging. */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index 164b90ee3e9..214d1d356bf 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<202662ab1c26ed104cfe837162d4f9a2>> + * @generated SignedSource<> */ /** @@ -63,6 +63,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var enableMainQueueCoordinatorOnIOSCache: Boolean? = null private var enableModuleArgumentNSNullConversionIOSCache: Boolean? = null private var enableNativeCSSParsingCache: Boolean? = null + private var enableNativeViewPropTransformationsCache: Boolean? = null private var enableNetworkEventReportingCache: Boolean? = null private var enablePreparedTextLayoutCache: Boolean? = null private var enablePropsUpdateReconciliationAndroidCache: Boolean? = null @@ -494,6 +495,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun enableNativeViewPropTransformations(): Boolean { + var cached = enableNativeViewPropTransformationsCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableNativeViewPropTransformations() + enableNativeViewPropTransformationsCache = cached + } + return cached + } + override fun enableNetworkEventReporting(): Boolean { var cached = enableNetworkEventReportingCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index 0ba312d6258..6ead7879cc7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<03f5b76fefda14757a43414f6624601a>> + * @generated SignedSource<<85d23b5f33a6a09c1e42b976a3a99f2f>> */ /** @@ -114,6 +114,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableNativeCSSParsing(): Boolean + @DoNotStrip @JvmStatic public external fun enableNativeViewPropTransformations(): Boolean + @DoNotStrip @JvmStatic public external fun enableNetworkEventReporting(): Boolean @DoNotStrip @JvmStatic public external fun enablePreparedTextLayout(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index 01469ff2539..1e6f48d7c16 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<7713ee7b0947f0ae8c66b73413a7f226>> + * @generated SignedSource<<4adf4e6f40b726bf9d3680301fb92e1f>> */ /** @@ -109,6 +109,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableNativeCSSParsing(): Boolean = false + override fun enableNativeViewPropTransformations(): Boolean = false + override fun enableNetworkEventReporting(): Boolean = true override fun enablePreparedTextLayout(): Boolean = false diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 1ce18fbaf47..5b1fd8c2a1b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<79cf67c605a76059f010cf2ccd0ec64b>> + * @generated SignedSource<<2115ff3be1f3944d499090d3089d185b>> */ /** @@ -67,6 +67,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var enableMainQueueCoordinatorOnIOSCache: Boolean? = null private var enableModuleArgumentNSNullConversionIOSCache: Boolean? = null private var enableNativeCSSParsingCache: Boolean? = null + private var enableNativeViewPropTransformationsCache: Boolean? = null private var enableNetworkEventReportingCache: Boolean? = null private var enablePreparedTextLayoutCache: Boolean? = null private var enablePropsUpdateReconciliationAndroidCache: Boolean? = null @@ -541,6 +542,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } + override fun enableNativeViewPropTransformations(): Boolean { + var cached = enableNativeViewPropTransformationsCache + if (cached == null) { + cached = currentProvider.enableNativeViewPropTransformations() + accessedFeatureFlags.add("enableNativeViewPropTransformations") + enableNativeViewPropTransformationsCache = cached + } + return cached + } + override fun enableNetworkEventReporting(): Boolean { var cached = enableNetworkEventReportingCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index 59b5af3095b..f574fa643c0 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<655d1ff3caeb3d8e95d44176d65b951b>> + * @generated SignedSource<<1bbbe280815927e0f977f1d1e7787937>> */ /** @@ -109,6 +109,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableNativeCSSParsing(): Boolean + @DoNotStrip public fun enableNativeViewPropTransformations(): Boolean + @DoNotStrip public fun enableNetworkEventReporting(): Boolean @DoNotStrip public fun enablePreparedTextLayout(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index 5467c7072e8..4a2a9b54418 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<175e48107d9bd1d713a4da0a252a58bf>> + * @generated SignedSource<> */ /** @@ -297,6 +297,12 @@ class ReactNativeFeatureFlagsJavaProvider return method(javaProvider_); } + bool enableNativeViewPropTransformations() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableNativeViewPropTransformations"); + return method(javaProvider_); + } + bool enableNetworkEventReporting() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableNetworkEventReporting"); @@ -774,6 +780,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableNativeCSSParsing( return ReactNativeFeatureFlags::enableNativeCSSParsing(); } +bool JReactNativeFeatureFlagsCxxInterop::enableNativeViewPropTransformations( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableNativeViewPropTransformations(); +} + bool JReactNativeFeatureFlagsCxxInterop::enableNetworkEventReporting( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableNetworkEventReporting(); @@ -1149,6 +1160,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableNativeCSSParsing", JReactNativeFeatureFlagsCxxInterop::enableNativeCSSParsing), + makeNativeMethod( + "enableNativeViewPropTransformations", + JReactNativeFeatureFlagsCxxInterop::enableNativeViewPropTransformations), makeNativeMethod( "enableNetworkEventReporting", JReactNativeFeatureFlagsCxxInterop::enableNetworkEventReporting), diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index 69cb7c48e47..e2a03055ab8 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<78e35f9316b9568e7a44153d542b6ebd>> */ /** @@ -159,6 +159,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableNativeCSSParsing( facebook::jni::alias_ref); + static bool enableNativeViewPropTransformations( + facebook::jni::alias_ref); + static bool enableNetworkEventReporting( facebook::jni::alias_ref); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index 08bfc040f3d..6de9c614fc1 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<5208616bc5d84f040ad0fa5e85acd6c4>> + * @generated SignedSource<<8643070722a65532f6c928ed82ca2aa5>> */ /** @@ -198,6 +198,10 @@ bool ReactNativeFeatureFlags::enableNativeCSSParsing() { return getAccessor().enableNativeCSSParsing(); } +bool ReactNativeFeatureFlags::enableNativeViewPropTransformations() { + return getAccessor().enableNativeViewPropTransformations(); +} + bool ReactNativeFeatureFlags::enableNetworkEventReporting() { return getAccessor().enableNetworkEventReporting(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index 731038a3456..fdbcfc434f8 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<1cbe2158c5242b2980ddafafe9084d7c>> + * @generated SignedSource<<47cc177671195fd67010ecdba712596a>> */ /** @@ -254,6 +254,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableNativeCSSParsing(); + /** + * When enabled, View.js passes aria-*, id, and tabIndex props directly to native, relying on C++ prop parsing instead of JS-side transformations. + */ + RN_EXPORT static bool enableNativeViewPropTransformations(); + /** * Enable network event reporting hooks in each native platform through `NetworkReporter` (Web Perf APIs + CDP). This flag should be combined with `fuseboxNetworkInspectionEnabled` to enable Network CDP debugging. */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index 90f98c98f1d..cf9c347b5c3 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -803,6 +803,24 @@ bool ReactNativeFeatureFlagsAccessor::enableNativeCSSParsing() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::enableNativeViewPropTransformations() { + auto flagValue = enableNativeViewPropTransformations_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(43, "enableNativeViewPropTransformations"); + + flagValue = currentProvider_->enableNativeViewPropTransformations(); + enableNativeViewPropTransformations_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::enableNetworkEventReporting() { auto flagValue = enableNetworkEventReporting_.load(); @@ -812,7 +830,7 @@ bool ReactNativeFeatureFlagsAccessor::enableNetworkEventReporting() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(43, "enableNetworkEventReporting"); + markFlagAsAccessed(44, "enableNetworkEventReporting"); flagValue = currentProvider_->enableNetworkEventReporting(); enableNetworkEventReporting_ = flagValue; @@ -830,7 +848,7 @@ bool ReactNativeFeatureFlagsAccessor::enablePreparedTextLayout() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(44, "enablePreparedTextLayout"); + markFlagAsAccessed(45, "enablePreparedTextLayout"); flagValue = currentProvider_->enablePreparedTextLayout(); enablePreparedTextLayout_ = flagValue; @@ -848,7 +866,7 @@ bool ReactNativeFeatureFlagsAccessor::enablePropsUpdateReconciliationAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(45, "enablePropsUpdateReconciliationAndroid"); + markFlagAsAccessed(46, "enablePropsUpdateReconciliationAndroid"); flagValue = currentProvider_->enablePropsUpdateReconciliationAndroid(); enablePropsUpdateReconciliationAndroid_ = flagValue; @@ -866,7 +884,7 @@ bool ReactNativeFeatureFlagsAccessor::enableSwiftUIBasedFilters() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(46, "enableSwiftUIBasedFilters"); + markFlagAsAccessed(47, "enableSwiftUIBasedFilters"); flagValue = currentProvider_->enableSwiftUIBasedFilters(); enableSwiftUIBasedFilters_ = flagValue; @@ -884,7 +902,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewCulling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(47, "enableViewCulling"); + markFlagAsAccessed(48, "enableViewCulling"); flagValue = currentProvider_->enableViewCulling(); enableViewCulling_ = flagValue; @@ -902,7 +920,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecycling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(48, "enableViewRecycling"); + markFlagAsAccessed(49, "enableViewRecycling"); flagValue = currentProvider_->enableViewRecycling(); enableViewRecycling_ = flagValue; @@ -920,7 +938,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForImage() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(49, "enableViewRecyclingForImage"); + markFlagAsAccessed(50, "enableViewRecyclingForImage"); flagValue = currentProvider_->enableViewRecyclingForImage(); enableViewRecyclingForImage_ = flagValue; @@ -938,7 +956,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForScrollView() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(50, "enableViewRecyclingForScrollView"); + markFlagAsAccessed(51, "enableViewRecyclingForScrollView"); flagValue = currentProvider_->enableViewRecyclingForScrollView(); enableViewRecyclingForScrollView_ = flagValue; @@ -956,7 +974,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForText() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(51, "enableViewRecyclingForText"); + markFlagAsAccessed(52, "enableViewRecyclingForText"); flagValue = currentProvider_->enableViewRecyclingForText(); enableViewRecyclingForText_ = flagValue; @@ -974,7 +992,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForView() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(52, "enableViewRecyclingForView"); + markFlagAsAccessed(53, "enableViewRecyclingForView"); flagValue = currentProvider_->enableViewRecyclingForView(); enableViewRecyclingForView_ = flagValue; @@ -992,7 +1010,7 @@ bool ReactNativeFeatureFlagsAccessor::enableVirtualViewContainerStateExperimenta // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(53, "enableVirtualViewContainerStateExperimental"); + markFlagAsAccessed(54, "enableVirtualViewContainerStateExperimental"); flagValue = currentProvider_->enableVirtualViewContainerStateExperimental(); enableVirtualViewContainerStateExperimental_ = flagValue; @@ -1010,7 +1028,7 @@ bool ReactNativeFeatureFlagsAccessor::enableVirtualViewDebugFeatures() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(54, "enableVirtualViewDebugFeatures"); + markFlagAsAccessed(55, "enableVirtualViewDebugFeatures"); flagValue = currentProvider_->enableVirtualViewDebugFeatures(); enableVirtualViewDebugFeatures_ = flagValue; @@ -1028,7 +1046,7 @@ bool ReactNativeFeatureFlagsAccessor::fixFindShadowNodeByTagRaceCondition() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(55, "fixFindShadowNodeByTagRaceCondition"); + markFlagAsAccessed(56, "fixFindShadowNodeByTagRaceCondition"); flagValue = currentProvider_->fixFindShadowNodeByTagRaceCondition(); fixFindShadowNodeByTagRaceCondition_ = flagValue; @@ -1046,7 +1064,7 @@ bool ReactNativeFeatureFlagsAccessor::fixMappingOfEventPrioritiesBetweenFabricAn // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(56, "fixMappingOfEventPrioritiesBetweenFabricAndReact"); + markFlagAsAccessed(57, "fixMappingOfEventPrioritiesBetweenFabricAndReact"); flagValue = currentProvider_->fixMappingOfEventPrioritiesBetweenFabricAndReact(); fixMappingOfEventPrioritiesBetweenFabricAndReact_ = flagValue; @@ -1064,7 +1082,7 @@ bool ReactNativeFeatureFlagsAccessor::fixTextClippingAndroid15useBoundsForWidth( // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(57, "fixTextClippingAndroid15useBoundsForWidth"); + markFlagAsAccessed(58, "fixTextClippingAndroid15useBoundsForWidth"); flagValue = currentProvider_->fixTextClippingAndroid15useBoundsForWidth(); fixTextClippingAndroid15useBoundsForWidth_ = flagValue; @@ -1082,7 +1100,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxAssertSingleHostState() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(58, "fuseboxAssertSingleHostState"); + markFlagAsAccessed(59, "fuseboxAssertSingleHostState"); flagValue = currentProvider_->fuseboxAssertSingleHostState(); fuseboxAssertSingleHostState_ = flagValue; @@ -1100,7 +1118,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledRelease() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(59, "fuseboxEnabledRelease"); + markFlagAsAccessed(60, "fuseboxEnabledRelease"); flagValue = currentProvider_->fuseboxEnabledRelease(); fuseboxEnabledRelease_ = flagValue; @@ -1118,7 +1136,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxNetworkInspectionEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(60, "fuseboxNetworkInspectionEnabled"); + markFlagAsAccessed(61, "fuseboxNetworkInspectionEnabled"); flagValue = currentProvider_->fuseboxNetworkInspectionEnabled(); fuseboxNetworkInspectionEnabled_ = flagValue; @@ -1136,7 +1154,7 @@ bool ReactNativeFeatureFlagsAccessor::hideOffscreenVirtualViewsOnIOS() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(61, "hideOffscreenVirtualViewsOnIOS"); + markFlagAsAccessed(62, "hideOffscreenVirtualViewsOnIOS"); flagValue = currentProvider_->hideOffscreenVirtualViewsOnIOS(); hideOffscreenVirtualViewsOnIOS_ = flagValue; @@ -1154,7 +1172,7 @@ bool ReactNativeFeatureFlagsAccessor::overrideBySynchronousMountPropsAtMountingA // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(62, "overrideBySynchronousMountPropsAtMountingAndroid"); + markFlagAsAccessed(63, "overrideBySynchronousMountPropsAtMountingAndroid"); flagValue = currentProvider_->overrideBySynchronousMountPropsAtMountingAndroid(); overrideBySynchronousMountPropsAtMountingAndroid_ = flagValue; @@ -1172,7 +1190,7 @@ bool ReactNativeFeatureFlagsAccessor::perfIssuesEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(63, "perfIssuesEnabled"); + markFlagAsAccessed(64, "perfIssuesEnabled"); flagValue = currentProvider_->perfIssuesEnabled(); perfIssuesEnabled_ = flagValue; @@ -1190,7 +1208,7 @@ bool ReactNativeFeatureFlagsAccessor::perfMonitorV2Enabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(64, "perfMonitorV2Enabled"); + markFlagAsAccessed(65, "perfMonitorV2Enabled"); flagValue = currentProvider_->perfMonitorV2Enabled(); perfMonitorV2Enabled_ = flagValue; @@ -1208,7 +1226,7 @@ double ReactNativeFeatureFlagsAccessor::preparedTextCacheSize() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(65, "preparedTextCacheSize"); + markFlagAsAccessed(66, "preparedTextCacheSize"); flagValue = currentProvider_->preparedTextCacheSize(); preparedTextCacheSize_ = flagValue; @@ -1226,7 +1244,7 @@ bool ReactNativeFeatureFlagsAccessor::preventShadowTreeCommitExhaustion() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(66, "preventShadowTreeCommitExhaustion"); + markFlagAsAccessed(67, "preventShadowTreeCommitExhaustion"); flagValue = currentProvider_->preventShadowTreeCommitExhaustion(); preventShadowTreeCommitExhaustion_ = flagValue; @@ -1244,7 +1262,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldPressibilityUseW3CPointerEventsForHo // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(67, "shouldPressibilityUseW3CPointerEventsForHover"); + markFlagAsAccessed(68, "shouldPressibilityUseW3CPointerEventsForHover"); flagValue = currentProvider_->shouldPressibilityUseW3CPointerEventsForHover(); shouldPressibilityUseW3CPointerEventsForHover_ = flagValue; @@ -1262,7 +1280,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldTriggerResponderTransferOnScrollAndr // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(68, "shouldTriggerResponderTransferOnScrollAndroid"); + markFlagAsAccessed(69, "shouldTriggerResponderTransferOnScrollAndroid"); flagValue = currentProvider_->shouldTriggerResponderTransferOnScrollAndroid(); shouldTriggerResponderTransferOnScrollAndroid_ = flagValue; @@ -1280,7 +1298,7 @@ bool ReactNativeFeatureFlagsAccessor::skipActivityIdentityAssertionOnHostPause() // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(69, "skipActivityIdentityAssertionOnHostPause"); + markFlagAsAccessed(70, "skipActivityIdentityAssertionOnHostPause"); flagValue = currentProvider_->skipActivityIdentityAssertionOnHostPause(); skipActivityIdentityAssertionOnHostPause_ = flagValue; @@ -1298,7 +1316,7 @@ bool ReactNativeFeatureFlagsAccessor::syncAndroidClipToPaddingWithOverflow() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(70, "syncAndroidClipToPaddingWithOverflow"); + markFlagAsAccessed(71, "syncAndroidClipToPaddingWithOverflow"); flagValue = currentProvider_->syncAndroidClipToPaddingWithOverflow(); syncAndroidClipToPaddingWithOverflow_ = flagValue; @@ -1316,7 +1334,7 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(71, "traceTurboModulePromiseRejectionsOnAndroid"); + markFlagAsAccessed(72, "traceTurboModulePromiseRejectionsOnAndroid"); flagValue = currentProvider_->traceTurboModulePromiseRejectionsOnAndroid(); traceTurboModulePromiseRejectionsOnAndroid_ = flagValue; @@ -1334,7 +1352,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommit( // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(72, "updateRuntimeShadowNodeReferencesOnCommit"); + markFlagAsAccessed(73, "updateRuntimeShadowNodeReferencesOnCommit"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommit(); updateRuntimeShadowNodeReferencesOnCommit_ = flagValue; @@ -1352,7 +1370,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommitT // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(73, "updateRuntimeShadowNodeReferencesOnCommitThread"); + markFlagAsAccessed(74, "updateRuntimeShadowNodeReferencesOnCommitThread"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommitThread(); updateRuntimeShadowNodeReferencesOnCommitThread_ = flagValue; @@ -1370,7 +1388,7 @@ bool ReactNativeFeatureFlagsAccessor::useAlwaysAvailableJSErrorHandling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(74, "useAlwaysAvailableJSErrorHandling"); + markFlagAsAccessed(75, "useAlwaysAvailableJSErrorHandling"); flagValue = currentProvider_->useAlwaysAvailableJSErrorHandling(); useAlwaysAvailableJSErrorHandling_ = flagValue; @@ -1388,7 +1406,7 @@ bool ReactNativeFeatureFlagsAccessor::useFabricInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(75, "useFabricInterop"); + markFlagAsAccessed(76, "useFabricInterop"); flagValue = currentProvider_->useFabricInterop(); useFabricInterop_ = flagValue; @@ -1406,7 +1424,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeViewConfigsInBridgelessMode() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(76, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(77, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; @@ -1424,7 +1442,7 @@ bool ReactNativeFeatureFlagsAccessor::useNestedScrollViewAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(77, "useNestedScrollViewAndroid"); + markFlagAsAccessed(78, "useNestedScrollViewAndroid"); flagValue = currentProvider_->useNestedScrollViewAndroid(); useNestedScrollViewAndroid_ = flagValue; @@ -1442,7 +1460,7 @@ bool ReactNativeFeatureFlagsAccessor::useSharedAnimatedBackend() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(78, "useSharedAnimatedBackend"); + markFlagAsAccessed(79, "useSharedAnimatedBackend"); flagValue = currentProvider_->useSharedAnimatedBackend(); useSharedAnimatedBackend_ = flagValue; @@ -1460,7 +1478,7 @@ bool ReactNativeFeatureFlagsAccessor::useTraitHiddenOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(79, "useTraitHiddenOnAndroid"); + markFlagAsAccessed(80, "useTraitHiddenOnAndroid"); flagValue = currentProvider_->useTraitHiddenOnAndroid(); useTraitHiddenOnAndroid_ = flagValue; @@ -1478,7 +1496,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(80, "useTurboModuleInterop"); + markFlagAsAccessed(81, "useTurboModuleInterop"); flagValue = currentProvider_->useTurboModuleInterop(); useTurboModuleInterop_ = flagValue; @@ -1496,7 +1514,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModules() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(81, "useTurboModules"); + markFlagAsAccessed(82, "useTurboModules"); flagValue = currentProvider_->useTurboModules(); useTurboModules_ = flagValue; @@ -1514,7 +1532,7 @@ bool ReactNativeFeatureFlagsAccessor::useUnorderedMapInDifferentiator() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(82, "useUnorderedMapInDifferentiator"); + markFlagAsAccessed(83, "useUnorderedMapInDifferentiator"); flagValue = currentProvider_->useUnorderedMapInDifferentiator(); useUnorderedMapInDifferentiator_ = flagValue; @@ -1532,7 +1550,7 @@ double ReactNativeFeatureFlagsAccessor::viewCullingOutsetRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(83, "viewCullingOutsetRatio"); + markFlagAsAccessed(84, "viewCullingOutsetRatio"); flagValue = currentProvider_->viewCullingOutsetRatio(); viewCullingOutsetRatio_ = flagValue; @@ -1550,7 +1568,7 @@ bool ReactNativeFeatureFlagsAccessor::viewTransitionEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(84, "viewTransitionEnabled"); + markFlagAsAccessed(85, "viewTransitionEnabled"); flagValue = currentProvider_->viewTransitionEnabled(); viewTransitionEnabled_ = flagValue; @@ -1568,7 +1586,7 @@ double ReactNativeFeatureFlagsAccessor::virtualViewPrerenderRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(85, "virtualViewPrerenderRatio"); + markFlagAsAccessed(86, "virtualViewPrerenderRatio"); flagValue = currentProvider_->virtualViewPrerenderRatio(); virtualViewPrerenderRatio_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index 454d483bf89..754cf0afa06 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<63a0714c9c06697555b9b66f2bd77288>> */ /** @@ -75,6 +75,7 @@ class ReactNativeFeatureFlagsAccessor { bool enableMainQueueCoordinatorOnIOS(); bool enableModuleArgumentNSNullConversionIOS(); bool enableNativeCSSParsing(); + bool enableNativeViewPropTransformations(); bool enableNetworkEventReporting(); bool enablePreparedTextLayout(); bool enablePropsUpdateReconciliationAndroid(); @@ -129,7 +130,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 86> accessedFeatureFlags_; + std::array, 87> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> cdpInteractionMetricsEnabled_; @@ -174,6 +175,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> enableMainQueueCoordinatorOnIOS_; std::atomic> enableModuleArgumentNSNullConversionIOS_; std::atomic> enableNativeCSSParsing_; + std::atomic> enableNativeViewPropTransformations_; std::atomic> enableNetworkEventReporting_; std::atomic> enablePreparedTextLayout_; std::atomic> enablePropsUpdateReconciliationAndroid_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 1807361bc1f..aa3675116ca 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<613758ace44bd00d1156d05f365f1119>> */ /** @@ -199,6 +199,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool enableNativeViewPropTransformations() override { + return false; + } + bool enableNetworkEventReporting() override { return true; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index 9b51cd8ea33..97a94b58dcb 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<0ed8edbf386bc66719f23b2514d05074>> */ /** @@ -432,6 +432,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::enableNativeCSSParsing(); } + bool enableNativeViewPropTransformations() override { + auto value = values_["enableNativeViewPropTransformations"]; + if (!value.isNull()) { + return value.getBool(); + } + + return ReactNativeFeatureFlagsDefaults::enableNativeViewPropTransformations(); + } + bool enableNetworkEventReporting() override { auto value = values_["enableNetworkEventReporting"]; if (!value.isNull()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index 0c6e9ae47a4..b9cc111cd84 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<37ac0b0a8ecb4ee585cd6c0d1b14bfce>> */ /** @@ -68,6 +68,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool enableMainQueueCoordinatorOnIOS() = 0; virtual bool enableModuleArgumentNSNullConversionIOS() = 0; virtual bool enableNativeCSSParsing() = 0; + virtual bool enableNativeViewPropTransformations() = 0; virtual bool enableNetworkEventReporting() = 0; virtual bool enablePreparedTextLayout() = 0; virtual bool enablePropsUpdateReconciliationAndroid() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index bb1057121ce..701e31305c7 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<11d5240e0fd4bce14794689d7521cda3>> */ /** @@ -259,6 +259,11 @@ bool NativeReactNativeFeatureFlags::enableNativeCSSParsing( return ReactNativeFeatureFlags::enableNativeCSSParsing(); } +bool NativeReactNativeFeatureFlags::enableNativeViewPropTransformations( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableNativeViewPropTransformations(); +} + bool NativeReactNativeFeatureFlags::enableNetworkEventReporting( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableNetworkEventReporting(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 8e919af8df5..72a9b5568d1 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<567578eba7383f26c5d745c57d110e61>> + * @generated SignedSource<> */ /** @@ -122,6 +122,8 @@ class NativeReactNativeFeatureFlags bool enableNativeCSSParsing(jsi::Runtime& runtime); + bool enableNativeViewPropTransformations(jsi::Runtime& runtime); + bool enableNetworkEventReporting(jsi::Runtime& runtime); bool enablePreparedTextLayout(jsi::Runtime& runtime); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp index cc39827f8ef..9bf1bb2b65b 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp @@ -15,6 +15,24 @@ namespace facebook::react { +static AccessibilityLabelledBy parseCommaSeparatedList(const std::string& str) { + AccessibilityLabelledBy result; + size_t pos = 0; + while (pos < str.size()) { + auto commaPos = str.find(',', pos); + if (commaPos == std::string::npos) { + commaPos = str.size(); + } + auto start = str.find_first_not_of(' ', pos); + if (start < commaPos) { + auto end = str.find_last_not_of(' ', commaPos - 1); + result.value.push_back(str.substr(start, end - start + 1)); + } + pos = commaPos + 1; + } + return result; +} + AccessibilityProps::AccessibilityProps( const PropsParserContext& context, const AccessibilityProps& sourceProps, @@ -216,7 +234,14 @@ AccessibilityProps::AccessibilityProps( rawProps, "testID", sourceProps.testId, - "")) { + "")), + canonicalAccessibilityLabel_(sourceProps.canonicalAccessibilityLabel_), + canonicalAccessibilityLiveRegion_( + sourceProps.canonicalAccessibilityLiveRegion_), + canonicalImportantForAccessibility_( + sourceProps.canonicalImportantForAccessibility_), + canonicalAccessibilityElementsHidden_( + sourceProps.canonicalAccessibilityElementsHidden_) { // It is a (severe!) perf deoptimization to request props out-of-order. // Thus, since we need to request the same prop twice here // (accessibilityRole) we "must" do them subsequently here to prevent @@ -254,6 +279,244 @@ AccessibilityProps::AccessibilityProps( } else { fromRawValue(context, *precedentRoleValue, accessibilityTraits); } + + if (ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + static auto defaults = AccessibilityProps{}; + + // Update canonical values from explicit props if present. + // These track the user-set accessibility* prop values separately + // from any aria-* override, so we can restore them when an + // aria-* alias is cleared. + auto* explicitLabel = rawProps.at("accessibilityLabel", nullptr, nullptr); + if (explicitLabel != nullptr) { + canonicalAccessibilityLabel_ = explicitLabel->hasValue() + ? accessibilityLabel + : defaults.accessibilityLabel; + } + + auto* explicitLiveRegion = + rawProps.at("accessibilityLiveRegion", nullptr, nullptr); + if (explicitLiveRegion != nullptr) { + canonicalAccessibilityLiveRegion_ = explicitLiveRegion->hasValue() + ? accessibilityLiveRegion + : defaults.accessibilityLiveRegion; + } + + auto* explicitIFA = + rawProps.at("importantForAccessibility", nullptr, nullptr); + if (explicitIFA != nullptr) { + canonicalImportantForAccessibility_ = explicitIFA->hasValue() + ? importantForAccessibility + : defaults.importantForAccessibility; + } + + auto* explicitAEH = + rawProps.at("accessibilityElementsHidden", nullptr, nullptr); + if (explicitAEH != nullptr) { + canonicalAccessibilityElementsHidden_ = explicitAEH->hasValue() + ? accessibilityElementsHidden + : defaults.accessibilityElementsHidden; + } + + // aria-label -> accessibilityLabel + auto* ariaLabel = rawProps.at("aria-label", nullptr, nullptr); + if (ariaLabel != nullptr) { + if (ariaLabel->hasValue()) { + fromRawValue(context, *ariaLabel, accessibilityLabel); + } else { + accessibilityLabel = canonicalAccessibilityLabel_; + } + } + + // aria-labelledby -> accessibilityLabelledBy (comma-split string -> + // array) + auto* ariaLabelledBy = rawProps.at("aria-labelledby", nullptr, nullptr); + if (ariaLabelledBy != nullptr) { + if (ariaLabelledBy->hasValue()) { + if (ariaLabelledBy->hasType()) { + accessibilityLabelledBy = + parseCommaSeparatedList((std::string)*ariaLabelledBy); + } else { + fromRawValue(context, *ariaLabelledBy, accessibilityLabelledBy); + } + } else { + accessibilityLabelledBy = defaults.accessibilityLabelledBy; + } + } + + // aria-live -> accessibilityLiveRegion (map "off" -> None) + auto* ariaLive = rawProps.at("aria-live", nullptr, nullptr); + if (ariaLive != nullptr) { + if (ariaLive->hasValue()) { + if (ariaLive->hasType()) { + auto str = (std::string)*ariaLive; + if (str == "off") { + accessibilityLiveRegion = AccessibilityLiveRegion::None; + } else { + fromRawValue(context, *ariaLive, accessibilityLiveRegion); + } + } + } else { + accessibilityLiveRegion = canonicalAccessibilityLiveRegion_; + } + } + + // aria-hidden -> accessibilityElementsHidden + + // importantForAccessibility + auto* ariaHidden = rawProps.at("aria-hidden", nullptr, nullptr); + if (ariaHidden != nullptr) { + if (ariaHidden->hasValue()) { + fromRawValue(context, *ariaHidden, accessibilityElementsHidden); + if (accessibilityElementsHidden) { + importantForAccessibility = + ImportantForAccessibility::NoHideDescendants; + } else { + importantForAccessibility = canonicalImportantForAccessibility_; + } + } else { + accessibilityElementsHidden = canonicalAccessibilityElementsHidden_; + importantForAccessibility = canonicalImportantForAccessibility_; + } + } + + // aria-busy -> accessibilityState.busy + auto* ariaBusy = rawProps.at("aria-busy", nullptr, nullptr); + if (ariaBusy != nullptr) { + if (ariaBusy->hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, *ariaBusy, accessibilityState->busy); + } else { + if (accessibilityState.has_value()) { + accessibilityState->busy = AccessibilityState{}.busy; + } + } + } + + // aria-checked -> accessibilityState.checked + auto* ariaChecked = rawProps.at("aria-checked", nullptr, nullptr); + if (ariaChecked != nullptr) { + if (ariaChecked->hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + if (ariaChecked->hasType()) { + if ((std::string)*ariaChecked == "mixed") { + accessibilityState->checked = AccessibilityState::Mixed; + } + } else if (ariaChecked->hasType()) { + accessibilityState->checked = (bool)*ariaChecked + ? AccessibilityState::Checked + : AccessibilityState::Unchecked; + } + } else { + if (accessibilityState.has_value()) { + accessibilityState->checked = AccessibilityState{}.checked; + } + } + } + + // aria-disabled -> accessibilityState.disabled + auto* ariaDisabled = rawProps.at("aria-disabled", nullptr, nullptr); + if (ariaDisabled != nullptr) { + if (ariaDisabled->hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, *ariaDisabled, accessibilityState->disabled); + } else { + if (accessibilityState.has_value()) { + accessibilityState->disabled = AccessibilityState{}.disabled; + } + } + } + + // aria-expanded -> accessibilityState.expanded + auto* ariaExpanded = rawProps.at("aria-expanded", nullptr, nullptr); + if (ariaExpanded != nullptr) { + if (ariaExpanded->hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, *ariaExpanded, accessibilityState->expanded); + } else { + if (accessibilityState.has_value()) { + accessibilityState->expanded = AccessibilityState{}.expanded; + } + } + } + + // aria-selected -> accessibilityState.selected + auto* ariaSelected = rawProps.at("aria-selected", nullptr, nullptr); + if (ariaSelected != nullptr) { + if (ariaSelected->hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, *ariaSelected, accessibilityState->selected); + } else { + if (accessibilityState.has_value()) { + accessibilityState->selected = AccessibilityState{}.selected; + } + } + } + + // If all aria-state fields have been reset to defaults, clear the + // optional entirely so the view reports no accessibilityState. + if (accessibilityState.has_value() && + *accessibilityState == AccessibilityState{}) { + accessibilityState = std::nullopt; + } + + // aria-valuemax -> accessibilityValue.max + auto* ariaValueMax = rawProps.at("aria-valuemax", nullptr, nullptr); + if (ariaValueMax != nullptr) { + if (ariaValueMax->hasValue()) { + if (ariaValueMax->hasType()) { + accessibilityValue.max = (int)*ariaValueMax; + } + } else { + accessibilityValue.max = std::nullopt; + } + } + + // aria-valuemin -> accessibilityValue.min + auto* ariaValueMin = rawProps.at("aria-valuemin", nullptr, nullptr); + if (ariaValueMin != nullptr) { + if (ariaValueMin->hasValue()) { + if (ariaValueMin->hasType()) { + accessibilityValue.min = (int)*ariaValueMin; + } + } else { + accessibilityValue.min = std::nullopt; + } + } + + // aria-valuenow -> accessibilityValue.now + auto* ariaValueNow = rawProps.at("aria-valuenow", nullptr, nullptr); + if (ariaValueNow != nullptr) { + if (ariaValueNow->hasValue()) { + if (ariaValueNow->hasType()) { + accessibilityValue.now = (int)*ariaValueNow; + } + } else { + accessibilityValue.now = std::nullopt; + } + } + + // aria-valuetext -> accessibilityValue.text + auto* ariaValueText = rawProps.at("aria-valuetext", nullptr, nullptr); + if (ariaValueText != nullptr) { + if (ariaValueText->hasValue()) { + if (ariaValueText->hasType()) { + accessibilityValue.text = (std::string)*ariaValueText; + } + } else { + accessibilityValue.text = std::nullopt; + } + } + } } } @@ -267,26 +530,56 @@ void AccessibilityProps::setProp( switch (hash) { RAW_SET_PROP_SWITCH_CASE_BASIC(accessible); RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityState); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLabel); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityOrder); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLabelledBy); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityHint); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLanguage); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityShowsLargeContentViewer); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLargeContentTitle); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityValue); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityActions); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityViewIsModal); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityElementsHidden); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityIgnoresInvertColors); - RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityRespondsToUserInteraction); - RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityTap); - RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityMagicTap); - RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityEscape); - RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityAction); - RAW_SET_PROP_SWITCH_CASE_BASIC(importantForAccessibility); - RAW_SET_PROP_SWITCH_CASE_BASIC(role); - RAW_SET_PROP_SWITCH_CASE(testId, "testID"); + case CONSTEXPR_RAW_PROPS_KEY_HASH("accessibilityLabel"): { + fromRawValue( + context, value, accessibilityLabel, defaults.accessibilityLabel); + canonicalAccessibilityLabel_ = accessibilityLabel; + return; + } + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityOrder); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLabelledBy); + case CONSTEXPR_RAW_PROPS_KEY_HASH("accessibilityLiveRegion"): { + fromRawValue( + context, + value, + accessibilityLiveRegion, + defaults.accessibilityLiveRegion); + canonicalAccessibilityLiveRegion_ = accessibilityLiveRegion; + return; + } + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityHint); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLanguage); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityShowsLargeContentViewer); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityLargeContentTitle); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityValue); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityActions); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityViewIsModal); + case CONSTEXPR_RAW_PROPS_KEY_HASH("accessibilityElementsHidden"): { + fromRawValue( + context, + value, + accessibilityElementsHidden, + defaults.accessibilityElementsHidden); + canonicalAccessibilityElementsHidden_ = accessibilityElementsHidden; + return; + } + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityIgnoresInvertColors); + RAW_SET_PROP_SWITCH_CASE_BASIC(accessibilityRespondsToUserInteraction); + RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityTap); + RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityMagicTap); + RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityEscape); + RAW_SET_PROP_SWITCH_CASE_BASIC(onAccessibilityAction); + case CONSTEXPR_RAW_PROPS_KEY_HASH("importantForAccessibility"): { + fromRawValue( + context, + value, + importantForAccessibility, + defaults.importantForAccessibility); + canonicalImportantForAccessibility_ = importantForAccessibility; + return; + } + RAW_SET_PROP_SWITCH_CASE_BASIC(role); + RAW_SET_PROP_SWITCH_CASE(testId, "testID"); case CONSTEXPR_RAW_PROPS_KEY_HASH("accessibilityRole"): { AccessibilityTraits traits = AccessibilityTraits::None; std::string roleString; @@ -299,6 +592,223 @@ void AccessibilityProps::setProp( accessibilityRole = roleString; return; } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-label"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + fromRawValue(context, value, accessibilityLabel); + } else { + accessibilityLabel = canonicalAccessibilityLabel_; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-labelledby"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (value.hasType()) { + accessibilityLabelledBy = parseCommaSeparatedList((std::string)value); + } else { + fromRawValue(context, value, accessibilityLabelledBy); + } + } else { + accessibilityLabelledBy = defaults.accessibilityLabelledBy; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-live"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (value.hasType()) { + auto str = (std::string)value; + if (str == "off") { + accessibilityLiveRegion = AccessibilityLiveRegion::None; + } else { + fromRawValue(context, value, accessibilityLiveRegion); + } + } + } else { + accessibilityLiveRegion = canonicalAccessibilityLiveRegion_; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-hidden"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + fromRawValue(context, value, accessibilityElementsHidden); + if (accessibilityElementsHidden) { + importantForAccessibility = + ImportantForAccessibility::NoHideDescendants; + } else { + importantForAccessibility = canonicalImportantForAccessibility_; + } + } else { + accessibilityElementsHidden = canonicalAccessibilityElementsHidden_; + importantForAccessibility = canonicalImportantForAccessibility_; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-busy"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, value, accessibilityState->busy); + } else { + if (accessibilityState.has_value()) { + accessibilityState->busy = AccessibilityState{}.busy; + if (*accessibilityState == AccessibilityState{}) { + accessibilityState = std::nullopt; + } + } + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-checked"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + if (value.hasType()) { + if ((std::string)value == "mixed") { + accessibilityState->checked = AccessibilityState::Mixed; + } + } else if (value.hasType()) { + accessibilityState->checked = (bool)value + ? AccessibilityState::Checked + : AccessibilityState::Unchecked; + } + } else { + if (accessibilityState.has_value()) { + accessibilityState->checked = AccessibilityState{}.checked; + if (*accessibilityState == AccessibilityState{}) { + accessibilityState = std::nullopt; + } + } + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-disabled"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, value, accessibilityState->disabled); + } else { + if (accessibilityState.has_value()) { + accessibilityState->disabled = AccessibilityState{}.disabled; + if (*accessibilityState == AccessibilityState{}) { + accessibilityState = std::nullopt; + } + } + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-expanded"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, value, accessibilityState->expanded); + } else { + if (accessibilityState.has_value()) { + accessibilityState->expanded = AccessibilityState{}.expanded; + if (*accessibilityState == AccessibilityState{}) { + accessibilityState = std::nullopt; + } + } + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-selected"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (!accessibilityState.has_value()) { + accessibilityState = AccessibilityState{}; + } + fromRawValue(context, value, accessibilityState->selected); + } else { + if (accessibilityState.has_value()) { + accessibilityState->selected = AccessibilityState{}.selected; + if (*accessibilityState == AccessibilityState{}) { + accessibilityState = std::nullopt; + } + } + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-valuemax"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (value.hasType()) { + accessibilityValue.max = (int)value; + } + } else { + accessibilityValue.max = std::nullopt; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-valuemin"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (value.hasType()) { + accessibilityValue.min = (int)value; + } + } else { + accessibilityValue.min = std::nullopt; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-valuenow"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (value.hasType()) { + accessibilityValue.now = (int)value; + } + } else { + accessibilityValue.now = std::nullopt; + } + return; + } + case CONSTEXPR_RAW_PROPS_KEY_HASH("aria-valuetext"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + if (value.hasType()) { + accessibilityValue.text = (std::string)value; + } + } else { + accessibilityValue.text = std::nullopt; + } + return; + } } } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.h b/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.h index c664b8461e2..625b7170717 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityProps.h @@ -62,6 +62,15 @@ class AccessibilityProps { #if RN_DEBUG_STRING_CONVERTIBLE SharedDebugStringConvertibleList getDebugProps() const; #endif + + private: + // Canonical prop values for overlap detection between aria-* and + // accessibility* props. These track the values from the explicit + // accessibility* props, separate from any aria-* override. + std::string canonicalAccessibilityLabel_; + AccessibilityLiveRegion canonicalAccessibilityLiveRegion_{AccessibilityLiveRegion::None}; + ImportantForAccessibility canonicalImportantForAccessibility_{ImportantForAccessibility::Auto}; + bool canonicalAccessibilityElementsHidden_{false}; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp index 3237f54cbdc..b47d7f1beec 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp @@ -141,7 +141,23 @@ HostPlatformViewProps::HostPlatformViewProps( rawProps, "nextFocusUp", sourceProps.nextFocusUp, - {})) {} + {})) { + if (!ReactNativeFeatureFlags::enableCppPropsIteratorSetter()) { + if (ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + // tabIndex -> focusable + auto* tabIndexValue = rawProps.at("tabIndex", nullptr, nullptr); + if (tabIndexValue != nullptr) { + if (tabIndexValue->hasValue()) { + int tabIndex = 0; + fromRawValue(context, *tabIndexValue, tabIndex); + focusable = tabIndex == 0; + } else { + focusable = {}; + } + } + } + } +} #define VIEW_EVENT_CASE(eventType) \ case CONSTEXPR_RAW_PROPS_KEY_HASH("on" #eventType): { \ @@ -181,6 +197,19 @@ void HostPlatformViewProps::setProp( RAW_SET_PROP_SWITCH_CASE_BASIC(nextFocusLeft); RAW_SET_PROP_SWITCH_CASE_BASIC(nextFocusRight); RAW_SET_PROP_SWITCH_CASE_BASIC(nextFocusUp); + case CONSTEXPR_RAW_PROPS_KEY_HASH("tabIndex"): { + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + if (value.hasValue()) { + int tabIndex = 0; + fromRawValue(context, value, tabIndex); + focusable = tabIndex == 0; + } else { + focusable = defaults.focusable; + } + return; + } } } diff --git a/packages/react-native/ReactCommon/react/renderer/core/Props.cpp b/packages/react-native/ReactCommon/react/renderer/core/Props.cpp index 1f86cfb0866..3b7d126bb6d 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/Props.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/Props.cpp @@ -32,6 +32,20 @@ void Props::initialize( nativeId = ReactNativeFeatureFlags::enableCppPropsIteratorSetter() ? sourceProps.nativeId : convertRawProp(context, rawProps, "nativeID", sourceProps.nativeId, {}); + + if (!ReactNativeFeatureFlags::enableCppPropsIteratorSetter()) { + if (ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + // id -> nativeId + auto* idValue = rawProps.at("id", nullptr, nullptr); + if (idValue != nullptr) { + if (idValue->hasValue()) { + fromRawValue(context, *idValue, nativeId); + } else { + nativeId = {}; + } + } + } + } #ifdef RN_SERIALIZABLE_STATE if (!ReactNativeFeatureFlags::enableExclusivePropsUpdateAndroid()) { initializeDynamicProps(sourceProps, rawProps, filterObjectKeys); @@ -48,6 +62,12 @@ void Props::setProp( case CONSTEXPR_RAW_PROPS_KEY_HASH("nativeID"): fromRawValue(context, value, nativeId, {}); return; + case CONSTEXPR_RAW_PROPS_KEY_HASH("id"): + if (!ReactNativeFeatureFlags::enableNativeViewPropTransformations()) { + return; + } + fromRawValue(context, value, nativeId, {}); + return; } } diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 957047b5bcb..4a3fafab275 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -507,6 +507,17 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'none', }, + enableNativeViewPropTransformations: { + defaultValue: false, + metadata: { + dateAdded: '2026-02-26', + description: + 'When enabled, View.js passes aria-*, id, and tabIndex props directly to native, relying on C++ prop parsing instead of JS-side transformations.', + expectedReleaseValue: true, + purpose: 'experimentation', + }, + ossReleaseStage: 'none', + }, enableNetworkEventReporting: { defaultValue: true, metadata: { diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index ed2200b5c99..824e851550d 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<6c49874d2e5f3f9dfa6c64945026f4b7>> + * @generated SignedSource<<5072c12941f3173be27ac422320c3caa>> * @flow strict * @noformat */ @@ -91,6 +91,7 @@ export type ReactNativeFeatureFlags = $ReadOnly<{ enableMainQueueCoordinatorOnIOS: Getter, enableModuleArgumentNSNullConversionIOS: Getter, enableNativeCSSParsing: Getter, + enableNativeViewPropTransformations: Getter, enableNetworkEventReporting: Getter, enablePreparedTextLayout: Getter, enablePropsUpdateReconciliationAndroid: Getter, @@ -377,6 +378,10 @@ export const enableModuleArgumentNSNullConversionIOS: Getter = createNa * Parse CSS strings using the Fabric CSS parser instead of ViewConfig processing */ export const enableNativeCSSParsing: Getter = createNativeFlagGetter('enableNativeCSSParsing', false); +/** + * When enabled, View.js passes aria-*, id, and tabIndex props directly to native, relying on C++ prop parsing instead of JS-side transformations. + */ +export const enableNativeViewPropTransformations: Getter = createNativeFlagGetter('enableNativeViewPropTransformations', false); /** * Enable network event reporting hooks in each native platform through `NetworkReporter` (Web Perf APIs + CDP). This flag should be combined with `fuseboxNetworkInspectionEnabled` to enable Network CDP debugging. */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index 6c01f3b3bba..1cc964cdf0f 100644 --- a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<3fd91ee5bd5c4d53241b3946d8e0b056>> * @flow strict * @noformat */ @@ -68,6 +68,7 @@ export interface Spec extends TurboModule { +enableMainQueueCoordinatorOnIOS?: () => boolean; +enableModuleArgumentNSNullConversionIOS?: () => boolean; +enableNativeCSSParsing?: () => boolean; + +enableNativeViewPropTransformations?: () => boolean; +enableNetworkEventReporting?: () => boolean; +enablePreparedTextLayout?: () => boolean; +enablePropsUpdateReconciliationAndroid?: () => boolean; From 238bd2452ec0150d37d8f2ee58452be0181d02a6 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Wed, 4 Mar 2026 09:23:50 -0800 Subject: [PATCH 058/595] Add error when running build script after prepack (#55914) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55914 Introduce a clear error message if running `yarn build` again after `yarn prepack` (which will have applied the `"publishConfig"` field to each `package.json`, just ahead of publishing to npm). This state should never happen in CI or local dev, but can occur if repeat-running `yarn test-release-local` without `yarn test-release-local-clean`. Introducing a validation error is preferable over making this idempotent (logic would be complex + fragile) for this rare + out-of-design edge case. Changelog: [Internal] Reviewed By: alanleedev Differential Revision: D95215735 fbshipit-source-id: 5a9be44f0d0ae1f2721eed2b11088466a4ff7f72 --- scripts/build/build.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/scripts/build/build.js b/scripts/build/build.js index 9ff364c58c6..c8b670a8c0e 100644 --- a/scripts/build/build.js +++ b/scripts/build/build.js @@ -85,6 +85,10 @@ async function build() { async function buildPackage(packageName /*: string */, prepack /*: boolean */) { try { + process.stdout.write( + `${packageName} ${styleText('dim', '.').repeat(72 - packageName.length)} `, + ); + const {emitTypeScriptDefs} = getBuildOptions(packageName); const entryPoints = await getEntryPoints(packageName); @@ -98,10 +102,6 @@ async function buildPackage(packageName /*: string */, prepack /*: boolean */) { !entryPoints.has(file.replace(/\.js$/, '.flow.js')), ); - process.stdout.write( - `${packageName} ${styleText('dim', '.').repeat(72 - packageName.length)} `, - ); - // Build regular files for (const file of files) { await buildFile(path.normalize(file), { @@ -299,6 +299,15 @@ async function getEntryPoints( continue; } + if (target.startsWith('./' + BUILD_DIR + '/')) { + throw new Error( + `Found ./${BUILD_DIR}/* entry in package.json exports for ` + + `${packageName}. This is either a misconfiguration, or the ` + + `prepack script was previously run and the package.json state ` + + `is dirty. Please re-run against a clean working copy.`, + ); + } + if (target.includes('*')) { console.warn( `${styleText('yellow', 'Warning')}: Encountered subpath pattern ${subpath}` + From aa51746b87e5e04924e3fcfaf459f9bb1c9ca38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Wed, 4 Mar 2026 10:15:59 -0800 Subject: [PATCH 059/595] Formalize event timestamps and propagate from host platform to JS (#55878) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55878 Changelog: [General][Fixed] - Fix event timestamp propagation from host platforms to JS This adds event timestamps as a first class concept in Fabric during dispatch, and uses the new methods to dispatch events to pass the values from the host platform (Android and iOS). If the value isn't pass, the current timestamp at the time of dispatch is used (which is close enough). This fixes several problems: 1. Makes event timestamps account for native event dispatch delay. 2. Normalizes event timestamps across APIs (event timestamp property, Event Timing API information, etc.). NOTE: I had to implement clock correction on iOS because the timing we get from UITouch objects doesn't use the same clock as we do in C++. Reviewed By: javache, NickGerleman Differential Revision: D94669354 fbshipit-source-id: 945ce5dd2d2f44f2106e631854de40a109a6cb81 --- .../React/Fabric/RCTConversions.h | 19 +++++ .../React/Fabric/RCTSurfacePointerHandler.mm | 10 ++- .../React/Fabric/RCTSurfaceTouchHandler.mm | 1 + .../ReactAndroid/api/ReactAndroid.api | 4 + .../react/animated/EventAnimationDriver.kt | 1 + .../react/fabric/FabricUIManager.java | 82 +++++++++++++++++-- .../fabric/events/EventEmitterWrapper.kt | 33 ++++++-- .../react/fabric/events/FabricEventEmitter.kt | 35 +++++++- .../react/fabric/mounting/MountingManager.kt | 10 ++- .../fabric/mounting/SurfaceMountingManager.kt | 28 ++++++- .../uimanager/events/FabricEventDispatcher.kt | 1 + .../react/uimanager/events/PointerEvent.kt | 1 + .../uimanager/events/RCTModernEventEmitter.kt | 30 +++++++ .../events/SynchronousEventReceiver.kt | 28 +++++++ .../react/uimanager/events/TouchesHelper.kt | 1 + .../jni/react/fabric/EventEmitterWrapper.cpp | 32 ++++++-- .../jni/react/fabric/EventEmitterWrapper.h | 6 +- .../fabric/events/TouchEventDispatchTest.kt | 3 + .../renderer/components/view/BaseTouch.cpp | 5 +- .../renderer/components/view/BaseTouch.h | 7 ++ .../renderer/components/view/PointerEvent.cpp | 2 + .../renderer/components/view/PointerEvent.h | 5 ++ .../renderer/components/view/TouchEvent.h | 2 - .../components/view/TouchEventEmitter.cpp | 28 +++++-- .../components/view/TouchEventEmitter.h | 1 + .../react/renderer/core/EventEmitter.cpp | 69 +++++++++++++++- .../react/renderer/core/EventEmitter.h | 25 ++++++ .../react/renderer/core/EventPipe.h | 4 +- .../renderer/core/EventQueueProcessor.cpp | 3 +- .../react/renderer/core/RawEvent.cpp | 6 +- .../react/renderer/core/RawEvent.h | 12 +-- .../core/tests/EventQueueProcessorTest.cpp | 3 +- .../react/renderer/scheduler/Scheduler.cpp | 5 +- .../renderer/uimanager/UIManagerBinding.cpp | 27 ++++-- .../renderer/uimanager/UIManagerBinding.h | 7 +- .../__tests__/EventTimingAPI-itest.js | 38 +++++++++ 36 files changed, 514 insertions(+), 60 deletions(-) diff --git a/packages/react-native/React/Fabric/RCTConversions.h b/packages/react-native/React/Fabric/RCTConversions.h index 582c0f8e834..cb14f8210fb 100644 --- a/packages/react-native/React/Fabric/RCTConversions.h +++ b/packages/react-native/React/Fabric/RCTConversions.h @@ -13,9 +13,28 @@ #import #import #import +#import NS_ASSUME_NONNULL_BEGIN +/* + * Converts an iOS timestamp (seconds since boot, NOT including sleep time, from + * NSProcessInfo.processInfo.systemUptime or UITouch.timestamp) to a HighResTimeStamp. + * + * iOS timestamps use mach_absolute_time() which doesn't account for sleep time, + * while std::chrono::steady_clock uses mach_continuous_time() which does. + * To handle this correctly, we compute the relative offset from the current time + * and apply it to HighResTimeStamp::now(). + */ +inline facebook::react::HighResTimeStamp RCTHighResTimeStampFromSeconds(NSTimeInterval seconds) +{ + NSTimeInterval nowSystemUptime = NSProcessInfo.processInfo.systemUptime; + NSTimeInterval delta = nowSystemUptime - seconds; + auto deltaDuration = + std::chrono::duration_cast(std::chrono::duration(delta)); + return facebook::react::HighResTimeStamp::now() - facebook::react::HighResDuration::fromChrono(deltaDuration); +} + inline NSString *RCTNSStringFromString( const std::string &string, const NSStringEncoding &encoding = NSUTF8StringEncoding) diff --git a/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm b/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm index e0078c094a3..18246804d43 100644 --- a/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm +++ b/packages/react-native/React/Fabric/RCTSurfacePointerHandler.mm @@ -285,6 +285,7 @@ static PointerEvent CreatePointerEventFromActivePointer( PointerEvent event = {}; event.pointerId = activePointer.identifier; event.pointerType = PointerTypeCStringFromUITouchType(activePointer.touchType); + event.timeStamp = RCTHighResTimeStampFromSeconds(activePointer.timestamp); if (eventType == RCTPointerEventTypeCancel) { event.clientPoint = RCTPointFromCGPoint(CGPointZero); @@ -345,7 +346,8 @@ static PointerEvent CreatePointerEventFromIncompleteHoverData( CGPoint clientLocation, CGPoint screenLocation, CGPoint offsetLocation, - UIKeyModifierFlags modifierFlags) + UIKeyModifierFlags modifierFlags, + HighResTimeStamp timeStamp) { PointerEvent event = {}; event.pointerId = pointerId; @@ -365,6 +367,7 @@ static PointerEvent CreatePointerEventFromIncompleteHoverData( event.tangentialPressure = 0.0; event.twist = 0; event.isPrimary = true; + event.timeStamp = timeStamp; return event; } @@ -760,8 +763,11 @@ - (void)hovering:(UIHoverGestureRecognizer *)recognizer modifierFlags = recognizer.modifierFlags; + // For hover events, use the current time as we don't have a precise timestamp + HighResTimeStamp eventTimestamp = HighResTimeStamp::now(); + PointerEvent event = CreatePointerEventFromIncompleteHoverData( - pointerId, pointerType, clientLocation, screenLocation, offsetLocation, modifierFlags); + pointerId, pointerType, clientLocation, screenLocation, offsetLocation, modifierFlags, eventTimestamp); SharedTouchEventEmitter eventEmitter = GetTouchEmitterFromView(targetView, offsetLocation); if (eventEmitter != nil) { diff --git a/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm b/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm index ea2952c23e7..4945d3559f6 100644 --- a/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm +++ b/packages/react-native/React/Fabric/RCTSurfaceTouchHandler.mm @@ -67,6 +67,7 @@ static void UpdateActiveTouchWithUITouch( activeTouch.touch.pagePoint = RCTPointFromCGPoint(pagePoint); activeTouch.touch.timestamp = uiTouch.timestamp; + activeTouch.touch.timeStamp = RCTHighResTimeStampFromSeconds(uiTouch.timestamp); if (RCTForceTouchAvailable()) { activeTouch.touch.force = RCTZeroIfNaN(uiTouch.force / uiTouch.maximumPossibleForce); diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 22adca5790a..4e368726133 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -2261,6 +2261,7 @@ public class com/facebook/react/fabric/FabricUIManager : com/facebook/react/brid public fun receiveEvent (IILjava/lang/String;Lcom/facebook/react/bridge/WritableMap;)V public fun receiveEvent (IILjava/lang/String;ZLcom/facebook/react/bridge/WritableMap;I)V public fun receiveEvent (IILjava/lang/String;ZLcom/facebook/react/bridge/WritableMap;IZ)V + public fun receiveEvent (IILjava/lang/String;ZLcom/facebook/react/bridge/WritableMap;IZJ)V public fun receiveEvent (ILjava/lang/String;Lcom/facebook/react/bridge/WritableMap;)V public fun removeUIManagerEventListener (Lcom/facebook/react/bridge/UIManagerListener;)V public fun resolveCustomDirectEventName (Ljava/lang/String;)Ljava/lang/String; @@ -2287,6 +2288,7 @@ public final class com/facebook/react/fabric/mounting/SurfaceMountingManager { public final fun attachRootView (Landroid/view/View;Lcom/facebook/react/uimanager/ThemedReactContext;)V public final fun deleteView (I)V public final fun enqueuePendingEvent (ILjava/lang/String;ZLcom/facebook/react/bridge/WritableMap;I)V + public final fun enqueuePendingEvent (ILjava/lang/String;ZLcom/facebook/react/bridge/WritableMap;IJ)V public final fun getContext ()Lcom/facebook/react/uimanager/ThemedReactContext; public final fun getSurfaceId ()I public final fun getView (I)Landroid/view/View; @@ -4804,11 +4806,13 @@ public final class com/facebook/react/uimanager/events/RCTEventEmitter$DefaultIm public abstract interface class com/facebook/react/uimanager/events/RCTModernEventEmitter : com/facebook/react/uimanager/events/RCTEventEmitter { public abstract fun receiveEvent (IILjava/lang/String;Lcom/facebook/react/bridge/WritableMap;)V public abstract fun receiveEvent (IILjava/lang/String;ZILcom/facebook/react/bridge/WritableMap;I)V + public abstract fun receiveEvent (IILjava/lang/String;ZILcom/facebook/react/bridge/WritableMap;IJ)V public abstract fun receiveEvent (ILjava/lang/String;Lcom/facebook/react/bridge/WritableMap;)V } public final class com/facebook/react/uimanager/events/RCTModernEventEmitter$DefaultImpls { public static fun receiveEvent (Lcom/facebook/react/uimanager/events/RCTModernEventEmitter;IILjava/lang/String;Lcom/facebook/react/bridge/WritableMap;)V + public static fun receiveEvent (Lcom/facebook/react/uimanager/events/RCTModernEventEmitter;IILjava/lang/String;ZILcom/facebook/react/bridge/WritableMap;IJ)V public static fun receiveEvent (Lcom/facebook/react/uimanager/events/RCTModernEventEmitter;ILjava/lang/String;Lcom/facebook/react/bridge/WritableMap;)V public static fun receiveTouches (Lcom/facebook/react/uimanager/events/RCTModernEventEmitter;Ljava/lang/String;Lcom/facebook/react/bridge/WritableArray;Lcom/facebook/react/bridge/WritableArray;)V } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.kt index 6d98e8fd2ae..b40e19efa96 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.kt @@ -22,6 +22,7 @@ internal class EventAnimationDriver( private val eventPath: List, @JvmField internal var valueNode: ValueAnimatedNode, ) : RCTModernEventEmitter { + @Deprecated("Use the overload with eventTimestamp parameter instead.") override fun receiveEvent( surfaceId: Int, targetTag: Int, diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index c0cacbb45ab..5e3839be80d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -1067,11 +1067,13 @@ public void updateRootLayoutSpecs( return surfaceManager.getView(reactTag); } + @Deprecated @Override public void receiveEvent(int reactTag, String eventName, @Nullable WritableMap params) { receiveEvent(View.NO_ID, reactTag, eventName, false, params, EventCategoryDef.UNSPECIFIED); } + @Deprecated @Override public void receiveEvent( int surfaceId, int reactTag, String eventName, @Nullable WritableMap params) { @@ -1091,7 +1093,9 @@ public void receiveEvent( * @param canCoalesceEvent * @param params * @param eventCategory + * @deprecated Use the overload with eventTimestamp parameter instead. */ + @Deprecated public void receiveEvent( int surfaceId, int reactTag, @@ -1099,9 +1103,34 @@ public void receiveEvent( boolean canCoalesceEvent, @Nullable WritableMap params, @EventCategoryDef int eventCategory) { - receiveEvent(surfaceId, reactTag, eventName, canCoalesceEvent, params, eventCategory, false); + receiveEvent( + surfaceId, + reactTag, + eventName, + canCoalesceEvent, + params, + eventCategory, + false, + SystemClock.uptimeMillis()); } + /** + * receiveEvent API that emits an event to C++. If {@code canCoalesceEvent} is true, that signals + * that C++ may coalesce the event optionally. Otherwise, coalescing can happen in Java before + * emitting. + * + *

{@code customCoalesceKey} is currently unused. + * + * @param surfaceId + * @param reactTag + * @param eventName + * @param canCoalesceEvent + * @param params + * @param eventCategory + * @param experimentalIsSynchronous + * @deprecated Use the overload with eventTimestamp parameter instead. + */ + @Deprecated @Override public void receiveEvent( int surfaceId, @@ -1111,6 +1140,43 @@ public void receiveEvent( @Nullable WritableMap params, @EventCategoryDef int eventCategory, boolean experimentalIsSynchronous) { + receiveEvent( + surfaceId, + reactTag, + eventName, + canCoalesceEvent, + params, + eventCategory, + experimentalIsSynchronous, + SystemClock.uptimeMillis()); + } + + /** + * receiveEvent API that emits an event to C++. If {@code canCoalesceEvent} is true, that signals + * that C++ may coalesce the event optionally. Otherwise, coalescing can happen in Java before + * emitting. + * + *

{@code customCoalesceKey} is currently unused. + * + * @param surfaceId + * @param reactTag + * @param eventName + * @param canCoalesceEvent + * @param params + * @param eventCategory + * @param experimentalIsSynchronous + * @param eventTimestamp + */ + @Override + public void receiveEvent( + int surfaceId, + int reactTag, + String eventName, + boolean canCoalesceEvent, + @Nullable WritableMap params, + @EventCategoryDef int eventCategory, + boolean experimentalIsSynchronous, + long eventTimestamp) { if (ReactBuildConfig.DEBUG && surfaceId == View.NO_ID) { FLog.d(TAG, "Emitted event without surfaceId: [%d] %s", reactTag, eventName); @@ -1128,7 +1194,13 @@ public void receiveEvent( // access to the event emitter later when the view is mounted. For now just save the event // in the view state and trigger it later. mMountingManager.enqueuePendingEvent( - surfaceId, reactTag, eventName, canCoalesceEvent, params, eventCategory); + surfaceId, + reactTag, + eventName, + canCoalesceEvent, + params, + eventCategory, + eventTimestamp); } else { // This can happen if the view has disappeared from the screen (because of async events) FLog.i(TAG, "Unable to invoke event: " + eventName + " for reactTag: " + reactTag); @@ -1142,13 +1214,13 @@ public void receiveEvent( boolean firstEventForFrame = mSynchronousEvents.add(new SynchronousEvent(surfaceId, reactTag, eventName)); if (firstEventForFrame) { - eventEmitter.dispatchEventSynchronously(eventName, params); + eventEmitter.dispatchEventSynchronously(eventName, params, eventTimestamp); } } else { if (canCoalesceEvent) { - eventEmitter.dispatchUnique(eventName, params); + eventEmitter.dispatchUnique(eventName, params, eventTimestamp); } else { - eventEmitter.dispatch(eventName, params, eventCategory); + eventEmitter.dispatch(eventName, params, eventCategory, eventTimestamp); } } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.kt index 1d1a3bcd860..4a61bf606ad 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.kt @@ -27,33 +27,49 @@ internal class EventEmitterWrapper private constructor() : HybridClassBase() { eventName: String, params: NativeMap?, @EventCategoryDef category: Int, + eventTimestamp: Long, ) - private external fun dispatchEventSynchronously(eventName: String, params: NativeMap?) + private external fun dispatchEventSynchronously( + eventName: String, + params: NativeMap?, + eventTimestamp: Long, + ) - private external fun dispatchUniqueEvent(eventName: String, params: NativeMap?) + private external fun dispatchUniqueEvent( + eventName: String, + params: NativeMap?, + eventTimestamp: Long, + ) /** * Invokes the execution of the C++ EventEmitter. * * @param eventName [String] name of the event to execute. * @param params [WritableMap] payload of the event + * @param eventCategory event category + * @param eventTimestamp timestamp when the event was triggered (in milliseconds since boot) */ @Synchronized - fun dispatch(eventName: String, params: WritableMap?, @EventCategoryDef eventCategory: Int) { + fun dispatch( + eventName: String, + params: WritableMap?, + @EventCategoryDef eventCategory: Int, + eventTimestamp: Long, + ) { if (!isValid) { return } - dispatchEvent(eventName, params as NativeMap?, eventCategory) + dispatchEvent(eventName, params as NativeMap?, eventCategory, eventTimestamp) } @Synchronized - fun dispatchEventSynchronously(eventName: String, params: WritableMap?) { + fun dispatchEventSynchronously(eventName: String, params: WritableMap?, eventTimestamp: Long) { if (!isValid) { return } UiThreadUtil.assertOnUiThread() - dispatchEventSynchronously(eventName, params as NativeMap?) + dispatchEventSynchronously(eventName, params as NativeMap?, eventTimestamp) } /** @@ -62,13 +78,14 @@ internal class EventEmitterWrapper private constructor() : HybridClassBase() { * * @param eventName [String] name of the event to execute. * @param params [WritableMap] payload of the event + * @param eventTimestamp timestamp when the event was triggered (in milliseconds since boot) */ @Synchronized - fun dispatchUnique(eventName: String, params: WritableMap?) { + fun dispatchUnique(eventName: String, params: WritableMap?, eventTimestamp: Long) { if (!isValid) { return } - dispatchUniqueEvent(eventName, params as NativeMap?) + dispatchUniqueEvent(eventName, params as NativeMap?, eventTimestamp) } @Synchronized diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/FabricEventEmitter.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/FabricEventEmitter.kt index fe742590204..dad9cd3d555 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/FabricEventEmitter.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/events/FabricEventEmitter.kt @@ -7,6 +7,7 @@ package com.facebook.react.fabric.events +import android.os.SystemClock import com.facebook.react.bridge.WritableMap import com.facebook.react.fabric.FabricUIManager import com.facebook.react.uimanager.events.EventCategoryDef @@ -14,6 +15,7 @@ import com.facebook.react.uimanager.events.RCTModernEventEmitter import com.facebook.systrace.Systrace internal class FabricEventEmitter(private val uiManager: FabricUIManager) : RCTModernEventEmitter { + @Deprecated("Use the overload with eventTimestamp parameter instead.") override fun receiveEvent( surfaceId: Int, targetTag: Int, @@ -22,10 +24,41 @@ internal class FabricEventEmitter(private val uiManager: FabricUIManager) : RCTM customCoalesceKey: Int, params: WritableMap?, @EventCategoryDef category: Int, + ) { + receiveEvent( + surfaceId, + targetTag, + eventName, + canCoalesceEvent, + customCoalesceKey, + params, + category, + SystemClock.uptimeMillis(), + ) + } + + override fun receiveEvent( + surfaceId: Int, + targetTag: Int, + eventName: String, + canCoalesceEvent: Boolean, + customCoalesceKey: Int, + params: WritableMap?, + @EventCategoryDef category: Int, + eventTimestamp: Long, ) { Systrace.beginSection(Systrace.TRACE_TAG_REACT, "FabricEventEmitter.receiveEvent('$eventName')") try { - uiManager.receiveEvent(surfaceId, targetTag, eventName, canCoalesceEvent, params, category) + uiManager.receiveEvent( + surfaceId, + targetTag, + eventName, + canCoalesceEvent, + params, + category, + false, + eventTimestamp, + ) } finally { Systrace.endSection(Systrace.TRACE_TAG_REACT) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt index a6ff8f1af23..aa0365037ec 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt @@ -334,6 +334,7 @@ internal class MountingManager( canCoalesceEvent: Boolean, params: WritableMap?, @EventCategoryDef eventCategory: Int, + eventTimestamp: Long, ) { val smm = getSurfaceMountingManager(surfaceId, reactTag) if (smm == null) { @@ -345,7 +346,14 @@ internal class MountingManager( ) return } - smm.enqueuePendingEvent(reactTag, eventName, canCoalesceEvent, params, eventCategory) + smm.enqueuePendingEvent( + reactTag, + eventName, + canCoalesceEvent, + params, + eventCategory, + eventTimestamp, + ) } private fun getSurfaceMountingManager(surfaceId: Int, reactTag: Int): SurfaceMountingManager? = diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt index 9224e19ddf3..a8ead9ca6be 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt @@ -8,6 +8,7 @@ package com.facebook.react.fabric.mounting import android.annotation.SuppressLint +import android.os.SystemClock import android.view.View import android.view.ViewGroup import android.view.ViewParent @@ -1082,6 +1083,25 @@ internal constructor( canCoalesceEvent: Boolean, params: WritableMap?, @EventCategoryDef eventCategory: Int, + ): Unit { + enqueuePendingEvent( + reactTag, + eventName, + canCoalesceEvent, + params, + eventCategory, + SystemClock.uptimeMillis(), + ) + } + + @AnyThread + public fun enqueuePendingEvent( + reactTag: Int, + eventName: String, + canCoalesceEvent: Boolean, + params: WritableMap?, + @EventCategoryDef eventCategory: Int, + eventTimestamp: Long, ): Unit { // When the surface stopped we will reset the view state map. We are not going to enqueue // pending events as they are not expected to be dispatched anyways. @@ -1092,7 +1112,8 @@ internal constructor( return } - val viewEvent = PendingViewEvent(eventName, params, eventCategory, canCoalesceEvent) + val viewEvent = + PendingViewEvent(eventName, params, eventCategory, canCoalesceEvent, eventTimestamp) UiThreadUtil.runOnUiThread { val eventEmitter = viewState.eventEmitter if (eventEmitter != null) { @@ -1145,12 +1166,13 @@ internal constructor( private val params: WritableMap?, @field:EventCategoryDef private val eventCategory: Int, private val canCoalesceEvent: Boolean, + private val eventTimestamp: Long, ) { fun dispatch(eventEmitter: EventEmitterWrapper) { if (canCoalesceEvent) { - eventEmitter.dispatchUnique(eventName, params) + eventEmitter.dispatchUnique(eventName, params, eventTimestamp) } else { - eventEmitter.dispatch(eventName, params, eventCategory) + eventEmitter.dispatch(eventName, params, eventCategory, eventTimestamp) } } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/FabricEventDispatcher.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/FabricEventDispatcher.kt index 409d307d26d..a708ce5904a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/FabricEventDispatcher.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/FabricEventDispatcher.kt @@ -72,6 +72,7 @@ internal class FabricEventDispatcher( event.internal_getEventData(), event.internal_getEventCategory(), true, + event.timestampMs, ) } else { ReactSoftExceptionLogger.logSoftException( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.kt index 6cd9cb5a83a..ed14d992575 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.kt @@ -283,6 +283,7 @@ internal class PointerEvent private constructor() : Event() { coalescingKey.toInt(), eventData, getEventCategory(_eventName), + timestampMs, ) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/RCTModernEventEmitter.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/RCTModernEventEmitter.kt index 70024f55278..2720516397b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/RCTModernEventEmitter.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/RCTModernEventEmitter.kt @@ -28,11 +28,13 @@ public interface RCTModernEventEmitter : RCTEventEmitter { receiveEvent(-1, targetTag, eventName, params) } + @Deprecated("Use the overload with eventTimestamp parameter instead.") public fun receiveEvent(surfaceId: Int, targetTag: Int, eventName: String, params: WritableMap?) { // We assume this event can't be coalesced. `customCoalesceKey` has no meaning in Fabric. receiveEvent(surfaceId, targetTag, eventName, false, 0, params, EventCategoryDef.UNSPECIFIED) } + @Deprecated("Use the overload with eventTimestamp parameter instead.") public fun receiveEvent( surfaceId: Int, targetTag: Int, @@ -42,4 +44,32 @@ public interface RCTModernEventEmitter : RCTEventEmitter { params: WritableMap?, @EventCategoryDef category: Int, ) + + /** + * Receives an event with a specific timestamp. The default implementation delegates to the + * non-timestamped version for backward compatibility with existing implementations. + * + * @param eventTimestamp The timestamp when the event was triggered (in milliseconds since boot, + * from SystemClock.uptimeMillis()) + */ + public fun receiveEvent( + surfaceId: Int, + targetTag: Int, + eventName: String, + canCoalesceEvent: Boolean, + customCoalesceKey: Int, + params: WritableMap?, + @EventCategoryDef category: Int, + eventTimestamp: Long, + ) { + receiveEvent( + surfaceId, + targetTag, + eventName, + canCoalesceEvent, + customCoalesceKey, + params, + category, + ) + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/SynchronousEventReceiver.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/SynchronousEventReceiver.kt index a5d35ff4668..7d6cb6c429b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/SynchronousEventReceiver.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/SynchronousEventReceiver.kt @@ -21,4 +21,32 @@ internal interface SynchronousEventReceiver { @EventCategoryDef eventCategory: Int, experimentalIsSynchronous: Boolean, ) + + /** + * Receives an event with a specific timestamp. The default implementation delegates to the + * non-timestamped version for backward compatibility with existing implementations. + * + * @param eventTimestamp timestamp when the event was triggered (in milliseconds since boot, from + * SystemClock.uptimeMillis()) + */ + fun receiveEvent( + surfaceId: Int, + reactTag: Int, + eventName: String, + canCoalesceEvent: Boolean, + params: WritableMap?, + @EventCategoryDef eventCategory: Int, + experimentalIsSynchronous: Boolean, + eventTimestamp: Long, + ) { + receiveEvent( + surfaceId, + reactTag, + eventName, + canCoalesceEvent, + params, + eventCategory, + experimentalIsSynchronous, + ) + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.kt index d4fb44db9d1..b80ed8229f1 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.kt @@ -150,6 +150,7 @@ internal object TouchesHelper { 0, eventData, event.getEventCategory(), + event.timestampMs, ) } } finally { diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.cpp index 68e64c6c4d0..5d76e5e197f 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.cpp @@ -7,6 +7,7 @@ #include "EventEmitterWrapper.h" #include +#include #include @@ -14,10 +15,24 @@ using namespace facebook::jni; namespace facebook::react { +namespace { + +/* + * Converts a Java timestamp (milliseconds since boot from + * SystemClock.uptimeMillis()) to a HighResTimeStamp. + */ +HighResTimeStamp highResTimeStampFromMillis(jlong millis) { + return HighResTimeStamp::fromChronoSteadyClockTimePoint( + std::chrono::steady_clock::time_point(std::chrono::milliseconds(millis))); +} + +} // namespace + void EventEmitterWrapper::dispatchEvent( std::string eventName, NativeMap* payload, - int category) { + int category, + jlong eventTimestamp) { // It is marginal, but possible for this to be constructed without a valid // EventEmitter. In those cases, make sure we noop/blackhole events instead of // crashing. @@ -25,13 +40,15 @@ void EventEmitterWrapper::dispatchEvent( eventEmitter->dispatchEvent( std::move(eventName), (payload != nullptr) ? payload->consume() : folly::dynamic::object(), - static_cast(category)); + static_cast(category), + highResTimeStampFromMillis(eventTimestamp)); } } void EventEmitterWrapper::dispatchEventSynchronously( std::string eventName, - NativeMap* params) { + NativeMap* params, + jlong eventTimestamp) { // It is marginal, but possible for this to be constructed without a valid // EventEmitter. In those cases, make sure we noop/blackhole events instead of // crashing. @@ -40,21 +57,24 @@ void EventEmitterWrapper::dispatchEventSynchronously( eventEmitter->dispatchEvent( std::move(eventName), (params != nullptr) ? params->consume() : folly::dynamic::object(), - RawEvent::Category::Discrete); + RawEvent::Category::Discrete, + highResTimeStampFromMillis(eventTimestamp)); }); } } void EventEmitterWrapper::dispatchUniqueEvent( std::string eventName, - NativeMap* payload) { + NativeMap* payload, + jlong eventTimestamp) { // It is marginal, but possible for this to be constructed without a valid // EventEmitter. In those cases, make sure we noop/blackhole events instead of // crashing. if (eventEmitter != nullptr) { eventEmitter->dispatchUniqueEvent( std::move(eventName), - (payload != nullptr) ? payload->consume() : folly::dynamic::object()); + (payload != nullptr) ? payload->consume() : folly::dynamic::object(), + highResTimeStampFromMillis(eventTimestamp)); } } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.h b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.h index 20bed32f575..50143ad8f6c 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/EventEmitterWrapper.h @@ -25,9 +25,9 @@ class EventEmitterWrapper : public jni::HybridClass { SharedEventEmitter eventEmitter; - void dispatchEvent(std::string eventName, NativeMap *payload, int category); - void dispatchEventSynchronously(std::string eventName, NativeMap *params); - void dispatchUniqueEvent(std::string eventName, NativeMap *payload); + void dispatchEvent(std::string eventName, NativeMap *payload, int category, jlong eventTimestamp); + void dispatchEventSynchronously(std::string eventName, NativeMap *params, jlong eventTimestamp); + void dispatchUniqueEvent(std::string eventName, NativeMap *payload, jlong eventTimestamp); }; } // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt index de461fe0bb7..ebecb3a9ef9 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/fabric/events/TouchEventDispatchTest.kt @@ -546,6 +546,7 @@ class TouchEventDispatchTest { anyInt(), argument.capture(), anyInt(), + anyLong(), ) assertThat(startMoveEndExpectedSequence).isEqualTo(argument.allValues) } @@ -565,6 +566,7 @@ class TouchEventDispatchTest { anyInt(), argument.capture(), anyInt(), + anyLong(), ) assertThat(startMoveCancelExpectedSequence).isEqualTo(argument.allValues) } @@ -584,6 +586,7 @@ class TouchEventDispatchTest { anyInt(), argument.capture(), anyInt(), + anyLong(), ) assertThat(startPointerMoveUpExpectedSequence).isEqualTo(argument.allValues) } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.cpp index 944d290e85e..d09f0e78f3a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.cpp @@ -21,7 +21,8 @@ void setTouchPayloadOnObject( object.setProperty(runtime, "screenY", touch.screenPoint.y); object.setProperty(runtime, "identifier", touch.identifier); object.setProperty(runtime, "target", touch.target); - object.setProperty(runtime, "timestamp", touch.timestamp * 1000); + object.setProperty( + runtime, "timestamp", touch.timeStamp.toDOMHighResTimeStamp()); object.setProperty(runtime, "force", touch.force); } @@ -41,7 +42,7 @@ std::vector getDebugProps( {"identifier", getDebugDescription(touch.identifier, options)}, {"target", getDebugDescription(touch.target, options)}, {"force", getDebugDescription(touch.force, options)}, - {"timestamp", getDebugDescription(touch.timestamp, options)}, + {"timeStamp", getDebugDescription(touch.timeStamp, options)}, }; } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.h b/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.h index a0742b29827..c8473d65b38 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.h @@ -11,6 +11,7 @@ #include #include #include +#include namespace facebook::react { @@ -53,9 +54,15 @@ struct BaseTouch { /* * The time in seconds when the touch occurred or when it was last mutated. + * @deprecated Use timeStamp instead. */ Float timestamp{0.0f}; + /* + * The time when the touch occurred. + */ + HighResTimeStamp timeStamp{}; + /* * The particular implementation of `Hasher` and (especially) `Comparator` * make sense only when `Touch` object is used as a *key* in indexed diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp index 46a3ba86996..958c3e4f8f8 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.cpp @@ -98,6 +98,8 @@ std::vector getDebugProps( .value = getDebugDescription(pointerEvent.isPrimary, options)}, {.name = "button", .value = getDebugDescription(pointerEvent.button, options)}, + {.name = "timeStamp", + .value = getDebugDescription(pointerEvent.timeStamp, options)}, }; } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h index 158d73d2096..218782c5e68 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/PointerEvent.h @@ -11,6 +11,7 @@ #include #include #include +#include namespace facebook::react { @@ -110,6 +111,10 @@ struct PointerEvent : public EventPayload { * was fired. */ int button; + /* + * The time when the event occurred. + */ + HighResTimeStamp timeStamp{}; /* * EventPayload implementations diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEvent.h b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEvent.h index 3907869831e..94819dc3cbf 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEvent.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEvent.h @@ -9,8 +9,6 @@ #include -#include - #include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp index 6264d5fe50d..cf003d91820 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp @@ -42,26 +42,38 @@ static jsi::Value touchEventPayload( return object; } +static HighResTimeStamp getTimestampFromTouchEvent(const TouchEvent& event) { + if (!event.changedTouches.empty()) { + const auto& firstChangedTouch = *event.changedTouches.begin(); + return firstChangedTouch.timeStamp; + } + return HighResTimeStamp::now(); +} + void TouchEventEmitter::dispatchTouchEvent( std::string type, TouchEvent event, RawEvent::Category category) const { + auto eventTimestamp = getTimestampFromTouchEvent(event); dispatchEvent( std::move(type), [event = std::move(event)](jsi::Runtime& runtime) { return touchEventPayload(runtime, event); }, - category); + category, + eventTimestamp); } void TouchEventEmitter::dispatchPointerEvent( std::string type, PointerEvent event, RawEvent::Category category) const { + auto eventTimestamp = event.timeStamp; dispatchEvent( std::move(type), std::make_shared(std::move(event)), - category); + category, + eventTimestamp); } void TouchEventEmitter::onTouchStart(TouchEvent event) const { @@ -70,10 +82,13 @@ void TouchEventEmitter::onTouchStart(TouchEvent event) const { } void TouchEventEmitter::onTouchMove(TouchEvent event) const { + auto eventTimestamp = getTimestampFromTouchEvent(event); dispatchUniqueEvent( - "touchMove", [event = std::move(event)](jsi::Runtime& runtime) { + "touchMove", + [event = std::move(event)](jsi::Runtime& runtime) { return touchEventPayload(runtime, event); - }); + }, + eventTimestamp); } void TouchEventEmitter::onTouchEnd(TouchEvent event) const { @@ -101,8 +116,11 @@ void TouchEventEmitter::onPointerDown(PointerEvent event) const { } void TouchEventEmitter::onPointerMove(PointerEvent event) const { + auto eventTimestamp = event.timeStamp; dispatchUniqueEvent( - "pointerMove", std::make_shared(std::move(event))); + "pointerMove", + std::make_shared(std::move(event)), + eventTimestamp); } void TouchEventEmitter::onPointerUp(PointerEvent event) const { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h index 74c20029322..7f8fa707cc9 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/TouchEventEmitter.h @@ -13,6 +13,7 @@ #include #include #include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp index f162e2ffb61..91ef8e2d948 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.cpp @@ -63,6 +63,18 @@ void EventEmitter::dispatchEvent( category); } +void EventEmitter::dispatchEvent( + std::string type, + folly::dynamic&& payload, + RawEvent::Category category, + HighResTimeStamp eventTimestamp) const { + dispatchEvent( + std::move(type), + DynamicEventPayload::create(std::move(payload)), + category, + eventTimestamp); +} + void EventEmitter::dispatchUniqueEvent( std::string type, folly::dynamic&& payload) const { @@ -70,6 +82,16 @@ void EventEmitter::dispatchUniqueEvent( std::move(type), DynamicEventPayload::create(std::move(payload))); } +void EventEmitter::dispatchUniqueEvent( + std::string type, + folly::dynamic&& payload, + HighResTimeStamp eventTimestamp) const { + dispatchUniqueEvent( + std::move(type), + DynamicEventPayload::create(std::move(payload)), + eventTimestamp); +} + void EventEmitter::dispatchEvent( std::string type, const ValueFactory& payloadFactory, @@ -80,10 +102,31 @@ void EventEmitter::dispatchEvent( category); } +void EventEmitter::dispatchEvent( + std::string type, + const ValueFactory& payloadFactory, + RawEvent::Category category, + HighResTimeStamp eventTimestamp) const { + dispatchEvent( + std::move(type), + std::make_shared(payloadFactory), + category, + eventTimestamp); +} + void EventEmitter::dispatchEvent( std::string type, SharedEventPayload payload, RawEvent::Category category) const { + dispatchEvent( + std::move(type), std::move(payload), category, HighResTimeStamp::now()); +} + +void EventEmitter::dispatchEvent( + std::string type, + SharedEventPayload payload, + RawEvent::Category category, + HighResTimeStamp eventTimestamp) const { TraceSection s("EventEmitter::dispatchEvent", "type", type); auto eventDispatcher = eventDispatcher_.lock(); @@ -96,7 +139,9 @@ void EventEmitter::dispatchEvent( std::move(payload), eventTarget_, shadowNodeFamily_, - category)); + category, + false, + eventTimestamp)); } void EventEmitter::dispatchUniqueEvent( @@ -107,9 +152,27 @@ void EventEmitter::dispatchUniqueEvent( std::make_shared(payloadFactory)); } +void EventEmitter::dispatchUniqueEvent( + std::string type, + const ValueFactory& payloadFactory, + HighResTimeStamp eventTimestamp) const { + dispatchUniqueEvent( + std::move(type), + std::make_shared(payloadFactory), + eventTimestamp); +} + void EventEmitter::dispatchUniqueEvent( std::string type, SharedEventPayload payload) const { + dispatchUniqueEvent( + std::move(type), std::move(payload), HighResTimeStamp::now()); +} + +void EventEmitter::dispatchUniqueEvent( + std::string type, + SharedEventPayload payload, + HighResTimeStamp eventTimestamp) const { TraceSection s("EventEmitter::dispatchUniqueEvent"); auto eventDispatcher = eventDispatcher_.lock(); @@ -122,7 +185,9 @@ void EventEmitter::dispatchUniqueEvent( std::move(payload), eventTarget_, shadowNodeFamily_, - RawEvent::Category::Continuous)); + RawEvent::Category::Continuous, + true, + eventTimestamp)); } void EventEmitter::setEnabled(bool enabled) { diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h index e89dcf2c18e..f3e9a4c334e 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventEmitter.h @@ -16,6 +16,7 @@ #include #include #include +#include namespace facebook::react { @@ -86,6 +87,12 @@ class EventEmitter { const ValueFactory &payloadFactory = EventEmitter::defaultPayloadFactory(), RawEvent::Category category = RawEvent::Category::Unspecified) const; + void dispatchEvent( + std::string type, + const ValueFactory &payloadFactory, + RawEvent::Category category, + HighResTimeStamp eventTimestamp) const; + void dispatchEvent( std::string type, folly::dynamic &&payload, @@ -96,13 +103,31 @@ class EventEmitter { SharedEventPayload payload, RawEvent::Category category = RawEvent::Category::Unspecified) const; + void dispatchEvent( + std::string type, + folly::dynamic &&payload, + RawEvent::Category category, + HighResTimeStamp eventTimestamp) const; + + void dispatchEvent( + std::string type, + SharedEventPayload payload, + RawEvent::Category category, + HighResTimeStamp eventTimestamp) const; + void dispatchUniqueEvent(std::string type, folly::dynamic &&payload) const; void dispatchUniqueEvent(std::string type, const ValueFactory &payloadFactory = EventEmitter::defaultPayloadFactory()) const; + void dispatchUniqueEvent(std::string type, const ValueFactory &payloadFactory, HighResTimeStamp eventTimestamp) const; + void dispatchUniqueEvent(std::string type, SharedEventPayload payload) const; + void dispatchUniqueEvent(std::string type, folly::dynamic &&payload, HighResTimeStamp eventTimestamp) const; + + void dispatchUniqueEvent(std::string type, SharedEventPayload payload, HighResTimeStamp eventTimestamp) const; + private: friend class UIManagerBinding; diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h b/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h index 233ae236cab..a632ffc9e44 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventPipe.h @@ -15,6 +15,7 @@ #include #include #include +#include namespace facebook::react { @@ -23,7 +24,8 @@ using EventPipe = std::function; + const EventPayload &payload, + HighResTimeStamp eventTimestamp)>; using EventPipeConclusion = std::function; diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp index 90cdc8f9888..f48276d0f11 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp @@ -96,7 +96,8 @@ void EventQueueProcessor::flushEvents( event.eventTarget.get(), event.type, reactPriority, - *event.eventPayload); + *event.eventPayload, + event.eventStartTimeStamp); if (eventLogger != nullptr) { eventLogger->onEventProcessingEnd(event.loggingTag); diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp index 7661b670554..bced302982b 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.cpp @@ -15,12 +15,14 @@ RawEvent::RawEvent( SharedEventTarget eventTarget, std::weak_ptr shadowNodeFamily, Category category, - bool isUnique) + bool isUnique, + HighResTimeStamp eventStartTimeStamp) : type(std::move(type)), eventPayload(std::move(eventPayload)), eventTarget(std::move(eventTarget)), shadowNodeFamily(std::move(shadowNodeFamily)), category(category), - isUnique(isUnique) {} + isUnique(isUnique), + eventStartTimeStamp(eventStartTimeStamp) {} } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h index d78cbd11860..3111ee7cddf 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h +++ b/packages/react-native/ReactCommon/react/renderer/core/RawEvent.h @@ -8,7 +8,6 @@ #pragma once #include -#include #include #include @@ -74,7 +73,8 @@ struct RawEvent { SharedEventTarget eventTarget, std::weak_ptr shadowNodeFamily, Category category = Category::Unspecified, - bool isUnique = false); + bool isUnique = false, + HighResTimeStamp eventStartTimeStamp = HighResTimeStamp::now()); std::string type; SharedEventPayload eventPayload; @@ -84,10 +84,10 @@ struct RawEvent { EventTag loggingTag{0}; bool isUnique{false}; - // The client may specify a platform-specific timestamp for the event start - // time, for example when MotionEvent was triggered on the Android native - // side. - std::optional eventStartTimeStamp = std::nullopt; + // The timestamp for the event start time. This defaults to the current + // time if not specified by the client (e.g., when MotionEvent was triggered + // on the Android native side). + HighResTimeStamp eventStartTimeStamp; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp b/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp index b6ebd6f4905..28a2d721306 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp @@ -42,7 +42,8 @@ class EventQueueProcessorTest : public testing::Test { const EventTarget* /*eventTarget*/, const std::string& type, ReactEventPriority priority, - const EventPayload& /*payload*/) { + const EventPayload& /*payload*/, + HighResTimeStamp /*eventTimestamp*/) { eventTypes_.push_back(type); eventPriorities_.push_back(priority); }; diff --git a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp index a0cf4e16089..3a1393ef40b 100644 --- a/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp +++ b/packages/react-native/ReactCommon/react/renderer/scheduler/Scheduler.cpp @@ -88,11 +88,12 @@ Scheduler::Scheduler( EventTarget* eventTarget, const std::string& type, ReactEventPriority priority, - const EventPayload& payload) { + const EventPayload& payload, + HighResTimeStamp eventTimestamp) { uiManager->visitBinding( [&](const UIManagerBinding& uiManagerBinding) { uiManagerBinding.dispatchEvent( - runtime, eventTarget, type, priority, payload); + runtime, eventTarget, type, priority, payload, eventTimestamp); }, runtime); }; diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp index d8b41c200e3..4b405f2db2b 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp @@ -65,12 +65,13 @@ void UIManagerBinding::dispatchEvent( EventTarget* eventTarget, const std::string& type, ReactEventPriority priority, - const EventPayload& eventPayload) const { + const EventPayload& eventPayload, + HighResTimeStamp eventTimestamp) const { TraceSection s("UIManagerBinding::dispatchEvent", "type", type); if (eventPayload.getType() == EventPayloadType::PointerEvent) { auto pointerEvent = static_cast(eventPayload); - auto dispatchCallback = [this, &runtime]( + auto dispatchCallback = [this, &runtime, eventTimestamp]( const ShadowNode& targetNode, const std::string& type, ReactEventPriority priority, @@ -79,7 +80,12 @@ void UIManagerBinding::dispatchEvent( if (eventTarget != nullptr) { eventTarget->retain(runtime); this->dispatchEventToJS( - runtime, eventTarget.get(), type, priority, eventPayload); + runtime, + eventTarget.get(), + type, + priority, + eventPayload, + eventTimestamp); eventTarget->release(runtime); } }; @@ -95,7 +101,8 @@ void UIManagerBinding::dispatchEvent( *uiManager_); } } else { - dispatchEventToJS(runtime, eventTarget, type, priority, eventPayload); + dispatchEventToJS( + runtime, eventTarget, type, priority, eventPayload, eventTimestamp); } } @@ -104,7 +111,8 @@ void UIManagerBinding::dispatchEventToJS( EventTarget* eventTarget, const std::string& type, ReactEventPriority priority, - const EventPayload& eventPayload) const { + const EventPayload& eventPayload, + HighResTimeStamp eventTimestamp) const { auto payload = eventPayload.asJSIValue(runtime); // If a payload is null, the factory has decided to cancel the event @@ -136,6 +144,15 @@ void UIManagerBinding::dispatchEventToJS( << " will be dropped"; } + // Add timestamp to payload if not already set + if (payload.isObject()) { + auto payloadObject = payload.asObject(runtime); + if (!payloadObject.hasProperty(runtime, "timeStamp")) { + payloadObject.setProperty( + runtime, "timeStamp", eventTimestamp.toDOMHighResTimeStamp()); + } + } + currentEventPriority_ = priority; if (eventHandler_) { eventHandler_->call( diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h index 08cd49005e2..8ed65a645e4 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.h @@ -13,6 +13,7 @@ #include #include #include +#include namespace facebook::react { @@ -47,7 +48,8 @@ class UIManagerBinding : public jsi::HostObject { EventTarget *eventTarget, const std::string &type, ReactEventPriority priority, - const EventPayload &payload) const; + const EventPayload &payload, + HighResTimeStamp eventTimestamp) const; /* * Invalidates the binding and underlying UIManager. @@ -76,7 +78,8 @@ class UIManagerBinding : public jsi::HostObject { EventTarget *eventTarget, const std::string &type, ReactEventPriority priority, - const EventPayload &payload) const; + const EventPayload &payload, + HighResTimeStamp eventTimestamp) const; std::shared_ptr uiManager_; std::unique_ptr eventHandler_; diff --git a/packages/react-native/src/private/webapis/performance/__tests__/EventTimingAPI-itest.js b/packages/react-native/src/private/webapis/performance/__tests__/EventTimingAPI-itest.js index 18921768dfd..398ecd712ce 100644 --- a/packages/react-native/src/private/webapis/performance/__tests__/EventTimingAPI-itest.js +++ b/packages/react-native/src/private/webapis/performance/__tests__/EventTimingAPI-itest.js @@ -184,6 +184,44 @@ describe('Event Timing API', () => { expect(entry.interactionId).toBeGreaterThanOrEqual(0); }); + it('provides the event timeStamp as startTime', () => { + const callback = jest.fn(); + + const observer = new PerformanceObserver(callback); + observer.observe({entryTypes: ['event']}); + + let eventTimeStamp; + + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + { + eventTimeStamp = event.timeStamp; + }} + />, + ); + }); + + const element = nullthrows(root.document.documentElement.firstElementChild); + + expect(callback).not.toHaveBeenCalled(); + + Fantom.dispatchNativeEvent(element, 'click'); + + expect(callback).toHaveBeenCalledTimes(1); + + const entryList = callback.mock.lastCall[0] as PerformanceObserverEntryList; + const entries = entryList.getEntries(); + + expect(entries.length).toBe(1); + + const entry = ensurePerformanceEventTiming(entries[0]); + + expect(eventTimeStamp).not.toBeUndefined(); + expect(entry.startTime).toBe(eventTimeStamp); + }); + it('reports number of dispatched events via performance.eventCounts', () => { NativePerformance.clearEventCountsForTesting?.(); From 15e52e3f71e7199808686e2b86ea54dcb2495b71 Mon Sep 17 00:00:00 2001 From: Zeya Peng Date: Wed, 4 Mar 2026 10:34:53 -0800 Subject: [PATCH 060/595] Add c++ AnimatedModule to DefaultTurboModules (#55729) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55729 This is added so that one can easily enables c++ AnimatedModule in open source. If an app doesn't use `RCTAnimatedModuleProvider`(ios) or `AnimatedCxxReactPackage`(android), it can fallback to this default AnimatedModule when it has both c++animated and shared backend enabled - shared backend removes the need to pass down start/stop callbacks to NativeAnimatedNodesManagerProvider, so we can cleanly initialize it as static default - RCTAnimatedModuleProvider uses the version of AnimatedModule that still relies on a dedicated CADisplayLink for start/stop - AnimatedCxxReactPackage also bundles internal ViewEventModule (for NativeViewEvents) that shares `NativeAnimatedNodesManagerProvider` with AnimatedModule, but NativeViewEvents is not needed for open source - Alternatively we could also expose `NativeAnimatedNodesManagerProvider` via UIManager so other turbomodules can also use it. However I don't think it makes sense to double down on another animation API on UIManager given we have shared backend. - This assumes DefaultTurboModules is always the fallback module provider. So it'll not override when app already uses RCTAnimatedModuleProvider or AnimatedCxxReactPackage ## Changelog: [General] [Added] - Add c++ AnimatedModule to DefaultTurboModules Reviewed By: NickGerleman Differential Revision: D94244698 fbshipit-source-id: 09e905eb4bad7d03cdf87d5b47352060b0e6212f --- packages/react-native/Package.swift | 3 +- .../ReactAndroid/src/main/jni/CMakeLists.txt | 3 + .../RCTAnimatedModuleProvider.mm | 5 +- .../nativemodule/defaults/CMakeLists.txt | 1 + .../defaults/DefaultTurboModules.cpp | 8 + .../React-defaultsnativemodule.podspec | 1 + .../NativeAnimatedNodesManagerProvider.cpp | 150 +++++++++--------- .../react/runtime/TurboModuleManager.cpp | 12 +- .../tester/src/TesterAppDelegate.cpp | 4 +- 9 files changed, 107 insertions(+), 80 deletions(-) diff --git a/packages/react-native/Package.swift b/packages/react-native/Package.swift index 852fd7388f9..8c9765260c1 100644 --- a/packages/react-native/Package.swift +++ b/packages/react-native/Package.swift @@ -424,6 +424,7 @@ let reactFabric = RNTarget( name: .reactFabric, path: "ReactCommon/react/renderer", excludedPaths: [ + "animated/tests", "animations/tests", "attributedstring/tests", "core/tests", @@ -456,7 +457,7 @@ let reactFabric = RNTarget( "components/root/tests", ], dependencies: [.reactNativeDependencies, .reactJsiExecutor, .rctTypesafety, .reactTurboModuleCore, .jsi, .logger, .reactDebug, .reactFeatureFlags, .reactUtils, .reactRuntimeScheduler, .reactCxxReact, .reactRendererDebug, .reactGraphics, .yoga], - sources: ["animationbackend", "animations", "attributedstring", "core", "componentregistry", "componentregistry/native", "components/root", "components/view", "components/view/platform/cxx", "components/scrollview", "components/scrollview/platform/cxx", "components/scrollview/platform/ios", "components/legacyviewmanagerinterop", "components/legacyviewmanagerinterop/platform/ios", "dom", "scheduler", "mounting", "observers/events", "observers/intersection", "telemetry", "consistency", "leakchecker", "uimanager", "uimanager/consistency", "viewtransition"] + sources: ["animated", "animationbackend", "animations", "attributedstring", "core", "componentregistry", "componentregistry/native", "components/root", "components/view", "components/view/platform/cxx", "components/scrollview", "components/scrollview/platform/cxx", "components/scrollview/platform/ios", "components/legacyviewmanagerinterop", "components/legacyviewmanagerinterop/platform/ios", "dom", "scheduler", "mounting", "observers/events", "observers/intersection", "telemetry", "consistency", "leakchecker", "uimanager", "uimanager/consistency", "viewtransition"] ) let reactFabricInputAccessory = RNTarget( diff --git a/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt b/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt index 21e895e7835..90079226788 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt +++ b/packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt @@ -82,6 +82,7 @@ add_react_common_subdir(react/debug) add_react_common_subdir(react/featureflags) add_react_common_subdir(react/performance/cdpmetrics) add_react_common_subdir(react/performance/timeline) +add_react_common_subdir(react/renderer/animated) add_react_common_subdir(react/renderer/animationbackend) add_react_common_subdir(react/renderer/animations) add_react_common_subdir(react/renderer/attributedstring) @@ -202,6 +203,7 @@ add_library(reactnative $ $ $ + $ $ $ $ @@ -297,6 +299,7 @@ target_include_directories(reactnative $ $ $ + $ $ $ $ diff --git a/packages/react-native/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm b/packages/react-native/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm index 17914749a51..5cc907bacc2 100644 --- a/packages/react-native/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm +++ b/packages/react-native/ReactApple/RCTAnimatedModuleProvider/RCTAnimatedModuleProvider.mm @@ -70,7 +70,10 @@ - (void)_onDisplayLinkTick - (std::shared_ptr)getTurboModule:(const std::string &)name jsInvoker:(std::shared_ptr)jsInvoker { - if (facebook::react::ReactNativeFeatureFlags::cxxNativeAnimatedEnabled()) { + if (facebook::react::ReactNativeFeatureFlags::cxxNativeAnimatedEnabled() && + // initialization is moved to DefaultTurboModules when using shared animated backend + // TODO: T257053961 deprecate RCTAnimatedModuleProvider. + !facebook::react::ReactNativeFeatureFlags::useSharedAnimatedBackend()) { if (name == facebook::react::AnimatedModule::kModuleName) { __weak RCTAnimatedModuleProvider *weakSelf = self; auto provider = std::make_shared( diff --git a/packages/react-native/ReactCommon/react/nativemodule/defaults/CMakeLists.txt b/packages/react-native/ReactCommon/react/nativemodule/defaults/CMakeLists.txt index 42bcbe2724f..9f4ce619d65 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/defaults/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/nativemodule/defaults/CMakeLists.txt @@ -23,6 +23,7 @@ target_link_libraries(react_nativemodule_defaults react_nativemodule_idlecallbacks react_nativemodule_intersectionobserver react_nativemodule_webperformance + react_renderer_animated ) target_compile_reactnative_options(react_nativemodule_defaults PRIVATE) target_compile_options(react_nativemodule_defaults PRIVATE -Wpedantic) diff --git a/packages/react-native/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp b/packages/react-native/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp index 3c50a17e2ff..b433364f8a1 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #ifdef REACT_NATIVE_DEBUGGER_ENABLED_DEVONLY #include @@ -49,6 +50,13 @@ namespace facebook::react { } } + if (ReactNativeFeatureFlags::cxxNativeAnimatedEnabled() && + ReactNativeFeatureFlags::useSharedAnimatedBackend() && + name == AnimatedModule::kModuleName) { + return std::make_shared( + jsInvoker, std::make_shared()); + } + #ifdef REACT_NATIVE_DEBUGGER_ENABLED_DEVONLY if (name == DevToolsRuntimeSettingsModule::kModuleName) { return std::make_shared(jsInvoker); diff --git a/packages/react-native/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec b/packages/react-native/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec index cacd372e6ff..044f5728a71 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +++ b/packages/react-native/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec @@ -54,6 +54,7 @@ Pod::Spec.new do |s| s.dependency "React-idlecallbacksnativemodule" s.dependency "React-intersectionobservernativemodule" s.dependency "React-webperformancenativemodule" + s.dependency "React-Fabric/animated" add_dependency(s, "React-RCTFBReactNativeSpec") add_dependency(s, "React-featureflags") add_dependency(s, "React-featureflagsnativemodule") diff --git a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp index 7d95dcee3b5..95d3a508521 100644 --- a/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +++ b/packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp @@ -45,8 +45,16 @@ std::shared_ptr NativeAnimatedNodesManagerProvider::getOrCreate( jsi::Runtime& runtime, std::shared_ptr jsInvoker) { - if (nativeAnimatedNodesManager_ == nullptr) { - auto* uiManager = &UIManagerBinding::getBinding(runtime)->getUIManager(); + if (nativeAnimatedNodesManager_ != nullptr) { + return nativeAnimatedNodesManager_; + } + + auto* uiManager = &UIManagerBinding::getBinding(runtime)->getUIManager(); + + if (!ReactNativeFeatureFlags::useSharedAnimatedBackend()) { + // === PATH 1: Legacy Backend (useSharedAnimatedBackend = false) === + // Uses the architecture with MergedValueDispatcher and + // AnimatedMountingOverrideDelegate mergedValueDispatcher_ = std::make_unique( [jsInvoker](std::function&& func) { @@ -84,78 +92,78 @@ NativeAnimatedNodesManagerProvider::getOrCreate( } }; - if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { - auto animationBackend = uiManager->unstable_getAnimationBackend().lock(); - react_native_assert( - animationBackend != nullptr && "animationBackend is nullptr"); - animationBackend->registerJSInvoker(jsInvoker); - - nativeAnimatedNodesManager_ = - std::make_shared(animationBackend); - } else { - nativeAnimatedNodesManager_ = - std::make_shared( - std::move(directManipulationCallback), - std::move(fabricCommitCallback), - std::move(resolvePlatformColor), - std::move(startOnRenderCallback_), - std::move(stopOnRenderCallback_), - std::move(frameRateListenerCallback_)); - - nativeAnimatedDelegate_ = - std::make_shared( - nativeAnimatedNodesManager_); - } - - addEventEmitterListener( - nativeAnimatedNodesManager_->getEventEmitterListener()); - - uiManager->addEventListener( - std::make_shared( - [eventEmitterListenerContainerWeak = - std::weak_ptr( - eventEmitterListenerContainer_)]( - const RawEvent& rawEvent) { - const auto& eventTarget = rawEvent.eventTarget; - const auto& eventPayload = rawEvent.eventPayload; - if (eventTarget && eventPayload) { - if (auto eventEmitterListenerContainer = - eventEmitterListenerContainerWeak.lock(); - eventEmitterListenerContainer != nullptr) { - return eventEmitterListenerContainer->willDispatchEvent( - eventTarget->getTag(), rawEvent.type, *eventPayload); - } - } - return false; - })); + nativeAnimatedNodesManager_ = std::make_shared( + std::move(directManipulationCallback), + std::move(fabricCommitCallback), + std::move(resolvePlatformColor), + std::move(startOnRenderCallback_), + std::move(stopOnRenderCallback_), + std::move(frameRateListenerCallback_)); + + nativeAnimatedDelegate_ = + std::make_shared( + nativeAnimatedNodesManager_); + + animatedMountingOverrideDelegate_ = + std::make_shared( + *nativeAnimatedNodesManager_, *scheduler); + + // Register on existing surfaces + uiManager->getShadowTreeRegistry().enumerate( + [animatedMountingOverrideDelegate = + std::weak_ptr( + animatedMountingOverrideDelegate_)]( + const ShadowTree& shadowTree, bool& /*stop*/) { + shadowTree.getMountingCoordinator()->setMountingOverrideDelegate( + animatedMountingOverrideDelegate); + }); - uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_); + // Register on surfaces started in the future + uiManager->setOnSurfaceStartCallback( + [animatedMountingOverrideDelegate = + std::weak_ptr( + animatedMountingOverrideDelegate_)]( + const ShadowTree& shadowTree) { + shadowTree.getMountingCoordinator()->setMountingOverrideDelegate( + animatedMountingOverrideDelegate); + }); - if (!ReactNativeFeatureFlags::useSharedAnimatedBackend()) { - animatedMountingOverrideDelegate_ = - std::make_shared( - *nativeAnimatedNodesManager_, *scheduler); - - // Register on existing surfaces - uiManager->getShadowTreeRegistry().enumerate( - [animatedMountingOverrideDelegate = - std::weak_ptr( - animatedMountingOverrideDelegate_)]( - const ShadowTree& shadowTree, bool& /*stop*/) { - shadowTree.getMountingCoordinator()->setMountingOverrideDelegate( - animatedMountingOverrideDelegate); - }); - // Register on surfaces started in the future - uiManager->setOnSurfaceStartCallback( - [animatedMountingOverrideDelegate = - std::weak_ptr( - animatedMountingOverrideDelegate_)]( - const ShadowTree& shadowTree) { - shadowTree.getMountingCoordinator()->setMountingOverrideDelegate( - animatedMountingOverrideDelegate); - }); - } + uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_); + } else { + // === PATH 2: Shared AnimationBackend (useSharedAnimatedBackend = true) === + // Uses the shared AnimationBackend from UIManager. The backend handles all + // animation commits and platform integration internally. + + auto animationBackend = uiManager->unstable_getAnimationBackend().lock(); + react_native_assert( + animationBackend != nullptr && "animationBackend is nullptr"); + animationBackend->registerJSInvoker(jsInvoker); + + nativeAnimatedNodesManager_ = + std::make_shared(animationBackend); } + + addEventEmitterListener( + nativeAnimatedNodesManager_->getEventEmitterListener()); + + uiManager->addEventListener( + std::make_shared( + [eventEmitterListenerContainerWeak = + std::weak_ptr( + eventEmitterListenerContainer_)](const RawEvent& rawEvent) { + const auto& eventTarget = rawEvent.eventTarget; + const auto& eventPayload = rawEvent.eventPayload; + if (eventTarget && eventPayload) { + if (auto eventEmitterListenerContainer = + eventEmitterListenerContainerWeak.lock(); + eventEmitterListenerContainer != nullptr) { + return eventEmitterListenerContainer->willDispatchEvent( + eventTarget->getTag(), rawEvent.type, *eventPayload); + } + } + return false; + })); + return nativeAnimatedNodesManager_; } diff --git a/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp b/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp index 0b33212a6dd..ecb9b0b9d05 100644 --- a/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp +++ b/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp @@ -62,15 +62,19 @@ std::shared_ptr TurboModuleManager::operator()( } } + if (animatedNodesManagerProvider_ != nullptr && + name == AnimatedModule::kModuleName) { + // when animatedNodesManagerProvider_ is null, defer to default + return std::make_shared( + jsInvoker_, animatedNodesManagerProvider_); + } + if (auto turboModule = DefaultTurboModules::getTurboModule(name, jsInvoker_)) { return turboModule; } - if (name == AnimatedModule::kModuleName) { - return std::make_shared( - jsInvoker_, animatedNodesManagerProvider_); - } else if (name == AppStateModule::kModuleName) { + if (name == AppStateModule::kModuleName) { return std::make_shared(jsInvoker_); } else if (name == DeviceInfoModule::kModuleName) { return std::make_shared(jsInvoker_); diff --git a/private/react-native-fantom/tester/src/TesterAppDelegate.cpp b/private/react-native-fantom/tester/src/TesterAppDelegate.cpp index ac0ad0713e6..1fad3777e2f 100644 --- a/private/react-native-fantom/tester/src/TesterAppDelegate.cpp +++ b/private/react-native-fantom/tester/src/TesterAppDelegate.cpp @@ -112,9 +112,7 @@ TesterAppDelegate::TesterAppDelegate( std::shared_ptr provider; - if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) { - provider = std::make_shared(); - } else { + if (!ReactNativeFeatureFlags::useSharedAnimatedBackend()) { provider = std::make_shared( [this](std::function&& onRender, bool /*isAsync*/) { onAnimationRender_ = std::move(onRender); From 6b32971f46201b08004736dad9689d71eba0712f Mon Sep 17 00:00:00 2001 From: Zeya Peng Date: Wed, 4 Mar 2026 10:34:53 -0800 Subject: [PATCH 061/595] move DefaultTurboModules::get to end of TurboModuleManager (#55852) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55852 ## Changelog: [General] [Changed] - move DefaultTurboModules::get to end of TurboModuleManager To align with android/ios; so that the logic before it can override default behavior Reviewed By: christophpurrer Differential Revision: D94907092 fbshipit-source-id: e189607af8cdd87a03a22dbf75f2c656c053a19b --- .../react/runtime/TurboModuleManager.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp b/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp index ecb9b0b9d05..d0f137e4274 100644 --- a/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp +++ b/packages/react-native/ReactCxxPlatform/react/runtime/TurboModuleManager.cpp @@ -67,14 +67,7 @@ std::shared_ptr TurboModuleManager::operator()( // when animatedNodesManagerProvider_ is null, defer to default return std::make_shared( jsInvoker_, animatedNodesManagerProvider_); - } - - if (auto turboModule = - DefaultTurboModules::getTurboModule(name, jsInvoker_)) { - return turboModule; - } - - if (name == AppStateModule::kModuleName) { + } else if (name == AppStateModule::kModuleName) { return std::make_shared(jsInvoker_); } else if (name == DeviceInfoModule::kModuleName) { return std::make_shared(jsInvoker_); @@ -95,8 +88,6 @@ std::shared_ptr TurboModuleManager::operator()( jsInvoker_, webSocketClientFactory_); } else if (name == NativeExceptionsManager::kModuleName) { return std::make_shared(onJsError_, jsInvoker_); - } else if (name == NativePerformance::kModuleName) { - return std::make_shared(jsInvoker_); } else if (name == NativeIntersectionObserver::kModuleName) { return std::make_shared(jsInvoker_); } else if (name == NativeMutationObserver::kModuleName) { @@ -109,6 +100,11 @@ std::shared_ptr TurboModuleManager::operator()( } } + if (auto turboModule = + DefaultTurboModules::getTurboModule(name, jsInvoker_)) { + return turboModule; + } + LOG(WARNING) << "Failed to load TurboModule: " << name; return nullptr; } From 63796a9160f2da0cda438c52c6206c158adfc12a Mon Sep 17 00:00:00 2001 From: On Saint Tiong Date: Wed, 4 Mar 2026 11:07:31 -0800 Subject: [PATCH 062/595] Prevent Crashes by Guarding babel.env Access in RN Babel Preset (#55918) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55918 To prevent crashes when a Babel plugin or preset is invoked without a Babel API object, ensure that any access to Babel-specific properties (such as babel.env) is guarded. Some build tools or environments may call Babel plugins without providing the full Babel API instance, leading to runtime errors if the code assumes its presence. By using optional chaining and providing safe fallbacks, you can maintain compatibility across different build systems (such as Metro and others) without introducing breaking changes. Changelog: [General][Fixed] Prevent errorrs by handling contexts where the Babel API object is not provided Reviewed By: robhogan, rubennorte Differential Revision: D94952379 fbshipit-source-id: 65e69c0510bc66930ee3b5f28e20df32d732f990 --- packages/react-native-babel-preset/src/configs/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-babel-preset/src/configs/main.js b/packages/react-native-babel-preset/src/configs/main.js index ad3dfe46280..efeab765934 100644 --- a/packages/react-native-babel-preset/src/configs/main.js +++ b/packages/react-native-babel-preset/src/configs/main.js @@ -51,7 +51,7 @@ const getPreset = (src, options, babel) => { const transformProfile = options?.unstable_transformProfile ?? babel?.caller(getTransformProfile); - const dev = options?.dev ?? babel.env('development'); + const dev = options?.dev ?? babel?.env('development') ?? false; // Hermes V1 (aka Static Hermes) uses more optimised profiles. // There is currently no difference between stable and canary, but canary From 77231f433d2ff6ddb590afc63668521b0d8edd99 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 4 Mar 2026 12:48:04 -0800 Subject: [PATCH 063/595] Add fixYogaFlexBasisFitContentInMainAxis flag to avoid unnecessary re-measurement (#55897) Summary: X-link: https://github.com/facebook/yoga/pull/1909 Pull Request resolved: https://github.com/facebook/react-native/pull/55897 changelog: [internal] this change is gated. ## Problem When Yoga computes flex basis for container children, the legacy behavior applies a `FitContent` constraint in the **main axis**, bounding the child's measurement by the parent's available space. This creates a dependency between the child's flex basis and the parent's content-determined size, causing **unnecessary re-measurement and cascading ownership clones** when siblings change size. ### The re-measurement cascade (before fix) ``` ScrollView (overflow: scroll) +-------------------------------+ | Content Container (auto h) | | +---------------------------+ | | | Item A h=200 | | <-- Item A height changes | +---------------------------+ | | | Item B h=300 | | | +---------------------------+ | | | Item C h=150 | | | +---------------------------+ | +-------------------------------+ | v Content container height changes (200+300+150 = 650) | v FitContent(650) re-measures ALL items <-- PROBLEM | because their flex basis was FitContent(old_height) v Cascading clones of the entire subtree ``` With the legacy `FitContent` in the main axis, each item's flex basis is `min(content, parent_height)`. When Item A changes height, the content container's height changes, which invalidates the FitContent constraint for ALL items, triggering a full re-measurement cascade. ### After fix (MaxContent in main axis) ``` ScrollView (overflow: scroll) +-------------------------------+ | Content Container (auto h) | | +---------------------------+ | | | Item A h=200 -> 250 | | <-- Item A height changes | +---------------------------+ | | | Item B h=300 | | <-- NOT re-measured (basis unchanged) | +---------------------------+ | | | Item C h=150 | | <-- NOT re-measured (basis unchanged) | +---------------------------+ | +-------------------------------+ | v Content container height changes (250+300+150 = 700) | v Only Item A is re-measured. B and C keep their MaxContent flex basis (independent of parent height). ``` With `MaxContent`, each item's flex basis is its intrinsic content size, independent of the parent. Changing one item doesn't invalidate siblings. ## Solution This diff adds a `FlexBasisFitContentInMainAxis` errata bit gated by the `fixYogaFlexBasisFitContentInMainAxis` feature flag. When the fix is active, flex basis measurement uses `MaxContent` (unbounded) instead of `FitContent` for container children in the main axis. ### Three check points in `computeFlexBasisForChild` ``` computeFlexBasisForChild(parent, child) | |-- Check 1: Accept positive flex basis when mainAxisSize is NaN | (fixes flexBasis:200 items in ScrollView getting height 0) | |-- Check 2: FitContent vs MaxContent constraint | +--------------------------------------------------+ | | Parent type | Legacy (errata) | Fix | | |--------------------+-----------------+-----------| | | Auto height | FitContent | MaxContent| <-- key change | | Definite height | FitContent | FitContent| <-- preserved | | Scroll container | MaxContent | MaxContent| <-- unchanged | | Text child (any) | FitContent | FitContent| <-- preserved | +--------------------------------------------------+ | |-- Check 3: ownerHeightForChildren fallback (preserves percentage resolution when availableInnerHeight is NaN) ``` ### Why definite-height parents keep FitContent Yoga's default `flexShrink` is 0 (unlike CSS's default of 1). Without FitContent, a child measured at MaxContent would get a flex basis equal to its full content height and never shrink to fit: ``` View (height: 760) View (height: 760) +-------------------+ +-------------------+ | Wrapper (auto h) | | Wrapper (auto h) | | +-----------+ | | +-----------+-----|----+ | | ScrollView| | | | ScrollView| | | | | content: | | | | content: | | | | | 1800px | | | | 1800px | | | | +-----------+ | | | | | | | h=760 (bounded) | | +-----------+ | | +-------------------+ +---|---------+-----|----+ FitContent: wrapper=760 | h=1800 (overflows!) ScrollView can scroll MaxContent: wrapper=1800 flexShrink=0, no shrinking ScrollView frame=1800=content scrollable range = 0! ``` For **definite-height** parents, FitContent is safe (the parent's size is fixed, so no re-measurement cascade). For **auto-height** parents, MaxContent is used to avoid the cascade. ### Percentage resolution preservation (Check 3) When MaxContent is used, `availableInnerHeight` becomes NaN. This would break percentage-height grandchildren. Check 3 derives a definite `ownerHeightForChildren` from the parent-provided `ownerHeight`: ``` View (height: 844) +---------------------------+ | Wrapper (auto h) | availableInnerHeight = NaN (MaxContent) | ownerHeight = 844 | ownerHeightForChildren = 844 (from Check 3) | +-----+ +-----------+ | | |h:500| |h:'50%' | | 50% resolves against 844, not NaN | | | |= 422 | | | +-----+ +-----------+ | +---------------------------+ ``` Children of scroll containers skip this fallback (scroll content is intentionally unbounded). Reviewed By: javache Differential Revision: D94658492 fbshipit-source-id: 1587151670803ace0eae2ee91883fe4be72bfa27 --- .../featureflags/ReactNativeFeatureFlags.kt | 8 +- .../ReactNativeFeatureFlagsCxxAccessor.kt | 12 +- .../ReactNativeFeatureFlagsCxxInterop.kt | 4 +- .../ReactNativeFeatureFlagsDefaults.kt | 4 +- .../ReactNativeFeatureFlagsLocalAccessor.kt | 13 +- .../ReactNativeFeatureFlagsProvider.kt | 4 +- .../java/com/facebook/yoga/YogaErrata.java | 2 + .../JReactNativeFeatureFlagsCxxInterop.cpp | 16 ++- .../JReactNativeFeatureFlagsCxxInterop.h | 5 +- .../featureflags/ReactNativeFeatureFlags.cpp | 6 +- .../featureflags/ReactNativeFeatureFlags.h | 7 +- .../ReactNativeFeatureFlagsAccessor.cpp | 76 +++++++----- .../ReactNativeFeatureFlagsAccessor.h | 6 +- .../ReactNativeFeatureFlagsDefaults.h | 6 +- .../ReactNativeFeatureFlagsDynamicProvider.h | 11 +- .../ReactNativeFeatureFlagsProvider.h | 3 +- .../NativeReactNativeFeatureFlags.cpp | 7 +- .../NativeReactNativeFeatureFlags.h | 4 +- .../view/YogaLayoutableShadowNode.cpp | 9 +- .../ReactCommon/yoga/yoga/YGEnums.cpp | 2 + .../ReactCommon/yoga/yoga/YGEnums.h | 1 + .../yoga/yoga/algorithm/CalculateLayout.cpp | 115 +++++++++++++++--- .../ReactCommon/yoga/yoga/enums/Errata.h | 1 + .../ReactNativeFeatureFlags.config.js | 11 ++ .../ShadowNodeRevisionGetter-itest.js | 11 +- .../featureflags/ReactNativeFeatureFlags.js | 7 +- .../specs/NativeReactNativeFeatureFlags.js | 3 +- 27 files changed, 286 insertions(+), 68 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index eeec9f2a911..179eab1d4a4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<38f50776ad2b88fa69b710dbd67315e2>> + * @generated SignedSource<<66d3b8ed600077a287d6d7d8f6230b7b>> */ /** @@ -384,6 +384,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun fixTextClippingAndroid15useBoundsForWidth(): Boolean = accessor.fixTextClippingAndroid15useBoundsForWidth() + /** + * When enabled, Yoga will not apply a FitContent constraint in the main axis during flex basis computation for non-measure container nodes. This prevents unnecessary re-measurement and cascading clones when a sibling changes size in a ScrollView. + */ + @JvmStatic + public fun fixYogaFlexBasisFitContentInMainAxis(): Boolean = accessor.fixYogaFlexBasisFitContentInMainAxis() + /** * Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`. */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index 214d1d356bf..0d63fa2f130 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<98c5f6184864381e579a9df82741928b>> */ /** @@ -79,6 +79,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var fixFindShadowNodeByTagRaceConditionCache: Boolean? = null private var fixMappingOfEventPrioritiesBetweenFabricAndReactCache: Boolean? = null private var fixTextClippingAndroid15useBoundsForWidthCache: Boolean? = null + private var fixYogaFlexBasisFitContentInMainAxisCache: Boolean? = null private var fuseboxAssertSingleHostStateCache: Boolean? = null private var fuseboxEnabledReleaseCache: Boolean? = null private var fuseboxNetworkInspectionEnabledCache: Boolean? = null @@ -639,6 +640,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun fixYogaFlexBasisFitContentInMainAxis(): Boolean { + var cached = fixYogaFlexBasisFitContentInMainAxisCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.fixYogaFlexBasisFitContentInMainAxis() + fixYogaFlexBasisFitContentInMainAxisCache = cached + } + return cached + } + override fun fuseboxAssertSingleHostState(): Boolean { var cached = fuseboxAssertSingleHostStateCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index 6ead7879cc7..8f2067f3130 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<85d23b5f33a6a09c1e42b976a3a99f2f>> + * @generated SignedSource<<2bf2a1dec031145181f6bc28c50cf32a>> */ /** @@ -146,6 +146,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun fixTextClippingAndroid15useBoundsForWidth(): Boolean + @DoNotStrip @JvmStatic public external fun fixYogaFlexBasisFitContentInMainAxis(): Boolean + @DoNotStrip @JvmStatic public external fun fuseboxAssertSingleHostState(): Boolean @DoNotStrip @JvmStatic public external fun fuseboxEnabledRelease(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index 1e6f48d7c16..d6a82445a1f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<4adf4e6f40b726bf9d3680301fb92e1f>> + * @generated SignedSource<<89cd07b543fc079341bb3a5d90e50d13>> */ /** @@ -141,6 +141,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun fixTextClippingAndroid15useBoundsForWidth(): Boolean = false + override fun fixYogaFlexBasisFitContentInMainAxis(): Boolean = false + override fun fuseboxAssertSingleHostState(): Boolean = true override fun fuseboxEnabledRelease(): Boolean = false diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 5b1fd8c2a1b..70a735be917 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<2115ff3be1f3944d499090d3089d185b>> + * @generated SignedSource<> */ /** @@ -83,6 +83,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var fixFindShadowNodeByTagRaceConditionCache: Boolean? = null private var fixMappingOfEventPrioritiesBetweenFabricAndReactCache: Boolean? = null private var fixTextClippingAndroid15useBoundsForWidthCache: Boolean? = null + private var fixYogaFlexBasisFitContentInMainAxisCache: Boolean? = null private var fuseboxAssertSingleHostStateCache: Boolean? = null private var fuseboxEnabledReleaseCache: Boolean? = null private var fuseboxNetworkInspectionEnabledCache: Boolean? = null @@ -702,6 +703,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } + override fun fixYogaFlexBasisFitContentInMainAxis(): Boolean { + var cached = fixYogaFlexBasisFitContentInMainAxisCache + if (cached == null) { + cached = currentProvider.fixYogaFlexBasisFitContentInMainAxis() + accessedFeatureFlags.add("fixYogaFlexBasisFitContentInMainAxis") + fixYogaFlexBasisFitContentInMainAxisCache = cached + } + return cached + } + override fun fuseboxAssertSingleHostState(): Boolean { var cached = fuseboxAssertSingleHostStateCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index f574fa643c0..6d4394f8412 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<1bbbe280815927e0f977f1d1e7787937>> + * @generated SignedSource<> */ /** @@ -141,6 +141,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun fixTextClippingAndroid15useBoundsForWidth(): Boolean + @DoNotStrip public fun fixYogaFlexBasisFitContentInMainAxis(): Boolean + @DoNotStrip public fun fuseboxAssertSingleHostState(): Boolean @DoNotStrip public fun fuseboxEnabledRelease(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaErrata.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaErrata.java index e0521b3fbb5..3bd711beb59 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaErrata.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaErrata.java @@ -14,6 +14,7 @@ public enum YogaErrata { STRETCH_FLEX_BASIS(1), ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING(2), ABSOLUTE_PERCENT_AGAINST_INNER_SIZE(4), + FLEX_BASIS_FIT_CONTENT_IN_MAIN_AXIS(8), ALL(2147483647), CLASSIC(2147483646); @@ -33,6 +34,7 @@ public static YogaErrata fromInt(int value) { case 1: return STRETCH_FLEX_BASIS; case 2: return ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING; case 4: return ABSOLUTE_PERCENT_AGAINST_INNER_SIZE; + case 8: return FLEX_BASIS_FIT_CONTENT_IN_MAIN_AXIS; case 2147483647: return ALL; case 2147483646: return CLASSIC; default: throw new IllegalArgumentException("Unknown enum value: " + value); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index 4a2a9b54418..ce702fed5a0 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<95380ca380ce7c5d3d2293b105d42247>> */ /** @@ -393,6 +393,12 @@ class ReactNativeFeatureFlagsJavaProvider return method(javaProvider_); } + bool fixYogaFlexBasisFitContentInMainAxis() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("fixYogaFlexBasisFitContentInMainAxis"); + return method(javaProvider_); + } + bool fuseboxAssertSingleHostState() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("fuseboxAssertSingleHostState"); @@ -860,6 +866,11 @@ bool JReactNativeFeatureFlagsCxxInterop::fixTextClippingAndroid15useBoundsForWid return ReactNativeFeatureFlags::fixTextClippingAndroid15useBoundsForWidth(); } +bool JReactNativeFeatureFlagsCxxInterop::fixYogaFlexBasisFitContentInMainAxis( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::fixYogaFlexBasisFitContentInMainAxis(); +} + bool JReactNativeFeatureFlagsCxxInterop::fuseboxAssertSingleHostState( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::fuseboxAssertSingleHostState(); @@ -1208,6 +1219,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "fixTextClippingAndroid15useBoundsForWidth", JReactNativeFeatureFlagsCxxInterop::fixTextClippingAndroid15useBoundsForWidth), + makeNativeMethod( + "fixYogaFlexBasisFitContentInMainAxis", + JReactNativeFeatureFlagsCxxInterop::fixYogaFlexBasisFitContentInMainAxis), makeNativeMethod( "fuseboxAssertSingleHostState", JReactNativeFeatureFlagsCxxInterop::fuseboxAssertSingleHostState), diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index e2a03055ab8..640fc4bc62b 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<78e35f9316b9568e7a44153d542b6ebd>> + * @generated SignedSource<<72294df9c57d40232a21ab83bcbd12cc>> */ /** @@ -207,6 +207,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool fixTextClippingAndroid15useBoundsForWidth( facebook::jni::alias_ref); + static bool fixYogaFlexBasisFitContentInMainAxis( + facebook::jni::alias_ref); + static bool fuseboxAssertSingleHostState( facebook::jni::alias_ref); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index 6de9c614fc1..2a2514ba43d 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<8643070722a65532f6c928ed82ca2aa5>> + * @generated SignedSource<> */ /** @@ -262,6 +262,10 @@ bool ReactNativeFeatureFlags::fixTextClippingAndroid15useBoundsForWidth() { return getAccessor().fixTextClippingAndroid15useBoundsForWidth(); } +bool ReactNativeFeatureFlags::fixYogaFlexBasisFitContentInMainAxis() { + return getAccessor().fixYogaFlexBasisFitContentInMainAxis(); +} + bool ReactNativeFeatureFlags::fuseboxAssertSingleHostState() { return getAccessor().fuseboxAssertSingleHostState(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index fdbcfc434f8..3f59aa4ad31 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<47cc177671195fd67010ecdba712596a>> + * @generated SignedSource<<7cd54b66686446e890246a4b4836bb69>> */ /** @@ -334,6 +334,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool fixTextClippingAndroid15useBoundsForWidth(); + /** + * When enabled, Yoga will not apply a FitContent constraint in the main axis during flex basis computation for non-measure container nodes. This prevents unnecessary re-measurement and cascading clones when a sibling changes size in a ScrollView. + */ + RN_EXPORT static bool fixYogaFlexBasisFitContentInMainAxis(); + /** * Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`. */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index cf9c347b5c3..2682992c1ea 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -1091,6 +1091,24 @@ bool ReactNativeFeatureFlagsAccessor::fixTextClippingAndroid15useBoundsForWidth( return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::fixYogaFlexBasisFitContentInMainAxis() { + auto flagValue = fixYogaFlexBasisFitContentInMainAxis_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(59, "fixYogaFlexBasisFitContentInMainAxis"); + + flagValue = currentProvider_->fixYogaFlexBasisFitContentInMainAxis(); + fixYogaFlexBasisFitContentInMainAxis_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::fuseboxAssertSingleHostState() { auto flagValue = fuseboxAssertSingleHostState_.load(); @@ -1100,7 +1118,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxAssertSingleHostState() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(59, "fuseboxAssertSingleHostState"); + markFlagAsAccessed(60, "fuseboxAssertSingleHostState"); flagValue = currentProvider_->fuseboxAssertSingleHostState(); fuseboxAssertSingleHostState_ = flagValue; @@ -1118,7 +1136,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledRelease() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(60, "fuseboxEnabledRelease"); + markFlagAsAccessed(61, "fuseboxEnabledRelease"); flagValue = currentProvider_->fuseboxEnabledRelease(); fuseboxEnabledRelease_ = flagValue; @@ -1136,7 +1154,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxNetworkInspectionEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(61, "fuseboxNetworkInspectionEnabled"); + markFlagAsAccessed(62, "fuseboxNetworkInspectionEnabled"); flagValue = currentProvider_->fuseboxNetworkInspectionEnabled(); fuseboxNetworkInspectionEnabled_ = flagValue; @@ -1154,7 +1172,7 @@ bool ReactNativeFeatureFlagsAccessor::hideOffscreenVirtualViewsOnIOS() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(62, "hideOffscreenVirtualViewsOnIOS"); + markFlagAsAccessed(63, "hideOffscreenVirtualViewsOnIOS"); flagValue = currentProvider_->hideOffscreenVirtualViewsOnIOS(); hideOffscreenVirtualViewsOnIOS_ = flagValue; @@ -1172,7 +1190,7 @@ bool ReactNativeFeatureFlagsAccessor::overrideBySynchronousMountPropsAtMountingA // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(63, "overrideBySynchronousMountPropsAtMountingAndroid"); + markFlagAsAccessed(64, "overrideBySynchronousMountPropsAtMountingAndroid"); flagValue = currentProvider_->overrideBySynchronousMountPropsAtMountingAndroid(); overrideBySynchronousMountPropsAtMountingAndroid_ = flagValue; @@ -1190,7 +1208,7 @@ bool ReactNativeFeatureFlagsAccessor::perfIssuesEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(64, "perfIssuesEnabled"); + markFlagAsAccessed(65, "perfIssuesEnabled"); flagValue = currentProvider_->perfIssuesEnabled(); perfIssuesEnabled_ = flagValue; @@ -1208,7 +1226,7 @@ bool ReactNativeFeatureFlagsAccessor::perfMonitorV2Enabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(65, "perfMonitorV2Enabled"); + markFlagAsAccessed(66, "perfMonitorV2Enabled"); flagValue = currentProvider_->perfMonitorV2Enabled(); perfMonitorV2Enabled_ = flagValue; @@ -1226,7 +1244,7 @@ double ReactNativeFeatureFlagsAccessor::preparedTextCacheSize() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(66, "preparedTextCacheSize"); + markFlagAsAccessed(67, "preparedTextCacheSize"); flagValue = currentProvider_->preparedTextCacheSize(); preparedTextCacheSize_ = flagValue; @@ -1244,7 +1262,7 @@ bool ReactNativeFeatureFlagsAccessor::preventShadowTreeCommitExhaustion() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(67, "preventShadowTreeCommitExhaustion"); + markFlagAsAccessed(68, "preventShadowTreeCommitExhaustion"); flagValue = currentProvider_->preventShadowTreeCommitExhaustion(); preventShadowTreeCommitExhaustion_ = flagValue; @@ -1262,7 +1280,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldPressibilityUseW3CPointerEventsForHo // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(68, "shouldPressibilityUseW3CPointerEventsForHover"); + markFlagAsAccessed(69, "shouldPressibilityUseW3CPointerEventsForHover"); flagValue = currentProvider_->shouldPressibilityUseW3CPointerEventsForHover(); shouldPressibilityUseW3CPointerEventsForHover_ = flagValue; @@ -1280,7 +1298,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldTriggerResponderTransferOnScrollAndr // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(69, "shouldTriggerResponderTransferOnScrollAndroid"); + markFlagAsAccessed(70, "shouldTriggerResponderTransferOnScrollAndroid"); flagValue = currentProvider_->shouldTriggerResponderTransferOnScrollAndroid(); shouldTriggerResponderTransferOnScrollAndroid_ = flagValue; @@ -1298,7 +1316,7 @@ bool ReactNativeFeatureFlagsAccessor::skipActivityIdentityAssertionOnHostPause() // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(70, "skipActivityIdentityAssertionOnHostPause"); + markFlagAsAccessed(71, "skipActivityIdentityAssertionOnHostPause"); flagValue = currentProvider_->skipActivityIdentityAssertionOnHostPause(); skipActivityIdentityAssertionOnHostPause_ = flagValue; @@ -1316,7 +1334,7 @@ bool ReactNativeFeatureFlagsAccessor::syncAndroidClipToPaddingWithOverflow() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(71, "syncAndroidClipToPaddingWithOverflow"); + markFlagAsAccessed(72, "syncAndroidClipToPaddingWithOverflow"); flagValue = currentProvider_->syncAndroidClipToPaddingWithOverflow(); syncAndroidClipToPaddingWithOverflow_ = flagValue; @@ -1334,7 +1352,7 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(72, "traceTurboModulePromiseRejectionsOnAndroid"); + markFlagAsAccessed(73, "traceTurboModulePromiseRejectionsOnAndroid"); flagValue = currentProvider_->traceTurboModulePromiseRejectionsOnAndroid(); traceTurboModulePromiseRejectionsOnAndroid_ = flagValue; @@ -1352,7 +1370,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommit( // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(73, "updateRuntimeShadowNodeReferencesOnCommit"); + markFlagAsAccessed(74, "updateRuntimeShadowNodeReferencesOnCommit"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommit(); updateRuntimeShadowNodeReferencesOnCommit_ = flagValue; @@ -1370,7 +1388,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommitT // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(74, "updateRuntimeShadowNodeReferencesOnCommitThread"); + markFlagAsAccessed(75, "updateRuntimeShadowNodeReferencesOnCommitThread"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommitThread(); updateRuntimeShadowNodeReferencesOnCommitThread_ = flagValue; @@ -1388,7 +1406,7 @@ bool ReactNativeFeatureFlagsAccessor::useAlwaysAvailableJSErrorHandling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(75, "useAlwaysAvailableJSErrorHandling"); + markFlagAsAccessed(76, "useAlwaysAvailableJSErrorHandling"); flagValue = currentProvider_->useAlwaysAvailableJSErrorHandling(); useAlwaysAvailableJSErrorHandling_ = flagValue; @@ -1406,7 +1424,7 @@ bool ReactNativeFeatureFlagsAccessor::useFabricInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(76, "useFabricInterop"); + markFlagAsAccessed(77, "useFabricInterop"); flagValue = currentProvider_->useFabricInterop(); useFabricInterop_ = flagValue; @@ -1424,7 +1442,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeViewConfigsInBridgelessMode() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(77, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(78, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; @@ -1442,7 +1460,7 @@ bool ReactNativeFeatureFlagsAccessor::useNestedScrollViewAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(78, "useNestedScrollViewAndroid"); + markFlagAsAccessed(79, "useNestedScrollViewAndroid"); flagValue = currentProvider_->useNestedScrollViewAndroid(); useNestedScrollViewAndroid_ = flagValue; @@ -1460,7 +1478,7 @@ bool ReactNativeFeatureFlagsAccessor::useSharedAnimatedBackend() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(79, "useSharedAnimatedBackend"); + markFlagAsAccessed(80, "useSharedAnimatedBackend"); flagValue = currentProvider_->useSharedAnimatedBackend(); useSharedAnimatedBackend_ = flagValue; @@ -1478,7 +1496,7 @@ bool ReactNativeFeatureFlagsAccessor::useTraitHiddenOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(80, "useTraitHiddenOnAndroid"); + markFlagAsAccessed(81, "useTraitHiddenOnAndroid"); flagValue = currentProvider_->useTraitHiddenOnAndroid(); useTraitHiddenOnAndroid_ = flagValue; @@ -1496,7 +1514,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(81, "useTurboModuleInterop"); + markFlagAsAccessed(82, "useTurboModuleInterop"); flagValue = currentProvider_->useTurboModuleInterop(); useTurboModuleInterop_ = flagValue; @@ -1514,7 +1532,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModules() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(82, "useTurboModules"); + markFlagAsAccessed(83, "useTurboModules"); flagValue = currentProvider_->useTurboModules(); useTurboModules_ = flagValue; @@ -1532,7 +1550,7 @@ bool ReactNativeFeatureFlagsAccessor::useUnorderedMapInDifferentiator() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(83, "useUnorderedMapInDifferentiator"); + markFlagAsAccessed(84, "useUnorderedMapInDifferentiator"); flagValue = currentProvider_->useUnorderedMapInDifferentiator(); useUnorderedMapInDifferentiator_ = flagValue; @@ -1550,7 +1568,7 @@ double ReactNativeFeatureFlagsAccessor::viewCullingOutsetRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(84, "viewCullingOutsetRatio"); + markFlagAsAccessed(85, "viewCullingOutsetRatio"); flagValue = currentProvider_->viewCullingOutsetRatio(); viewCullingOutsetRatio_ = flagValue; @@ -1568,7 +1586,7 @@ bool ReactNativeFeatureFlagsAccessor::viewTransitionEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(85, "viewTransitionEnabled"); + markFlagAsAccessed(86, "viewTransitionEnabled"); flagValue = currentProvider_->viewTransitionEnabled(); viewTransitionEnabled_ = flagValue; @@ -1586,7 +1604,7 @@ double ReactNativeFeatureFlagsAccessor::virtualViewPrerenderRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(86, "virtualViewPrerenderRatio"); + markFlagAsAccessed(87, "virtualViewPrerenderRatio"); flagValue = currentProvider_->virtualViewPrerenderRatio(); virtualViewPrerenderRatio_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index 754cf0afa06..87af90a1a6f 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<63a0714c9c06697555b9b66f2bd77288>> + * @generated SignedSource<> */ /** @@ -91,6 +91,7 @@ class ReactNativeFeatureFlagsAccessor { bool fixFindShadowNodeByTagRaceCondition(); bool fixMappingOfEventPrioritiesBetweenFabricAndReact(); bool fixTextClippingAndroid15useBoundsForWidth(); + bool fixYogaFlexBasisFitContentInMainAxis(); bool fuseboxAssertSingleHostState(); bool fuseboxEnabledRelease(); bool fuseboxNetworkInspectionEnabled(); @@ -130,7 +131,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 87> accessedFeatureFlags_; + std::array, 88> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> cdpInteractionMetricsEnabled_; @@ -191,6 +192,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> fixFindShadowNodeByTagRaceCondition_; std::atomic> fixMappingOfEventPrioritiesBetweenFabricAndReact_; std::atomic> fixTextClippingAndroid15useBoundsForWidth_; + std::atomic> fixYogaFlexBasisFitContentInMainAxis_; std::atomic> fuseboxAssertSingleHostState_; std::atomic> fuseboxEnabledRelease_; std::atomic> fuseboxNetworkInspectionEnabled_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index aa3675116ca..e16e33568f1 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<613758ace44bd00d1156d05f365f1119>> + * @generated SignedSource<<517d97078b1494ef3a3557ae4ed1d1aa>> */ /** @@ -263,6 +263,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool fixYogaFlexBasisFitContentInMainAxis() override { + return false; + } + bool fuseboxAssertSingleHostState() override { return true; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index 97a94b58dcb..305e4c643a2 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<0ed8edbf386bc66719f23b2514d05074>> + * @generated SignedSource<<6be8bbcc220f1dc15ce0817152bcaf91>> */ /** @@ -576,6 +576,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::fixTextClippingAndroid15useBoundsForWidth(); } + bool fixYogaFlexBasisFitContentInMainAxis() override { + auto value = values_["fixYogaFlexBasisFitContentInMainAxis"]; + if (!value.isNull()) { + return value.getBool(); + } + + return ReactNativeFeatureFlagsDefaults::fixYogaFlexBasisFitContentInMainAxis(); + } + bool fuseboxAssertSingleHostState() override { auto value = values_["fuseboxAssertSingleHostState"]; if (!value.isNull()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index b9cc111cd84..6c54cf0c297 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<37ac0b0a8ecb4ee585cd6c0d1b14bfce>> + * @generated SignedSource<> */ /** @@ -84,6 +84,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool fixFindShadowNodeByTagRaceCondition() = 0; virtual bool fixMappingOfEventPrioritiesBetweenFabricAndReact() = 0; virtual bool fixTextClippingAndroid15useBoundsForWidth() = 0; + virtual bool fixYogaFlexBasisFitContentInMainAxis() = 0; virtual bool fuseboxAssertSingleHostState() = 0; virtual bool fuseboxEnabledRelease() = 0; virtual bool fuseboxNetworkInspectionEnabled() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index 701e31305c7..b83da601b0f 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<11d5240e0fd4bce14794689d7521cda3>> + * @generated SignedSource<<8d4ab9ca1446252585606d87ecf8ed46>> */ /** @@ -339,6 +339,11 @@ bool NativeReactNativeFeatureFlags::fixTextClippingAndroid15useBoundsForWidth( return ReactNativeFeatureFlags::fixTextClippingAndroid15useBoundsForWidth(); } +bool NativeReactNativeFeatureFlags::fixYogaFlexBasisFitContentInMainAxis( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::fixYogaFlexBasisFitContentInMainAxis(); +} + bool NativeReactNativeFeatureFlags::fuseboxAssertSingleHostState( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::fuseboxAssertSingleHostState(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 72a9b5568d1..0dd41952cbe 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -154,6 +154,8 @@ class NativeReactNativeFeatureFlags bool fixTextClippingAndroid15useBoundsForWidth(jsi::Runtime& runtime); + bool fixYogaFlexBasisFitContentInMainAxis(jsi::Runtime& runtime); + bool fuseboxAssertSingleHostState(jsi::Runtime& runtime); bool fuseboxEnabledRelease(jsi::Runtime& runtime); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp index bd327efc351..bd7fbed5b5e 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp @@ -599,10 +599,13 @@ void YogaLayoutableShadowNode::layoutTree( { TraceSection s2("YogaLayoutableShadowNode::configureYogaTree"); + YGErrata defaultErrata = YGErrataAll; + if (ReactNativeFeatureFlags::fixYogaFlexBasisFitContentInMainAxis()) { + defaultErrata = static_cast( + defaultErrata & ~YGErrataFlexBasisFitContentInMainAxis); + } configureYogaTree( - layoutContext.pointScaleFactor, - YGErrataAll /*defaultErrata*/, - swapLeftAndRight); + layoutContext.pointScaleFactor, defaultErrata, swapLeftAndRight); } auto minimumSize = layoutConstraints.minimumSize; diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp index 4bdace6b7a5..3e63b509b7e 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp @@ -111,6 +111,8 @@ const char* YGErrataToString(const YGErrata value) { return "absolute-position-without-insets-excludes-padding"; case YGErrataAbsolutePercentAgainstInnerSize: return "absolute-percent-against-inner-size"; + case YGErrataFlexBasisFitContentInMainAxis: + return "flex-basis-fit-content-in-main-axis"; case YGErrataAll: return "all"; case YGErrataClassic: diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h index bb83bcfac94..c0bc7a04e4c 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h @@ -64,6 +64,7 @@ YG_ENUM_DECL( YGErrataStretchFlexBasis = 1, YGErrataAbsolutePositionWithoutInsetsExcludesPadding = 2, YGErrataAbsolutePercentAgainstInnerSize = 4, + YGErrataFlexBasisFitContentInMainAxis = 8, YGErrataAll = 2147483647, YGErrataClassic = 2147483646) YG_DEFINE_ENUM_FLAG_OPERATORS(YGErrata) diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp index 81a5f3b8a0b..5e9350b2f9e 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp @@ -94,7 +94,10 @@ static void computeFlexBasisForChild( const bool isColumnStyleDimDefined = child->hasDefiniteLength(Dimension::Height, ownerHeight); - if (resolvedFlexBasis.isDefined() && yoga::isDefined(mainAxisSize)) { + if (resolvedFlexBasis.isDefined() && + (yoga::isDefined(mainAxisSize) || + (!node->hasErrata(Errata::FlexBasisFitContentInMainAxis) && + resolvedFlexBasis.unwrap() > 0))) { if (child->getLayout().computedFlexBasis.isUndefined() || (child->getConfig()->isExperimentalFeatureEnabled( ExperimentalFeature::WebFlexBasis) && @@ -156,19 +159,57 @@ static void computeFlexBasisForChild( // The W3C spec doesn't say anything about the 'overflow' property, but all // major browsers appear to implement the following logic. - if ((!isMainAxisRow && node->style().overflow() == Overflow::Scroll) || - node->style().overflow() != Overflow::Scroll) { - if (yoga::isUndefined(childWidth) && yoga::isDefined(width)) { - childWidth = width; - childWidthSizingMode = SizingMode::FitContent; + // + // In the cross axis, children should always be bounded by the parent's + // available space (FitContent). In the main axis, the flex basis should + // be the child's intrinsic size under max-content constraint. + // + // The legacy behavior (FlexBasisFitContentInMainAxis errata) applies a + // FitContent constraint in the main axis for non-scroll containers, which + // causes unnecessary re-measurement and cascading clones when the parent's + // content-determined size changes (e.g. when a sibling's height changes + // in a ScrollView). + // + // The corrected behavior leaves the main axis unconstrained for container + // children (no measure function), and preserves the FitContent constraint + // for measure function nodes (e.g. text) to support text wrapping. + if (node->hasErrata(Errata::FlexBasisFitContentInMainAxis)) { + // Legacy behavior: apply FitContent in both axes (except main axis for + // scroll containers). + if ((!isMainAxisRow && node->style().overflow() == Overflow::Scroll) || + node->style().overflow() != Overflow::Scroll) { + if (yoga::isUndefined(childWidth) && yoga::isDefined(width)) { + childWidth = width; + childWidthSizingMode = SizingMode::FitContent; + } } - } - if ((isMainAxisRow && node->style().overflow() == Overflow::Scroll) || - node->style().overflow() != Overflow::Scroll) { - if (yoga::isUndefined(childHeight) && yoga::isDefined(height)) { - childHeight = height; - childHeightSizingMode = SizingMode::FitContent; + if ((isMainAxisRow && node->style().overflow() == Overflow::Scroll) || + node->style().overflow() != Overflow::Scroll) { + if (yoga::isUndefined(childHeight) && yoga::isDefined(height)) { + childHeight = height; + childHeightSizingMode = SizingMode::FitContent; + } + } + } else { + // Corrected behavior: only apply FitContent in the cross axis, or in + // the main axis for measure function nodes in non-scroll containers. + if (!isMainAxisRow || + (child->hasMeasureFunc() && + node->style().overflow() != Overflow::Scroll)) { + if (yoga::isUndefined(childWidth) && yoga::isDefined(width)) { + childWidth = width; + childWidthSizingMode = SizingMode::FitContent; + } + } + + if (isMainAxisRow || + (child->hasMeasureFunc() && + node->style().overflow() != Overflow::Scroll)) { + if (yoga::isUndefined(childHeight) && yoga::isDefined(height)) { + childHeight = height; + childHeightSizingMode = SizingMode::FitContent; + } } } @@ -537,6 +578,8 @@ static float computeFlexBasisForChildren( yoga::Node* const node, const float availableInnerWidth, const float availableInnerHeight, + const float ownerWidth, + const float ownerHeight, SizingMode widthSizingMode, SizingMode heightSizingMode, Direction direction, @@ -598,8 +641,8 @@ static float computeFlexBasisForChildren( availableInnerWidth, widthSizingMode, availableInnerHeight, - availableInnerWidth, - availableInnerHeight, + ownerWidth, + ownerHeight, heightSizingMode, direction, layoutMarkerData, @@ -1421,12 +1464,56 @@ static void calculateLayoutImpl( // STEP 3: DETERMINE FLEX BASIS FOR EACH ITEM + // When this node is measured with MaxContent (corrected + // FlexBasisFitContentInMainAxis behavior), availableInnerHeight/Width is NaN. + // To preserve percentage resolution for descendants, derive a definite + // owner-size from the parent-provided ownerHeight/ownerWidth. + float ownerWidthForChildren = availableInnerWidth; + float ownerHeightForChildren = availableInnerHeight; + + if (!node->hasErrata(Errata::FlexBasisFitContentInMainAxis)) { + // Do not propagate the fallback when this node is a direct child of a + // scroll container. In scroll contexts, the scroll axis is intentionally + // indefinite and percentage-based children should not resolve against the + // viewport size. + const auto* owner = node->getOwner(); + const bool isChildOfScrollContainer = + owner != nullptr && owner->style().overflow() == Overflow::Scroll; + + if (!isChildOfScrollContainer) { + if (yoga::isUndefined(ownerWidthForChildren) && + yoga::isDefined(ownerWidth)) { + ownerWidthForChildren = calculateAvailableInnerDimension( + node, + direction, + Dimension::Width, + ownerWidth - marginAxisRow, + paddingAndBorderAxisRow, + ownerWidth, + ownerWidth); + } + if (yoga::isUndefined(ownerHeightForChildren) && + yoga::isDefined(ownerHeight)) { + ownerHeightForChildren = calculateAvailableInnerDimension( + node, + direction, + Dimension::Height, + ownerHeight - marginAxisColumn, + paddingAndBorderAxisColumn, + ownerHeight, + ownerWidth); + } + } + } + // Computed basis + margins + gap float totalMainDim = 0; totalMainDim += computeFlexBasisForChildren( node, availableInnerWidth, availableInnerHeight, + ownerWidthForChildren, + ownerHeightForChildren, widthSizingMode, heightSizingMode, direction, diff --git a/packages/react-native/ReactCommon/yoga/yoga/enums/Errata.h b/packages/react-native/ReactCommon/yoga/yoga/enums/Errata.h index 2f47a941751..86d8409b15b 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/enums/Errata.h +++ b/packages/react-native/ReactCommon/yoga/yoga/enums/Errata.h @@ -20,6 +20,7 @@ enum class Errata : uint32_t { StretchFlexBasis = YGErrataStretchFlexBasis, AbsolutePositionWithoutInsetsExcludesPadding = YGErrataAbsolutePositionWithoutInsetsExcludesPadding, AbsolutePercentAgainstInnerSize = YGErrataAbsolutePercentAgainstInnerSize, + FlexBasisFitContentInMainAxis = YGErrataFlexBasisFitContentInMainAxis, All = YGErrataAll, Classic = YGErrataClassic, }; diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 4a3fafab275..fa232192ff0 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -680,6 +680,17 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'experimental', }, + fixYogaFlexBasisFitContentInMainAxis: { + defaultValue: false, + metadata: { + dateAdded: '2026-02-26', + description: + 'When enabled, Yoga will not apply a FitContent constraint in the main axis during flex basis computation for non-measure container nodes. This prevents unnecessary re-measurement and cascading clones when a sibling changes size in a ScrollView.', + expectedReleaseValue: true, + purpose: 'experimentation', + }, + ossReleaseStage: 'none', + }, fuseboxAssertSingleHostState: { defaultValue: true, metadata: { diff --git a/packages/react-native/src/private/__tests__/utilities/__tests__/ShadowNodeRevisionGetter-itest.js b/packages/react-native/src/private/__tests__/utilities/__tests__/ShadowNodeRevisionGetter-itest.js index f5bd1e3bfbd..19cfe722bc8 100644 --- a/packages/react-native/src/private/__tests__/utilities/__tests__/ShadowNodeRevisionGetter-itest.js +++ b/packages/react-native/src/private/__tests__/utilities/__tests__/ShadowNodeRevisionGetter-itest.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @fantom_flags enableFabricCommitBranching:* + * @fantom_flags enableFabricCommitBranching:* fixYogaFlexBasisFitContentInMainAxis:* * @flow strict-local * @format */ @@ -15,6 +15,7 @@ import {createShadowNodeReferenceGetterRef} from '../ShadowNodeRevisionGetter'; import * as Fantom from '@react-native/fantom'; import * as React from 'react'; import {ScrollView, View} from 'react-native'; +import {fixYogaFlexBasisFitContentInMainAxis} from 'react-native/src/private/featureflags/ReactNativeFeatureFlags'; test('base case when cloning results in revision +1', () => { const root = Fantom.createRoot(); @@ -70,6 +71,10 @@ test('changing height of the top item in ScrollView results in excessive cloning ); }); - // TODO(T225268793): the below assertion should be: `expect(getRevision()).toBe(1);` - expect(getRevision()).toBe(2); + if (fixYogaFlexBasisFitContentInMainAxis()) { + expect(getRevision()).toBe(1); + } else { + // TODO(T225268793): the below assertion should be: `expect(getRevision()).toBe(1);` + expect(getRevision()).toBe(2); + } }); diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 824e851550d..3b2c32b2041 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<5072c12941f3173be27ac422320c3caa>> + * @generated SignedSource<> * @flow strict * @noformat */ @@ -107,6 +107,7 @@ export type ReactNativeFeatureFlags = $ReadOnly<{ fixFindShadowNodeByTagRaceCondition: Getter, fixMappingOfEventPrioritiesBetweenFabricAndReact: Getter, fixTextClippingAndroid15useBoundsForWidth: Getter, + fixYogaFlexBasisFitContentInMainAxis: Getter, fuseboxAssertSingleHostState: Getter, fuseboxEnabledRelease: Getter, fuseboxNetworkInspectionEnabled: Getter, @@ -442,6 +443,10 @@ export const fixMappingOfEventPrioritiesBetweenFabricAndReact: Getter = * Fix text clipping starting in Android 15 due to usage of useBoundsForWidth */ export const fixTextClippingAndroid15useBoundsForWidth: Getter = createNativeFlagGetter('fixTextClippingAndroid15useBoundsForWidth', false); +/** + * When enabled, Yoga will not apply a FitContent constraint in the main axis during flex basis computation for non-measure container nodes. This prevents unnecessary re-measurement and cascading clones when a sibling changes size in a ScrollView. + */ +export const fixYogaFlexBasisFitContentInMainAxis: Getter = createNativeFlagGetter('fixYogaFlexBasisFitContentInMainAxis', false); /** * Enable system assertion validating that Fusebox is configured with a single host. When set, the CDP backend will dynamically disable features (Perf and Network) in the event that multiple hosts are registered (undefined behaviour), and broadcast this over `ReactNativeApplication.systemStateChanged`. */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index 1cc964cdf0f..bb060fdeca5 100644 --- a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<3fd91ee5bd5c4d53241b3946d8e0b056>> + * @generated SignedSource<> * @flow strict * @noformat */ @@ -84,6 +84,7 @@ export interface Spec extends TurboModule { +fixFindShadowNodeByTagRaceCondition?: () => boolean; +fixMappingOfEventPrioritiesBetweenFabricAndReact?: () => boolean; +fixTextClippingAndroid15useBoundsForWidth?: () => boolean; + +fixYogaFlexBasisFitContentInMainAxis?: () => boolean; +fuseboxAssertSingleHostState?: () => boolean; +fuseboxEnabledRelease?: () => boolean; +fuseboxNetworkInspectionEnabled?: () => boolean; From 59b8886bb85f3c4c4b4ef55536d8ffeb4e5b3102 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Wed, 4 Mar 2026 12:57:26 -0800 Subject: [PATCH 064/595] Add request interceptor API to RCTMultipartDataTask (#55916) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55916 ## Summary: Replace the hardcoded `RCTDevSupportHttpHeaders` integration in `RCTMultipartDataTask` with a generic request interceptor API. This allows consumers to register a block via `RCTSetCustomMultipartDataTaskRequestInterceptor` that can inspect and modify multipart data task requests before they are sent, without coupling `RCTMultipartDataTask` to any specific header injection mechanism. ## Changelog: [IOS][ADDED] - Add `RCTSetCustomMultipartDataTaskRequestInterceptor` API to allow custom modification of multipart data task requests before they are sent Reviewed By: cortinico Differential Revision: D95219954 fbshipit-source-id: 7752b2ee44ee9d4db574a9866661e1a717b75bed --- .../React/Base/RCTMultipartDataTask.h | 9 +++++++++ .../React/Base/RCTMultipartDataTask.m | 18 +++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/react-native/React/Base/RCTMultipartDataTask.h b/packages/react-native/React/Base/RCTMultipartDataTask.h index 25a73fdaf1a..9b94a260a90 100644 --- a/packages/react-native/React/Base/RCTMultipartDataTask.h +++ b/packages/react-native/React/Base/RCTMultipartDataTask.h @@ -7,6 +7,7 @@ #import +#import #import typedef void (^RCTMultipartDataTaskCallback)( @@ -16,6 +17,14 @@ typedef void (^RCTMultipartDataTaskCallback)( NSError *error, BOOL done); +typedef NSURLRequest *_Nullable (^RCTMultipartDataTaskRequestInterceptor)(NSURLRequest *request); +/** + * The block provided via this function can inspect/modify multipart data task + * requests before they are sent. Return a modified request to override, or nil + * to use the original request unchanged. + */ +RCT_EXTERN void RCTSetCustomMultipartDataTaskRequestInterceptor(RCTMultipartDataTaskRequestInterceptor /*interceptor*/); + @interface RCTMultipartDataTask : NSObject - (instancetype)initWithURL:(NSURL *)url diff --git a/packages/react-native/React/Base/RCTMultipartDataTask.m b/packages/react-native/React/Base/RCTMultipartDataTask.m index 9f5ff599553..b68dee6b4a1 100644 --- a/packages/react-native/React/Base/RCTMultipartDataTask.m +++ b/packages/react-native/React/Base/RCTMultipartDataTask.m @@ -7,7 +7,12 @@ #import "RCTMultipartDataTask.h" -#import "RCTDevSupportHttpHeaders.h" +static RCTMultipartDataTaskRequestInterceptor multipartRequestInterceptor; + +void RCTSetCustomMultipartDataTaskRequestInterceptor(RCTMultipartDataTaskRequestInterceptor interceptor) +{ + multipartRequestInterceptor = interceptor; +} @interface RCTMultipartDataTask () @@ -42,8 +47,15 @@ - (void)startTask delegateQueue:nil]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url]; [request addValue:@"multipart/mixed" forHTTPHeaderField:@"Accept"]; - [[RCTDevSupportHttpHeaders sharedInstance] applyHeadersToRequest:request]; - NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; + NSURLRequest *finalRequest = request; + if (multipartRequestInterceptor != nil) { + NSURLRequest *intercepted = multipartRequestInterceptor(request); + if (intercepted != nil) { + finalRequest = intercepted; + } + } + NSLog(@"[RCTMultipartDataTask] %@ %@", finalRequest.HTTPMethod ?: @"GET", finalRequest.URL.absoluteString); + NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:finalRequest]; [dataTask resume]; [session finishTasksAndInvalidate]; } From 859ae5caa0aad62db0c42372f05ecd0edc54fe7a Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 4 Mar 2026 13:24:08 -0800 Subject: [PATCH 065/595] Make DevSupportHttpClient internal (#55883) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55883 All 7 callers of DevSupportHttpClient are within ReactAndroid, so there is no need to expose it as a public API. Make the class and all its members internal. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D95059038 fbshipit-source-id: 7aeb04503ac5eaa538cbb8b4d9352ae97d165ea0 --- .../ReactAndroid/api/ReactAndroid.api | 10 ---------- .../inspector/DevSupportHttpClient.kt | 17 +++++++---------- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 4e368726133..98883b24dc9 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -2049,16 +2049,6 @@ public final class com/facebook/react/devsupport/StackTraceHelper$StackFrameImpl public fun toJSON ()Lorg/json/JSONObject; } -public final class com/facebook/react/devsupport/inspector/DevSupportHttpClient { - public static final field INSTANCE Lcom/facebook/react/devsupport/inspector/DevSupportHttpClient; - public static final fun addRequestHeader (Ljava/lang/String;Ljava/lang/String;)V - public final fun getHttpClient ()Lokhttp3/OkHttpClient; - public final fun getWebsocketClient ()Lokhttp3/OkHttpClient; - public static final fun httpScheme (Ljava/lang/String;)Ljava/lang/String; - public static final fun removeRequestHeader (Ljava/lang/String;)V - public static final fun wsScheme (Ljava/lang/String;)Ljava/lang/String; -} - public abstract interface class com/facebook/react/devsupport/interfaces/BundleLoadCallback { public fun onError (Ljava/lang/Exception;)V public abstract fun onSuccess ()V diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt index dae61b4309b..cef0242e834 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt @@ -19,7 +19,7 @@ import okhttp3.OkHttpClient * dispatcher across all dev support HTTP and WebSocket usage. Supports injecting custom request * headers that are applied to every outgoing request via an OkHttp interceptor. */ -public object DevSupportHttpClient { +internal object DevSupportHttpClient { private val customHeaders = ConcurrentHashMap() private val headerInterceptor = Interceptor { chain -> @@ -31,7 +31,7 @@ public object DevSupportHttpClient { } /** Client for HTTP requests: connect=5s, write=disabled, read=disabled. */ - public val httpClient: OkHttpClient = + internal val httpClient: OkHttpClient = OkHttpClient.Builder() .addInterceptor(headerInterceptor) .connectTimeout(5, TimeUnit.SECONDS) @@ -40,7 +40,7 @@ public object DevSupportHttpClient { .build() /** Client for WebSocket connections: connect=10s, write=10s, read=disabled. */ - public val websocketClient: OkHttpClient = + internal val websocketClient: OkHttpClient = httpClient .newBuilder() .connectTimeout(10, TimeUnit.SECONDS) @@ -48,14 +48,12 @@ public object DevSupportHttpClient { .build() /** Add a custom header to be included in all requests made through both clients. */ - @JvmStatic - public fun addRequestHeader(name: String, value: String) { + internal fun addRequestHeader(name: String, value: String) { customHeaders[name] = value } /** Remove a previously added custom header. */ - @JvmStatic - public fun removeRequestHeader(name: String) { + internal fun removeRequestHeader(name: String) { customHeaders.remove(name) } @@ -63,12 +61,11 @@ public object DevSupportHttpClient { * Returns the appropriate HTTP scheme ("http" or "https") for the given host. Uses "https" when * the host specifies port 443 explicitly (e.g. "example.com:443"). */ - @JvmStatic - public fun httpScheme(host: String): String = if (host.endsWith(":443")) "https" else "http" + internal fun httpScheme(host: String): String = if (host.endsWith(":443")) "https" else "http" /** * Returns the appropriate WebSocket scheme ("ws" or "wss") for the given host. Uses "wss" when * the host specifies port 443 explicitly (e.g. "example.com:443"). */ - @JvmStatic public fun wsScheme(host: String): String = if (host.endsWith(":443")) "wss" else "ws" + internal fun wsScheme(host: String): String = if (host.endsWith(":443")) "wss" else "ws" } From 3f46e5f279ad028a971259493d619e6a6587ba6b Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 4 Mar 2026 13:24:08 -0800 Subject: [PATCH 066/595] Remove custom header support from DevSupportHttpClient (#55884) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55884 The addRequestHeader/removeRequestHeader methods don't need to live inside devsupport. Instead we can use the `setOkHttpClientFactory` to provide this same logic. Changelog: [Internal] Reviewed By: javache, cipolleschi Differential Revision: D95059080 fbshipit-source-id: e9124123911a44291799368d6aa4d7b8cb0d4d53 --- .../inspector/DevSupportHttpClient.kt | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt index cef0242e834..356ee0cbf5f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt @@ -9,31 +9,17 @@ package com.facebook.react.devsupport.inspector -import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit -import okhttp3.Interceptor import okhttp3.OkHttpClient /** * Shared [OkHttpClient] instances for devsupport networking. Uses a single connection pool and - * dispatcher across all dev support HTTP and WebSocket usage. Supports injecting custom request - * headers that are applied to every outgoing request via an OkHttp interceptor. + * dispatcher across all dev support HTTP and WebSocket usage. */ internal object DevSupportHttpClient { - private val customHeaders = ConcurrentHashMap() - - private val headerInterceptor = Interceptor { chain -> - val builder = chain.request().newBuilder() - for ((name, value) in customHeaders) { - builder.header(name, value) - } - chain.proceed(builder.build()) - } - /** Client for HTTP requests: connect=5s, write=disabled, read=disabled. */ internal val httpClient: OkHttpClient = OkHttpClient.Builder() - .addInterceptor(headerInterceptor) .connectTimeout(5, TimeUnit.SECONDS) .writeTimeout(0, TimeUnit.MILLISECONDS) .readTimeout(0, TimeUnit.MINUTES) @@ -47,16 +33,6 @@ internal object DevSupportHttpClient { .writeTimeout(10, TimeUnit.SECONDS) .build() - /** Add a custom header to be included in all requests made through both clients. */ - internal fun addRequestHeader(name: String, value: String) { - customHeaders[name] = value - } - - /** Remove a previously added custom header. */ - internal fun removeRequestHeader(name: String) { - customHeaders.remove(name) - } - /** * Returns the appropriate HTTP scheme ("http" or "https") for the given host. Uses "https" when * the host specifies port 443 explicitly (e.g. "example.com:443"). From 8487b6d03b176f85d4970ece00925f808c64a834 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 4 Mar 2026 13:24:08 -0800 Subject: [PATCH 067/595] WebSocketModule uses OkHttpClientProvider (#55885) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55885 Instead of creating a brand-new OkHttpClient.Builder() per WebSocket connection, derive from OkHttpClientProvider.getOkHttpClient() so that all connections share the same connection pool and dispatcher. Also remove the dispatcher shutdown call, since the dispatcher is now shared with the global OkHttpClient and shutting it down would kill all connections. Changelog: [Internal] Reviewed By: cipolleschi, javache Differential Revision: D95059116 fbshipit-source-id: c8052c11f26a07961bcc8e4428508abeb391541d --- .../facebook/react/modules/websocket/WebSocketModule.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt index 9c8d9cf1240..b7752d16928 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt @@ -22,6 +22,7 @@ import com.facebook.react.common.ReactConstants import com.facebook.react.module.annotations.ReactModule import com.facebook.react.modules.network.CustomClientBuilder import com.facebook.react.modules.network.ForwardingCookieHandler +import com.facebook.react.modules.network.OkHttpClientProvider import java.io.IOException import java.net.URI import java.net.URISyntaxException @@ -80,7 +81,8 @@ public class WebSocketModule(context: ReactApplicationContext) : ) { val id = socketID.toInt() val okHttpBuilder = - OkHttpClient.Builder() + OkHttpClientProvider.getOkHttpClient() + .newBuilder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(0, TimeUnit.MINUTES) // Disable timeouts for read @@ -198,9 +200,6 @@ public class WebSocketModule(context: ReactApplicationContext) : } }, ) - - // Trigger shutdown of the dispatcher's executor so this process can exit cleanly - client.dispatcher().executorService().shutdown() } override fun close(code: Double, reason: String?, socketID: Double) { From c45c5cfc8b9a98e226dd5c01689d33a09ed727fd Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 4 Mar 2026 13:24:08 -0800 Subject: [PATCH 068/595] DevSupportHttpClient uses OkHttpClientProvider (#55886) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55886 Instead of creating an independent OkHttpClient, derive from OkHttpClientProvider.getOkHttpClient() so that all dev support connections share the same connection pool and dispatcher with the rest of React Native networking. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D95058926 fbshipit-source-id: d82c9ce89e46130683fcb9492f4d36a302e081c9 --- .../react/devsupport/inspector/DevSupportHttpClient.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt index 356ee0cbf5f..b1dc4a4e9a4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/DevSupportHttpClient.kt @@ -9,6 +9,7 @@ package com.facebook.react.devsupport.inspector +import com.facebook.react.modules.network.OkHttpClientProvider import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient @@ -19,7 +20,8 @@ import okhttp3.OkHttpClient internal object DevSupportHttpClient { /** Client for HTTP requests: connect=5s, write=disabled, read=disabled. */ internal val httpClient: OkHttpClient = - OkHttpClient.Builder() + OkHttpClientProvider.getOkHttpClient() + .newBuilder() .connectTimeout(5, TimeUnit.SECONDS) .writeTimeout(0, TimeUnit.MILLISECONDS) .readTimeout(0, TimeUnit.MINUTES) From 84410fe3306202719b6d17813f815cdc94b548ae Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 4 Mar 2026 23:54:39 -0800 Subject: [PATCH 069/595] Restore a single method for text parsing (#55909) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55909 Changelog: [Internal] Restores the single path for doxygen ref parsing that was lost in refactor in D94072940 Reviewed By: cipolleschi Differential Revision: D95206764 fbshipit-source-id: c2028872d8ff904187b41baf113dfe828796edcc --- scripts/cxx-api/parser/builders.py | 14 ++++-------- scripts/cxx-api/parser/utils/__init__.py | 2 -- .../cxx-api/parser/utils/text_resolution.py | 22 ------------------- 3 files changed, 4 insertions(+), 34 deletions(-) diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index 912548fe2a9..85d11f7ccc6 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -26,12 +26,7 @@ TypedefMember, VariableMember, ) -from .scope import ( - CategoryScopeKind, - InterfaceScopeKind, - ProtocolScopeKind, - StructLikeScopeKind, -) +from .scope import InterfaceScopeKind, ProtocolScopeKind, StructLikeScopeKind from .snapshot import Snapshot from .template import Template from .utils import ( @@ -40,7 +35,6 @@ InitializerType, parse_qualified_path, resolve_linked_text_name, - resolve_ref_text_name, ) @@ -281,7 +275,7 @@ def get_typedef_member( typedef_def: compound.memberdefType, visibility: str ) -> TypedefMember: typedef_name = typedef_def.get_name() - typedef_type = resolve_ref_text_name(typedef_def.get_type()) + typedef_type = resolve_linked_text_name(typedef_def.get_type())[0] typedef_argstring = typedef_def.get_argsstring() typedef_definition = typedef_def.definition @@ -338,7 +332,7 @@ def get_property_member( Get the property member from a member definition. """ property_name = member_def.get_name() - property_type = resolve_ref_text_name(member_def.get_type()).strip() + property_type = resolve_linked_text_name(member_def.get_type())[0].strip() accessor = member_def.accessor if hasattr(member_def, "accessor") else None is_readable = getattr(member_def, "readable", "no") == "yes" is_writable = getattr(member_def, "writable", "no") == "yes" @@ -364,7 +358,7 @@ def create_enum_scope(snapshot: Snapshot, enum_def: compound.EnumdefType) -> Non Create an enum scope in the snapshot. """ scope = snapshot.create_enum(enum_def.qualifiedname) - scope.kind.type = resolve_ref_text_name(enum_def.get_type()) + scope.kind.type = resolve_linked_text_name(enum_def.get_type())[0] scope.location = enum_def.location.file for enum_value_def in enum_def.enumvalue: diff --git a/scripts/cxx-api/parser/utils/__init__.py b/scripts/cxx-api/parser/utils/__init__.py index 5af0c5ebdb0..25fd05b4183 100644 --- a/scripts/cxx-api/parser/utils/__init__.py +++ b/scripts/cxx-api/parser/utils/__init__.py @@ -19,7 +19,6 @@ InitializerType, normalize_angle_brackets, resolve_linked_text_name, - resolve_ref_text_name, ) from .type_qualification import qualify_arguments, qualify_parsed_type, qualify_type_str @@ -40,5 +39,4 @@ "qualify_parsed_type", "qualify_type_str", "resolve_linked_text_name", - "resolve_ref_text_name", ] diff --git a/scripts/cxx-api/parser/utils/text_resolution.py b/scripts/cxx-api/parser/utils/text_resolution.py index 5995491304c..497e1267a5d 100644 --- a/scripts/cxx-api/parser/utils/text_resolution.py +++ b/scripts/cxx-api/parser/utils/text_resolution.py @@ -90,28 +90,6 @@ def normalize_angle_brackets(text: str) -> str: return text -def resolve_ref_text_name(type_def: compound.refTextType) -> str: - """Resolve the text content of a refTextType.""" - if hasattr(type_def, "content_") and type_def.content_: - name = "" - for part in type_def.content_: - if part.category == 1: # MixedContainer.CategoryText - name += part.value - elif part.category == 3: # MixedContainer.CategoryComplex (ref element) - if hasattr(part.value, "get_valueOf_"): - name += part.value.get_valueOf_() - elif hasattr(part.value, "valueOf_"): - name += part.value.valueOf_ - else: - name += str(part.value) - return normalize_angle_brackets(name) - - if type_def.ref: - return normalize_angle_brackets(type_def.ref[0].get_valueOf_()) - - return normalize_angle_brackets(type_def.get_valueOf_()) - - class InitializerType(Enum): NONE = (0,) ASSIGNMENT = (1,) From fecd8e392302417e826c7be5283e4f004a3fb236 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 4 Mar 2026 23:54:39 -0800 Subject: [PATCH 070/595] Add basic snapshot diffing mechanism (#55906) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55906 Changelog: [Internal] Adds a simple snapshot diffing mode to the snapshot generation (`--check` argument). Removes `RUN_ON_REACT_NATIVE` constant in favor of `--test` argument. Reviewed By: cipolleschi Differential Revision: D93407648 fbshipit-source-id: 7860bca27ba6784b9b8517ec86bd16b41af48d9b --- scripts/cxx-api/parser/__main__.py | 121 +++++++++++++++++------- scripts/cxx-api/parser/snapshot_diff.py | 73 ++++++++++++++ 2 files changed, 158 insertions(+), 36 deletions(-) create mode 100644 scripts/cxx-api/parser/snapshot_diff.py diff --git a/scripts/cxx-api/parser/__main__.py b/scripts/cxx-api/parser/__main__.py index 25df8a1ae67..96673ad2dfe 100644 --- a/scripts/cxx-api/parser/__main__.py +++ b/scripts/cxx-api/parser/__main__.py @@ -17,15 +17,16 @@ import argparse import os import subprocess +import sys +import tempfile from .config import parse_config_file from .main import build_snapshot from .path_utils import get_react_native_dir +from .snapshot_diff import check_snapshots DOXYGEN_CONFIG_FILE = ".doxygen.config.generated" -RUN_ON_REACT_NATIVE = False - def build_doxygen_config( directory: str, @@ -75,10 +76,11 @@ def build_snapshot_for_view( exclude_patterns: list[str], definitions: dict[str, str | int], output_dir: str, + verbose: bool = True, ) -> None: - print(f"Generating API view: {api_view}") - # Generate the Doxygen config file - print("Generating Doxygen config file") + if verbose: + print(f"Generating API view: {api_view}") + print("Generating Doxygen config file") build_doxygen_config( react_native_dir, @@ -89,10 +91,12 @@ def build_snapshot_for_view( # If there is already a doxygen output directory, delete it if os.path.exists(os.path.join(react_native_dir, "api")): - print("Deleting existing output directory") + if verbose: + print("Deleting existing output directory") subprocess.run(["rm", "-rf", os.path.join(react_native_dir, "api")]) - print("Running Doxygen") + if verbose: + print("Running Doxygen") # Run doxygen with the config file doxygen_bin = os.environ.get("DOXYGEN_BIN", "doxygen") @@ -105,12 +109,15 @@ def build_snapshot_for_view( # Check the result if result.returncode != 0: - print(f"Doxygen finished with error: {result.stderr}") + if verbose: + print(f"Doxygen finished with error: {result.stderr}") else: - print("Doxygen finished successfully") + if verbose: + print("Doxygen finished successfully") # Delete the Doxygen config file - print("Deleting Doxygen config file") + if verbose: + print("Deleting Doxygen config file") subprocess.run(["rm", DOXYGEN_CONFIG_FILE], cwd=react_native_dir) # build snapshot, convert to string, and save to file @@ -124,10 +131,7 @@ def build_snapshot_for_view( f.write("// @" + "generated by scripts/cxx-api\n\n") f.write(snapshot_string) - print(f"Snapshot written to: {os.path.abspath(output_file)}") - - if not RUN_ON_REACT_NATIVE: - print(snapshot_string) + return snapshot_string def main(): @@ -144,29 +148,46 @@ def main(): type=str, help="Path to codegen generated code", ) + parser.add_argument( + "--check", + action="store_true", + help="Generate snapshots to a temp directory and compare against committed ones", + ) + parser.add_argument( + "--snapshot-dir", + type=str, + help="Directory containing committed snapshots for comparison (used with --check)", + ) + parser.add_argument( + "--test", + action="store_true", + help="Run on the local test directory instead of the react-native directory", + ) args = parser.parse_args() + verbose = not args.check + doxygen_bin = os.environ.get("DOXYGEN_BIN", "doxygen") version_result = subprocess.run( [doxygen_bin, "--version"], capture_output=True, text=True, ) - print(f"Using Doxygen {version_result.stdout.strip()} ({doxygen_bin})") + if verbose: + print(f"Using Doxygen {version_result.stdout.strip()} ({doxygen_bin})") # Define the path to the react-native directory - react_native_dir = ( + react_native_package_dir = ( os.path.join(get_react_native_dir(), "packages", "react-native") - if RUN_ON_REACT_NATIVE + if not args.test else os.path.join(get_react_native_dir(), "scripts", "cxx-api", "manual_test") ) - print(f"Running in directory: {react_native_dir}") + if verbose: + print(f"Running in directory: {react_native_package_dir}") - if args.codegen_path: + if verbose and args.codegen_path: print(f"Codegen output path: {os.path.abspath(args.codegen_path)}") - output_dir = args.output_dir if args.output_dir else react_native_dir - # Parse config file config_path = os.path.join( get_react_native_dir(), "scripts", "cxx-api", "config.yml" @@ -177,25 +198,53 @@ def main(): codegen_path=args.codegen_path, ) - if RUN_ON_REACT_NATIVE: - for config in snapshot_configs: - build_snapshot_for_view( - api_view=config.snapshot_name, - react_native_dir=react_native_dir, - include_directories=config.inputs, - exclude_patterns=config.exclude_patterns, - definitions=config.definitions, + def build_snapshots(output_dir: str, verbose: bool) -> None: + if not args.test: + for config in snapshot_configs: + build_snapshot_for_view( + api_view=config.snapshot_name, + react_native_dir=react_native_package_dir, + include_directories=config.inputs, + exclude_patterns=config.exclude_patterns, + definitions=config.definitions, + output_dir=output_dir, + verbose=verbose, + ) + else: + snapshot = build_snapshot_for_view( + api_view="Test", + react_native_dir=react_native_package_dir, + include_directories=[], + exclude_patterns=[], + definitions={}, output_dir=output_dir, + verbose=verbose, ) + + if verbose: + print(snapshot) + + if args.check: + with tempfile.TemporaryDirectory() as tmpdir: + build_snapshots(tmpdir, verbose=False) + + snapshot_dir = args.snapshot_dir or os.path.join( + get_react_native_dir(), "scripts", "cxx-api", "api-snapshots" + ) + + if not check_snapshots(tmpdir, snapshot_dir): + sys.exit(1) + + print("All snapshot checks passed") else: - build_snapshot_for_view( - api_view="Test", - react_native_dir=react_native_dir, - include_directories=[], - exclude_patterns=[], - definitions={}, - output_dir=output_dir, + output_dir = ( + args.output_dir + if args.output_dir + else os.path.join( + get_react_native_dir(), "scripts", "cxx-api", "api-snapshots" + ) ) + build_snapshots(output_dir, verbose=True) if __name__ == "__main__": diff --git a/scripts/cxx-api/parser/snapshot_diff.py b/scripts/cxx-api/parser/snapshot_diff.py new file mode 100644 index 00000000000..c97f750ea5d --- /dev/null +++ b/scripts/cxx-api/parser/snapshot_diff.py @@ -0,0 +1,73 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Utilities for comparing API snapshots. +""" + +import difflib +import os + + +def check_snapshots(generated_dir: str, committed_dir: str) -> bool: + """Compare generated snapshots against committed ones. + + Returns True if check passes (snapshots match or no committed snapshots). + Returns False if snapshots differ. + """ + if not os.path.isdir(committed_dir): + print(f"No committed snapshots directory found at: {committed_dir}") + print("Skipping comparison (no baseline to compare against)") + return True + + committed_files = sorted(f for f in os.listdir(committed_dir) if f.endswith(".api")) + generated_files = sorted(f for f in os.listdir(generated_dir) if f.endswith(".api")) + + if not committed_files: + print("No committed snapshot files found") + print("Skipping comparison (no baseline to compare against)") + return True + + committed_set = set(committed_files) + generated_set = set(generated_files) + all_passed = True + + for filename in sorted(committed_set | generated_set): + committed_path = os.path.join(committed_dir, filename) + generated_path = os.path.join(generated_dir, filename) + + if filename not in generated_set: + print( + f"FAIL: {filename} exists in committed snapshots but was not generated" + ) + all_passed = False + continue + + if filename not in committed_set: + print(f"OK: {filename} generated (no committed baseline)") + continue + + with open(committed_path) as f: + committed_content = f.read() + with open(generated_path) as f: + generated_content = f.read() + + if committed_content == generated_content: + print(f"OK: {filename} matches committed snapshot") + else: + print(f"FAIL: {filename} differs from committed snapshot") + diff = "\n".join( + difflib.unified_diff( + committed_content.splitlines(), + generated_content.splitlines(), + fromfile=f"committed/{filename}", + tofile=f"generated/{filename}", + lineterm="", + ) + ) + print(diff) + all_passed = False + + return all_passed From 2f6c744f014b0eef4b5a8da3042283e9a8f3f829 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 5 Mar 2026 00:40:46 -0800 Subject: [PATCH 071/595] Reland: Wire native CSS parsing for fontVariant (#55881) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55881 ## Reland No changes. This was on the same stack as D95032494 which was backed out due to bug. ## Original Gate `processFontVariant` behind `enableNativeCSSParsing()`. When the flag is on, CSS font-variant strings like `"small-caps oldstyle-nums"` are parsed natively using the existing CSS font-variant parser instead of being preprocessed in JS. Also removes `react_native_expect(false)` hard error on unknown font variant values, replacing it with a graceful skip. Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D95021048 fbshipit-source-id: e75ce199565c7de3b883a95c61e5e534c2018cba --- .../View/ReactNativeStyleAttributes.js | 6 +- .../renderer/attributedstring/conversions.h | 106 +++++++++++++++++- .../components/view/tests/ConversionsTest.cpp | 26 +++++ 3 files changed, 135 insertions(+), 3 deletions(-) diff --git a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js index ac54183bb55..ba4e727d86c 100644 --- a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js +++ b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js @@ -67,6 +67,10 @@ export const transformOriginAttribute: AnyAttributeType = nativeCSSParsing ? true : {process: processTransformOrigin}; +export const fontVariantAttribute: AnyAttributeType = nativeCSSParsing + ? true + : {process: processFontVariant}; + const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = { /** * Layout @@ -248,7 +252,7 @@ const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = { fontFamily: true, fontSize: true, fontStyle: true, - fontVariant: {process: processFontVariant}, + fontVariant: fontVariantAttribute, fontWeight: true, includeFontPadding: true, letterSpacing: true, diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h index 5635a692b17..a509abfab57 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -21,6 +22,8 @@ #include #include #include +#include +#include #include #ifdef RN_SERIALIZABLE_STATE @@ -317,7 +320,73 @@ inline std::string toString(const FontStyle &fontStyle) return "normal"; } -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, FontVariant &result) +inline std::optional fontVariantFromCSSFontVariant(CSSFontVariant cssVariant) +{ + switch (cssVariant) { + case CSSFontVariant::SmallCaps: + return FontVariant::SmallCaps; + case CSSFontVariant::OldstyleNums: + return FontVariant::OldstyleNums; + case CSSFontVariant::LiningNums: + return FontVariant::LiningNums; + case CSSFontVariant::TabularNums: + return FontVariant::TabularNums; + case CSSFontVariant::ProportionalNums: + return FontVariant::ProportionalNums; + case CSSFontVariant::StylisticOne: + return FontVariant::StylisticOne; + case CSSFontVariant::StylisticTwo: + return FontVariant::StylisticTwo; + case CSSFontVariant::StylisticThree: + return FontVariant::StylisticThree; + case CSSFontVariant::StylisticFour: + return FontVariant::StylisticFour; + case CSSFontVariant::StylisticFive: + return FontVariant::StylisticFive; + case CSSFontVariant::StylisticSix: + return FontVariant::StylisticSix; + case CSSFontVariant::StylisticSeven: + return FontVariant::StylisticSeven; + case CSSFontVariant::StylisticEight: + return FontVariant::StylisticEight; + case CSSFontVariant::StylisticNine: + return FontVariant::StylisticNine; + case CSSFontVariant::StylisticTen: + return FontVariant::StylisticTen; + case CSSFontVariant::StylisticEleven: + return FontVariant::StylisticEleven; + case CSSFontVariant::StylisticTwelve: + return FontVariant::StylisticTwelve; + case CSSFontVariant::StylisticThirteen: + return FontVariant::StylisticThirteen; + case CSSFontVariant::StylisticFourteen: + return FontVariant::StylisticFourteen; + case CSSFontVariant::StylisticFifteen: + return FontVariant::StylisticFifteen; + case CSSFontVariant::StylisticSixteen: + return FontVariant::StylisticSixteen; + case CSSFontVariant::StylisticSeventeen: + return FontVariant::StylisticSeventeen; + case CSSFontVariant::StylisticEighteen: + return FontVariant::StylisticEighteen; + case CSSFontVariant::StylisticNineteen: + return FontVariant::StylisticNineteen; + case CSSFontVariant::StylisticTwenty: + return FontVariant::StylisticTwenty; + case CSSFontVariant::CommonLigatures: + case CSSFontVariant::NoCommonLigatures: + case CSSFontVariant::DiscretionaryLigatures: + case CSSFontVariant::NoDiscretionaryLigatures: + case CSSFontVariant::HistoricalLigatures: + case CSSFontVariant::NoHistoricalLigatures: + case CSSFontVariant::Contextual: + case CSSFontVariant::NoContextual: + return std::nullopt; + } +} + +inline void +parseProcessedFontVariant(const PropsParserContext & /*context*/, const RawValue &value, FontVariant &result) { result = FontVariant::Default; react_native_expect(value.hasType>()); @@ -376,7 +445,6 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu result = (FontVariant)((int)result | (int)FontVariant::StylisticTwenty); } else { LOG(ERROR) << "Unsupported FontVariant value: " << item; - react_native_expect(false); } } } else { @@ -384,6 +452,40 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu } } +inline void parseUnprocessedFontVariantString(const std::string &value, FontVariant &result) +{ + auto fontVariantList = parseCSSProperty(value); + if (!std::holds_alternative(fontVariantList)) { + result = FontVariant::Default; + return; + } + + result = FontVariant::Default; + for (const auto &cssVariant : std::get(fontVariantList)) { + if (auto fv = fontVariantFromCSSFontVariant(cssVariant)) { + result = (FontVariant)((int)result | (int)*fv); + } + } +} + +inline void parseUnprocessedFontVariant(const PropsParserContext &context, const RawValue &value, FontVariant &result) +{ + if (value.hasType()) { + parseUnprocessedFontVariantString((std::string)value, result); + } else { + parseProcessedFontVariant(context, value, result); + } +} + +inline void fromRawValue(const PropsParserContext &context, const RawValue &value, FontVariant &result) +{ + if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + parseUnprocessedFontVariant(context, value, result); + } else { + parseProcessedFontVariant(context, value, result); + } +} + inline std::string toString(const FontVariant &fontVariant) { auto result = std::string{}; diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp index c784ecfd3ed..e3c716415c5 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp @@ -7,6 +7,7 @@ #include +#include #include #include #include @@ -454,4 +455,29 @@ TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string_with_z) { EXPECT_EQ(result.z, 15.0f); } +TEST(ConversionsTest, unprocessed_font_variant_string_single) { + FontVariant result{}; + parseUnprocessedFontVariantString("small-caps", result); + + EXPECT_EQ((int)result, (int)FontVariant::SmallCaps); +} + +TEST(ConversionsTest, unprocessed_font_variant_string_multiple) { + FontVariant result{}; + parseUnprocessedFontVariantString( + "small-caps oldstyle-nums tabular-nums", result); + + EXPECT_EQ( + (int)result, + (int)FontVariant::SmallCaps | (int)FontVariant::OldstyleNums | + (int)FontVariant::TabularNums); +} + +TEST(ConversionsTest, unprocessed_font_variant_string_invalid) { + FontVariant result{}; + parseUnprocessedFontVariantString("not-a-variant", result); + + EXPECT_EQ((int)result, (int)FontVariant::Default); +} + } // namespace facebook::react From a7ad793e32d4f61b4911605fb856c6aeef766069 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 5 Mar 2026 00:40:46 -0800 Subject: [PATCH 072/595] Reland: Wire native CSS parsing for aspectRatio (#55882) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55882 ## Reland `convertRawProp` for `yoga::Style` did not preserve `sourceValue.aspectRatio()` when `aspectRatio` was absent from the raw props diff. This caused `aspectRatio` to silently reset to undefined whenever any other prop was updated on a component that had `aspectRatio` set. Fixed by adding an else-branch fallback to `sourceValue.aspectRatio()`: ``` { const auto *rawValue = rawProps.at("aspectRatio", nullptr, nullptr); if (rawValue != nullptr) { yogaStyle.setAspectRatio(rawValue->hasValue() ? convertAspectRatio(context, *rawValue) : yogaStyle.aspectRatio()); + } else { + yogaStyle.setAspectRatio(sourceValue.aspectRatio()); } } ``` Added `clonedPropsPreserveAspectRatio` test in ViewTest.cpp to verify aspectRatio survives a prop clone with empty RawProps. ## Original Gate `processAspectRatio` behind `enableNativeCSSParsing()`. When the flag is on, CSS ratio strings like `"16/9"` and number strings are parsed natively using the existing CSS ratio parser instead of being preprocessed in JS. The parsing is done in `fromRawValue(... FloatOptional &)` — string values are only sent for aspectRatio; other FloatOptional yoga props never receive strings from JS. Changelog: [Internal] Reviewed By: javache Differential Revision: D95032494 fbshipit-source-id: f3c9724628d8ea7e570d1c91ddc38a6b59146070 --- .../View/ReactNativeStyleAttributes.js | 6 +- .../Components/View/__tests__/View-itest.js | 95 +++++++++++++++++++ .../components/view/YogaStylableProps.cpp | 61 ++++++------ .../renderer/components/view/conversions.h | 17 ++++ .../components/view/propsConversions.h | 10 +- .../components/view/tests/ConversionsTest.cpp | 60 ++++++++++++ .../components/view/tests/ViewTest.cpp | 34 +++++++ 7 files changed, 252 insertions(+), 31 deletions(-) diff --git a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js index ba4e727d86c..ba345e117ca 100644 --- a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js +++ b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js @@ -71,6 +71,10 @@ export const fontVariantAttribute: AnyAttributeType = nativeCSSParsing ? true : {process: processFontVariant}; +export const aspectRatioAttribute: AnyAttributeType = nativeCSSParsing + ? true + : {process: processAspectRatio}; + const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = { /** * Layout @@ -78,7 +82,7 @@ const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = { alignContent: true, alignItems: true, alignSelf: true, - aspectRatio: {process: processAspectRatio}, + aspectRatio: aspectRatioAttribute, borderBottomWidth: true, borderEndWidth: true, borderLeftWidth: true, diff --git a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js index 267d683170f..af0268dcafc 100644 --- a/packages/react-native/Libraries/Components/View/__tests__/View-itest.js +++ b/packages/react-native/Libraries/Components/View/__tests__/View-itest.js @@ -231,6 +231,101 @@ describe('', () => { }); }); + describe('aspectRatio', () => { + it('is preserved when updating an unrelated prop', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + , + ); + }); + + // width=100, aspectRatio=2 → height = 100 / 2 = 50 + expect( + root + .getRenderedOutput({ + includeLayoutMetrics: true, + props: ['layoutMetrics-frame'], + }) + .toJSX(), + ).toEqual( + , + ); + + // Update only nativeID, not aspectRatio + Fantom.runTask(() => { + root.render( + , + ); + }); + + // aspectRatio must still be preserved → same layout + expect( + root + .getRenderedOutput({ + includeLayoutMetrics: true, + props: ['layoutMetrics-frame'], + }) + .toJSX(), + ).toEqual( + , + ); + }); + + it('can be changed to undefined after initially having a value', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + , + ); + }); + + // width=100, aspectRatio=2 → height = 100 / 2 = 50 + expect( + root + .getRenderedOutput({ + includeLayoutMetrics: true, + props: ['layoutMetrics-frame'], + }) + .toJSX(), + ).toEqual( + , + ); + + // Update aspectRatio to undefined + Fantom.runTask(() => { + root.render( + , + ); + }); + + // aspectRatio is now undefined → height collapses to 0 + expect( + root + .getRenderedOutput({ + includeLayoutMetrics: true, + props: ['layoutMetrics-frame'], + }) + .toJSX(), + ).toEqual( + , + ); + }); + }); + describe('background-image', () => { it('it parses CSS and object syntax', () => { const root = Fantom.createRoot(); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp index 0e2529c1e5a..ae2da15fc0a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp @@ -147,35 +147,40 @@ void YogaStylableProps::setProp( REBUILD_FIELD_SWITCH_CASE_YSP(flexBasis, setFlexBasis); REBUILD_FIELD_SWITCH_CASE2(positionType, setPositionType, "position"); REBUILD_FIELD_YG_GUTTER(gap, setGap, "rowGap", "columnGap", "gap"); - REBUILD_FIELD_SWITCH_CASE_YSP(aspectRatio, setAspectRatio); - REBUILD_FIELD_SWITCH_CASE_YSP(boxSizing, setBoxSizing); - REBUILD_FIELD_YG_DIMENSION(dimension, setDimension, "width", "height"); - REBUILD_FIELD_YG_DIMENSION( - minDimension, setMinDimension, "minWidth", "minHeight"); - REBUILD_FIELD_YG_DIMENSION( - maxDimension, setMaxDimension, "maxWidth", "maxHeight"); - REBUILD_FIELD_YG_EDGES_POSITION(); - REBUILD_FIELD_YG_EDGES(margin, setMargin, "margin", ""); - REBUILD_FIELD_YG_EDGES(padding, setPadding, "padding", ""); - REBUILD_FIELD_YG_EDGES(border, setBorder, "border", "Width"); + case CONSTEXPR_RAW_PROPS_KEY_HASH("aspectRatio"): { + yogaStyle.setAspectRatio( + value.hasValue() ? convertAspectRatio(context, value) + : ygDefaults.aspectRatio()); + return; + } + REBUILD_FIELD_SWITCH_CASE_YSP(boxSizing, setBoxSizing); + REBUILD_FIELD_YG_DIMENSION(dimension, setDimension, "width", "height"); + REBUILD_FIELD_YG_DIMENSION( + minDimension, setMinDimension, "minWidth", "minHeight"); + REBUILD_FIELD_YG_DIMENSION( + maxDimension, setMaxDimension, "maxWidth", "maxHeight"); + REBUILD_FIELD_YG_EDGES_POSITION(); + REBUILD_FIELD_YG_EDGES(margin, setMargin, "margin", ""); + REBUILD_FIELD_YG_EDGES(padding, setPadding, "padding", ""); + REBUILD_FIELD_YG_EDGES(border, setBorder, "border", "Width"); - // Aliases - RAW_SET_PROP_SWITCH_CASE(insetBlockEnd, "insetBlockEnd"); - RAW_SET_PROP_SWITCH_CASE(insetBlockStart, "insetBlockStart"); - RAW_SET_PROP_SWITCH_CASE(insetInlineEnd, "insetInlineEnd"); - RAW_SET_PROP_SWITCH_CASE(insetInlineStart, "insetInlineStart"); - RAW_SET_PROP_SWITCH_CASE(marginInline, "marginInline"); - RAW_SET_PROP_SWITCH_CASE(marginInlineStart, "marginInlineStart"); - RAW_SET_PROP_SWITCH_CASE(marginInlineEnd, "marginInlineEnd"); - RAW_SET_PROP_SWITCH_CASE(marginBlock, "marginBlock"); - RAW_SET_PROP_SWITCH_CASE(marginBlockStart, "marginBlockStart"); - RAW_SET_PROP_SWITCH_CASE(marginBlockEnd, "marginBlockEnd"); - RAW_SET_PROP_SWITCH_CASE(paddingInline, "paddingInline"); - RAW_SET_PROP_SWITCH_CASE(paddingInlineStart, "paddingInlineStart"); - RAW_SET_PROP_SWITCH_CASE(paddingInlineEnd, "paddingInlineEnd"); - RAW_SET_PROP_SWITCH_CASE(paddingBlock, "paddingBlock"); - RAW_SET_PROP_SWITCH_CASE(paddingBlockStart, "paddingBlockStart"); - RAW_SET_PROP_SWITCH_CASE(paddingBlockEnd, "paddingBlockEnd"); + // Aliases + RAW_SET_PROP_SWITCH_CASE(insetBlockEnd, "insetBlockEnd"); + RAW_SET_PROP_SWITCH_CASE(insetBlockStart, "insetBlockStart"); + RAW_SET_PROP_SWITCH_CASE(insetInlineEnd, "insetInlineEnd"); + RAW_SET_PROP_SWITCH_CASE(insetInlineStart, "insetInlineStart"); + RAW_SET_PROP_SWITCH_CASE(marginInline, "marginInline"); + RAW_SET_PROP_SWITCH_CASE(marginInlineStart, "marginInlineStart"); + RAW_SET_PROP_SWITCH_CASE(marginInlineEnd, "marginInlineEnd"); + RAW_SET_PROP_SWITCH_CASE(marginBlock, "marginBlock"); + RAW_SET_PROP_SWITCH_CASE(marginBlockStart, "marginBlockStart"); + RAW_SET_PROP_SWITCH_CASE(marginBlockEnd, "marginBlockEnd"); + RAW_SET_PROP_SWITCH_CASE(paddingInline, "paddingInline"); + RAW_SET_PROP_SWITCH_CASE(paddingInlineStart, "paddingInlineStart"); + RAW_SET_PROP_SWITCH_CASE(paddingInlineEnd, "paddingInlineEnd"); + RAW_SET_PROP_SWITCH_CASE(paddingBlock, "paddingBlock"); + RAW_SET_PROP_SWITCH_CASE(paddingBlockStart, "paddingBlockStart"); + RAW_SET_PROP_SWITCH_CASE(paddingBlockEnd, "paddingBlockEnd"); } } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h index 929fe68cd58..1e211befa2d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h @@ -498,6 +498,23 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu result = value.hasType() ? yoga::FloatOptional((float)value) : yoga::FloatOptional(); } +inline yoga::FloatOptional convertAspectRatio(const PropsParserContext & /*context*/, const RawValue &value) +{ + if (value.hasType()) { + return yoga::FloatOptional((float)value); + } + if (ReactNativeFeatureFlags::enableNativeCSSParsing() && value.hasType()) { + auto ratio = parseCSSProperty((std::string)value); + if (std::holds_alternative(ratio)) { + auto r = std::get(ratio); + if (!r.isDegenerate()) { + return yoga::FloatOptional(r.numerator / r.denominator); + } + } + } + return {}; +} + inline std::optional toRadians(const RawValue &value) { if (value.hasType()) { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h index 410fde1b56d..985a3bbffb8 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h @@ -356,8 +356,14 @@ convertRawProp(const PropsParserContext &context, const RawProps &rawProps, cons yoga::Dimension::Height, convertRawProp(context, rawProps, "maxHeight", sourceValue.maxDimension(yoga::Dimension::Height), {})); - yogaStyle.setAspectRatio( - convertRawProp(context, rawProps, "aspectRatio", sourceValue.aspectRatio(), yogaStyle.aspectRatio())); + { + const auto *rawValue = rawProps.at("aspectRatio", nullptr, nullptr); + if (rawValue != nullptr) { + yogaStyle.setAspectRatio(rawValue->hasValue() ? convertAspectRatio(context, *rawValue) : yogaStyle.aspectRatio()); + } else { + yogaStyle.setAspectRatio(sourceValue.aspectRatio()); + } + } yogaStyle.setBoxSizing( convertRawProp(context, rawProps, "boxSizing", sourceValue.boxSizing(), yogaStyle.boxSizing())); diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp index e3c716415c5..a96a75aef75 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp @@ -480,4 +480,64 @@ TEST(ConversionsTest, unprocessed_font_variant_string_invalid) { EXPECT_EQ((int)result, (int)FontVariant::Default); } +TEST(ConversionsTest, convert_aspect_ratio_float) { + RawValue value{folly::dynamic(1.5)}; + auto result = + convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value); + + EXPECT_FALSE(result.isUndefined()); + EXPECT_EQ(result.unwrap(), 1.5f); +} + +TEST(ConversionsTest, convert_aspect_ratio_ratio_string) { + // CSSRatio parses "16/9" as {numerator: 16, denominator: 9} + auto ratio = parseCSSProperty("16/9"); + ASSERT_TRUE(std::holds_alternative(ratio)); + auto r = std::get(ratio); + EXPECT_FALSE(r.isDegenerate()); + EXPECT_NEAR(r.numerator / r.denominator, 16.0f / 9.0f, 0.001f); +} + +TEST(ConversionsTest, convert_aspect_ratio_number_string) { + // CSSRatio parses "1.5" as {numerator: 1.5, denominator: 1.0} + auto ratio = parseCSSProperty("1.5"); + ASSERT_TRUE(std::holds_alternative(ratio)); + auto r = std::get(ratio); + EXPECT_FALSE(r.isDegenerate()); + EXPECT_EQ(r.numerator / r.denominator, 1.5f); +} + +TEST(ConversionsTest, convert_aspect_ratio_degenerate) { + auto ratio = parseCSSProperty("0/0"); + ASSERT_TRUE(std::holds_alternative(ratio)); + EXPECT_TRUE(std::get(ratio).isDegenerate()); +} + +TEST(ConversionsTest, float_optional_from_rawvalue_float) { + RawValue value{folly::dynamic(1.5)}; + yoga::FloatOptional result; + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); + + EXPECT_FALSE(result.isUndefined()); + EXPECT_EQ(result.unwrap(), 1.5f); +} + +TEST(ConversionsTest, float_optional_undefined_for_non_float) { + RawValue value{folly::dynamic(nullptr)}; + yoga::FloatOptional result; + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); + + EXPECT_TRUE(result.isUndefined()); +} + +TEST(ConversionsTest, float_optional_undefined_for_string) { + // fromRawValue for FloatOptional does not parse strings — + // that is handled by convertAspectRatio specifically. + RawValue value{folly::dynamic("16/9")}; + yoga::FloatOptional result; + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); + + EXPECT_TRUE(result.isUndefined()); +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewTest.cpp index c6d426ac558..82c363b8d79 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ViewTest.cpp @@ -19,6 +19,7 @@ #include #include +#include namespace facebook::react { @@ -229,4 +230,37 @@ TEST_F(YogaDirtyFlagTest, updatingStateForScrollViewMistNotDirtyYogaNode) { static_cast(*newRootShadowNode).layoutIfNeeded()); } +TEST_F(YogaDirtyFlagTest, clonedPropsPreserveAspectRatio) { + ContextContainer contextContainer{}; + PropsParserContext parserContext{-1, contextContainer}; + + /* + * Cloning props with empty RawProps must preserve aspectRatio set on the + * source props. + */ + auto newRootShadowNode = rootShadowNode_->cloneTree( + innerShadowNode_->getFamily(), [&](const ShadowNode& oldShadowNode) { + // First clone: set aspectRatio to 1.5 + auto viewProps = std::make_shared(); + viewProps->yogaStyle.setAspectRatio(yoga::FloatOptional(1.5f)); + auto nodeWithAspectRatio = + oldShadowNode.clone(ShadowNodeFragment{.props = viewProps}); + + // Second clone: clone props with empty RawProps (simulating a prop + // update that does not touch aspectRatio) + auto& componentDescriptor = + nodeWithAspectRatio->getComponentDescriptor(); + auto clonedProps = componentDescriptor.cloneProps( + parserContext, nodeWithAspectRatio->getProps(), RawProps()); + + auto& clonedViewProps = + static_cast(*clonedProps); + EXPECT_TRUE(clonedViewProps.yogaStyle.aspectRatio().isDefined()); + EXPECT_EQ(clonedViewProps.yogaStyle.aspectRatio().unwrap(), 1.5f); + + return nodeWithAspectRatio->clone( + ShadowNodeFragment{.props = clonedProps}); + }); +} + } // namespace facebook::react From 1f69a3972a08393385ec8479f03d1994a696d460 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Thu, 5 Mar 2026 03:26:12 -0800 Subject: [PATCH 073/595] Fix running all test-all jobs outside PRs (#55917) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55917 As a defensive initial design, conditional Android/iOS job runs for `test-all` were intended to be scoped to PRs only, however required a missing `== 'true'` match specifier. Fixing this will help us catch rare integration-conflict failures on `main`, at the appropriate commit. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D95042221 fbshipit-source-id: ffa23651c9b8c18939ccbd7ab2279243690944d2 --- .github/workflows/test-all.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index b7a0873bfe6..5e98d69fe10 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -37,9 +37,9 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'facebook/react-native' outputs: - any_code_change: ${{ steps.filter_exclusions.outputs.any_code_change || github.event_name != 'pull_request' }} - should_test_android: ${{ steps.filter_exclusions.outputs.should_test_android || github.event_name != 'pull_request' }} - should_test_ios: ${{ steps.filter_exclusions.outputs.should_test_ios || github.event_name != 'pull_request' }} + any_code_change: ${{ steps.filter_exclusions.outputs.any_code_change == 'true' || github.event_name != 'pull_request' }} + should_test_android: ${{ steps.filter_exclusions.outputs.should_test_android == 'true' || github.event_name != 'pull_request' }} + should_test_ios: ${{ steps.filter_exclusions.outputs.should_test_ios == 'true' || github.event_name != 'pull_request' }} debugger_shell: ${{ steps.filter_inclusions.outputs.debugger_shell }} steps: - name: Checkout From 26cef6414d911f7dc022b5251ebdd7800e4cf21a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nishan=20=28o=5E=E2=96=BD=5Eo=29?= Date: Thu, 5 Mar 2026 04:11:46 -0800 Subject: [PATCH 074/595] CSS Grid 1/9: Grid style types and public API (#55876) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55876 - Add foundational data types, enums, style properties, and C API for expressing CSS Grid layouts - Includes `GridLine.h`, `GridTrack.h`, `GridTrackType.h`, `Display::Grid`, new alignment enums (`Align::Start/End`, `Justify::Auto/Stretch/Start/End`) - C API: `YGGridTrackList.h/cpp`, `YGNodeStyle` grid setters/getters - Layout helper updates, `Node.h` `relativePosition` made public Split from https://github.com/facebook/yoga/issues/1865. Part of the CSS Grid implementation series. Changelog: [Internal] X-link: https://github.com/facebook/yoga/pull/1893 Reviewed By: sammy-SC Differential Revision: D94867121 Pulled By: NickGerleman fbshipit-source-id: adcb6d107cdd782550a614f87f84cff3ecefd806 --- packages/react-native/React/Views/RCTLayout.m | 7 +- .../java/com/facebook/yoga/YogaAlign.java | 6 +- .../java/com/facebook/yoga/YogaDisplay.java | 4 +- .../com/facebook/yoga/YogaGridTrackType.java | 39 +++ .../java/com/facebook/yoga/YogaJustify.java | 32 ++- .../renderer/components/view/conversions.h | 2 + .../react/renderer/core/LayoutMetrics.cpp | 8 +- .../react/renderer/core/LayoutPrimitives.h | 1 + .../react/renderer/core/conversions.h | 4 + .../ReactCommon/yoga/yoga/YGEnums.cpp | 30 ++ .../ReactCommon/yoga/yoga/YGEnums.h | 21 +- .../ReactCommon/yoga/yoga/YGNodeStyle.cpp | 267 ++++++++++++++++++ .../ReactCommon/yoga/yoga/YGNodeStyle.h | 94 +++++- .../yoga/yoga/algorithm/AbsoluteLayout.cpp | 48 +++- .../ReactCommon/yoga/yoga/algorithm/Align.h | 13 +- .../yoga/yoga/algorithm/CalculateLayout.cpp | 24 +- .../yoga/yoga/algorithm/CalculateLayout.h | 22 ++ .../ReactCommon/yoga/yoga/enums/Align.h | 4 +- .../ReactCommon/yoga/yoga/enums/Display.h | 3 +- .../yoga/yoga/enums/GridTrackType.h | 43 +++ .../ReactCommon/yoga/yoga/enums/Justify.h | 6 +- .../ReactCommon/yoga/yoga/event/event.cpp | 2 + .../ReactCommon/yoga/yoga/event/event.h | 1 + .../ReactCommon/yoga/yoga/node/Node.h | 8 +- .../ReactCommon/yoga/yoga/style/GridLine.h | 53 ++++ .../ReactCommon/yoga/yoga/style/GridTrack.h | 63 +++++ .../ReactCommon/yoga/yoga/style/Style.h | 136 ++++++++- .../yoga/yoga/style/StyleSizeLength.h | 8 +- 28 files changed, 902 insertions(+), 47 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaGridTrackType.java create mode 100644 packages/react-native/ReactCommon/yoga/yoga/enums/GridTrackType.h create mode 100644 packages/react-native/ReactCommon/yoga/yoga/style/GridLine.h create mode 100644 packages/react-native/ReactCommon/yoga/yoga/style/GridTrack.h diff --git a/packages/react-native/React/Views/RCTLayout.m b/packages/react-native/React/Views/RCTLayout.m index 944b728684c..356866a420c 100644 --- a/packages/react-native/React/Views/RCTLayout.m +++ b/packages/react-native/React/Views/RCTLayout.m @@ -128,11 +128,12 @@ RCTDisplayType RCTReactDisplayTypeFromYogaDisplayType(YGDisplay displayType) { switch (displayType) { case YGDisplayFlex: + case YGDisplayContents: + case YGDisplayGrid: return RCTDisplayTypeFlex; case YGDisplayNone: return RCTDisplayTypeNone; - case YGDisplayContents: - RCTAssert(NO, @"YGDisplayContents cannot be converted to RCTDisplayType value."); - return RCTDisplayTypeNone; + default: + return RCTDisplayTypeFlex; } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaAlign.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaAlign.java index 00535154fca..6f1c4565818 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaAlign.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaAlign.java @@ -18,7 +18,9 @@ public enum YogaAlign { BASELINE(5), SPACE_BETWEEN(6), SPACE_AROUND(7), - SPACE_EVENLY(8); + SPACE_EVENLY(8), + START(9), + END(10); private final int mIntValue; @@ -41,6 +43,8 @@ public static YogaAlign fromInt(int value) { case 6: return SPACE_BETWEEN; case 7: return SPACE_AROUND; case 8: return SPACE_EVENLY; + case 9: return START; + case 10: return END; default: throw new IllegalArgumentException("Unknown enum value: " + value); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaDisplay.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaDisplay.java index 4dae871936e..8e7e0f83cd9 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaDisplay.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaDisplay.java @@ -12,7 +12,8 @@ public enum YogaDisplay { FLEX(0), NONE(1), - CONTENTS(2); + CONTENTS(2), + GRID(3); private final int mIntValue; @@ -29,6 +30,7 @@ public static YogaDisplay fromInt(int value) { case 0: return FLEX; case 1: return NONE; case 2: return CONTENTS; + case 3: return GRID; default: throw new IllegalArgumentException("Unknown enum value: " + value); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaGridTrackType.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaGridTrackType.java new file mode 100644 index 00000000000..e3d22d25be3 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaGridTrackType.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// @generated by enums.py + +package com.facebook.yoga; + +public enum YogaGridTrackType { + AUTO(0), + POINTS(1), + PERCENT(2), + FR(3), + MINMAX(4); + + private final int mIntValue; + + YogaGridTrackType(int intValue) { + mIntValue = intValue; + } + + public int intValue() { + return mIntValue; + } + + public static YogaGridTrackType fromInt(int value) { + switch (value) { + case 0: return AUTO; + case 1: return POINTS; + case 2: return PERCENT; + case 3: return FR; + case 4: return MINMAX; + default: throw new IllegalArgumentException("Unknown enum value: " + value); + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaJustify.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaJustify.java index 4be1ed71d39..778238ec663 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaJustify.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaJustify.java @@ -10,12 +10,16 @@ package com.facebook.yoga; public enum YogaJustify { - FLEX_START(0), - CENTER(1), - FLEX_END(2), - SPACE_BETWEEN(3), - SPACE_AROUND(4), - SPACE_EVENLY(5); + AUTO(0), + FLEX_START(1), + CENTER(2), + FLEX_END(3), + SPACE_BETWEEN(4), + SPACE_AROUND(5), + SPACE_EVENLY(6), + STRETCH(7), + START(8), + END(9); private final int mIntValue; @@ -29,12 +33,16 @@ public int intValue() { public static YogaJustify fromInt(int value) { switch (value) { - case 0: return FLEX_START; - case 1: return CENTER; - case 2: return FLEX_END; - case 3: return SPACE_BETWEEN; - case 4: return SPACE_AROUND; - case 5: return SPACE_EVENLY; + case 0: return AUTO; + case 1: return FLEX_START; + case 2: return CENTER; + case 3: return FLEX_END; + case 4: return SPACE_BETWEEN; + case 5: return SPACE_AROUND; + case 6: return SPACE_EVENLY; + case 7: return STRETCH; + case 8: return START; + case 9: return END; default: throw new IllegalArgumentException("Unknown enum value: " + value); } } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h index 1e211befa2d..4d9a0a1b4b1 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h @@ -133,6 +133,8 @@ inline DisplayType displayTypeFromYGDisplay(YGDisplay display) return DisplayType::Contents; case YGDisplayFlex: return DisplayType::Flex; + case YGDisplayGrid: + return DisplayType::Grid; } } diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutMetrics.cpp b/packages/react-native/ReactCommon/react/renderer/core/LayoutMetrics.cpp index a7add9fd041..a0cf58c74dd 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutMetrics.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutMetrics.cpp @@ -44,9 +44,11 @@ std::vector getDebugProps( ",bottom:" + getDebugDescription(object.overflowInset.bottom, {}) + ",left:" + getDebugDescription(object.overflowInset.left, {}) + "}"}, {.name = "displayType", - .value = object.displayType == DisplayType::None - ? "None" - : (object.displayType == DisplayType::Flex ? "Flex" : "Inline")}, + .value = object.displayType == DisplayType::None ? "None" + : object.displayType == DisplayType::Flex ? "Flex" + : object.displayType == DisplayType::Grid ? "Grid" + : object.displayType == DisplayType::Contents ? "Contents" + : "Unknown"}, {.name = "layoutDirection", .value = object.layoutDirection == LayoutDirection::Undefined ? "Undefined" diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutPrimitives.h b/packages/react-native/ReactCommon/react/renderer/core/LayoutPrimitives.h index d2e50ff7355..f5ac9f04f09 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutPrimitives.h +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutPrimitives.h @@ -20,6 +20,7 @@ enum class DisplayType { None = 0, Flex = 1, Contents = 2, + Grid = 3, }; enum class PositionType { diff --git a/packages/react-native/ReactCommon/react/renderer/core/conversions.h b/packages/react-native/ReactCommon/react/renderer/core/conversions.h index 74796174353..d40427c40de 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/core/conversions.h @@ -44,6 +44,8 @@ inline int toInt(const DisplayType &displayType) return 1; case DisplayType::Contents: return 2; + case DisplayType::Grid: + return 3; } } @@ -56,6 +58,8 @@ inline std::string toString(const DisplayType &displayType) return "flex"; case DisplayType::Contents: return "contents"; + case DisplayType::Grid: + return "grid"; } } diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp index 3e63b509b7e..233a1e78bcc 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.cpp @@ -29,6 +29,10 @@ const char* YGAlignToString(const YGAlign value) { return "space-around"; case YGAlignSpaceEvenly: return "space-evenly"; + case YGAlignStart: + return "start"; + case YGAlignEnd: + return "end"; } return "unknown"; } @@ -73,6 +77,8 @@ const char* YGDisplayToString(const YGDisplay value) { return "none"; case YGDisplayContents: return "contents"; + case YGDisplayGrid: + return "grid"; } return "unknown"; } @@ -143,6 +149,22 @@ const char* YGFlexDirectionToString(const YGFlexDirection value) { return "unknown"; } +const char* YGGridTrackTypeToString(const YGGridTrackType value) { + switch (value) { + case YGGridTrackTypeAuto: + return "auto"; + case YGGridTrackTypePoints: + return "points"; + case YGGridTrackTypePercent: + return "percent"; + case YGGridTrackTypeFr: + return "fr"; + case YGGridTrackTypeMinmax: + return "minmax"; + } + return "unknown"; +} + const char* YGGutterToString(const YGGutter value) { switch (value) { case YGGutterColumn: @@ -157,6 +179,8 @@ const char* YGGutterToString(const YGGutter value) { const char* YGJustifyToString(const YGJustify value) { switch (value) { + case YGJustifyAuto: + return "auto"; case YGJustifyFlexStart: return "flex-start"; case YGJustifyCenter: @@ -169,6 +193,12 @@ const char* YGJustifyToString(const YGJustify value) { return "space-around"; case YGJustifySpaceEvenly: return "space-evenly"; + case YGJustifyStretch: + return "stretch"; + case YGJustifyStart: + return "start"; + case YGJustifyEnd: + return "end"; } return "unknown"; } diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h index c0bc7a04e4c..b9f66a06278 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGEnums.h @@ -22,7 +22,9 @@ YG_ENUM_DECL( YGAlignBaseline, YGAlignSpaceBetween, YGAlignSpaceAround, - YGAlignSpaceEvenly) + YGAlignSpaceEvenly, + YGAlignStart, + YGAlignEnd) YG_ENUM_DECL( YGBoxSizing, @@ -44,7 +46,8 @@ YG_ENUM_DECL( YGDisplay, YGDisplayFlex, YGDisplayNone, - YGDisplayContents) + YGDisplayContents, + YGDisplayGrid) YG_ENUM_DECL( YGEdge, @@ -80,6 +83,14 @@ YG_ENUM_DECL( YGFlexDirectionRow, YGFlexDirectionRowReverse) +YG_ENUM_DECL( + YGGridTrackType, + YGGridTrackTypeAuto, + YGGridTrackTypePoints, + YGGridTrackTypePercent, + YGGridTrackTypeFr, + YGGridTrackTypeMinmax) + YG_ENUM_DECL( YGGutter, YGGutterColumn, @@ -88,12 +99,16 @@ YG_ENUM_DECL( YG_ENUM_DECL( YGJustify, + YGJustifyAuto, YGJustifyFlexStart, YGJustifyCenter, YGJustifyFlexEnd, YGJustifySpaceBetween, YGJustifySpaceAround, - YGJustifySpaceEvenly) + YGJustifySpaceEvenly, + YGJustifyStretch, + YGJustifyStart, + YGJustifyEnd) YG_ENUM_DECL( YGLogLevel, diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.cpp index 4e77405b6c7..8bfa58c6c0b 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace facebook; using namespace facebook::yoga; @@ -74,6 +75,24 @@ YGJustify YGNodeStyleGetJustifyContent(const YGNodeConstRef node) { return unscopedEnum(resolveRef(node)->style().justifyContent()); } +void YGNodeStyleSetJustifyItems(YGNodeRef node, const YGJustify justifyItems) { + updateStyle<&Style::justifyItems, &Style::setJustifyItems>( + node, scopedEnum(justifyItems)); +} + +YGJustify YGNodeStyleGetJustifyItems(const YGNodeConstRef node) { + return unscopedEnum(resolveRef(node)->style().justifyItems()); +} + +void YGNodeStyleSetJustifySelf(YGNodeRef node, const YGJustify justifySelf) { + updateStyle<&Style::justifySelf, &Style::setJustifySelf>( + node, scopedEnum(justifySelf)); +} + +YGJustify YGNodeStyleGetJustifySelf(const YGNodeConstRef node) { + return unscopedEnum(resolveRef(node)->style().justifySelf()); +} + void YGNodeStyleSetAlignContent( const YGNodeRef node, const YGAlign alignContent) { @@ -503,3 +522,251 @@ void YGNodeStyleSetMaxHeightStretch(const YGNodeRef node) { YGValue YGNodeStyleGetMaxHeight(const YGNodeConstRef node) { return (YGValue)resolveRef(node)->style().maxDimension(Dimension::Height); } + +// Grid Item Placement Properties + +void YGNodeStyleSetGridColumnStart(YGNodeRef node, int32_t gridColumnStart) { + updateStyle<&Style::gridColumnStart, &Style::setGridColumnStart>( + node, GridLine::fromInteger(gridColumnStart)); +} + +void YGNodeStyleSetGridColumnStartAuto(YGNodeRef node) { + updateStyle<&Style::gridColumnStart, &Style::setGridColumnStart>( + node, GridLine::auto_()); +} + +void YGNodeStyleSetGridColumnStartSpan(YGNodeRef node, int32_t span) { + updateStyle<&Style::gridColumnStart, &Style::setGridColumnStart>( + node, GridLine::span(span)); +} + +int32_t YGNodeStyleGetGridColumnStart(YGNodeConstRef node) { + const auto& gridLine = resolveRef(node)->style().gridColumnStart(); + return gridLine.isInteger() ? gridLine.integer : 0; +} + +void YGNodeStyleSetGridColumnEnd(YGNodeRef node, int32_t gridColumnEnd) { + updateStyle<&Style::gridColumnEnd, &Style::setGridColumnEnd>( + node, GridLine::fromInteger(gridColumnEnd)); +} + +void YGNodeStyleSetGridColumnEndAuto(YGNodeRef node) { + updateStyle<&Style::gridColumnEnd, &Style::setGridColumnEnd>( + node, GridLine::auto_()); +} + +void YGNodeStyleSetGridColumnEndSpan(YGNodeRef node, int32_t span) { + updateStyle<&Style::gridColumnEnd, &Style::setGridColumnEnd>( + node, GridLine::span(span)); +} + +int32_t YGNodeStyleGetGridColumnEnd(YGNodeConstRef node) { + const auto& gridLine = resolveRef(node)->style().gridColumnEnd(); + return gridLine.isInteger() ? gridLine.integer : 0; +} + +void YGNodeStyleSetGridRowStart(YGNodeRef node, int32_t gridRowStart) { + updateStyle<&Style::gridRowStart, &Style::setGridRowStart>( + node, GridLine::fromInteger(gridRowStart)); +} + +void YGNodeStyleSetGridRowStartAuto(YGNodeRef node) { + updateStyle<&Style::gridRowStart, &Style::setGridRowStart>( + node, GridLine::auto_()); +} + +void YGNodeStyleSetGridRowStartSpan(YGNodeRef node, int32_t span) { + updateStyle<&Style::gridRowStart, &Style::setGridRowStart>( + node, GridLine::span(span)); +} + +int32_t YGNodeStyleGetGridRowStart(YGNodeConstRef node) { + const auto& gridLine = resolveRef(node)->style().gridRowStart(); + return gridLine.isInteger() ? gridLine.integer : 0; +} + +void YGNodeStyleSetGridRowEnd(YGNodeRef node, int32_t gridRowEnd) { + updateStyle<&Style::gridRowEnd, &Style::setGridRowEnd>( + node, GridLine::fromInteger(gridRowEnd)); +} + +void YGNodeStyleSetGridRowEndAuto(YGNodeRef node) { + updateStyle<&Style::gridRowEnd, &Style::setGridRowEnd>( + node, GridLine::auto_()); +} + +void YGNodeStyleSetGridRowEndSpan(YGNodeRef node, int32_t span) { + updateStyle<&Style::gridRowEnd, &Style::setGridRowEnd>( + node, GridLine::span(span)); +} + +int32_t YGNodeStyleGetGridRowEnd(YGNodeConstRef node) { + const auto& gridLine = resolveRef(node)->style().gridRowEnd(); + return gridLine.isInteger() ? gridLine.integer : 0; +} + +// Grid Container Properties + +namespace { + +GridTrackSize gridTrackSizeFromTypeAndValue(YGGridTrackType type, float value) { + switch (type) { + case YGGridTrackTypePoints: + return GridTrackSize::length(value); + case YGGridTrackTypePercent: + return GridTrackSize::percent(value); + case YGGridTrackTypeFr: + return GridTrackSize::fr(value); + case YGGridTrackTypeAuto: + return GridTrackSize::auto_(); + case YGGridTrackTypeMinmax: + return GridTrackSize::auto_(); + } +} + +StyleSizeLength styleSizeLengthFromTypeAndValue( + YGGridTrackType type, + float value) { + switch (type) { + case YGGridTrackTypePoints: + return StyleSizeLength::points(value); + case YGGridTrackTypePercent: + return StyleSizeLength::percent(value); + case YGGridTrackTypeFr: + return StyleSizeLength::stretch(value); + case YGGridTrackTypeAuto: + return StyleSizeLength::ofAuto(); + case YGGridTrackTypeMinmax: + return StyleSizeLength::ofAuto(); + } +} + +} // namespace + +// GridTemplateColumns + +void YGNodeStyleSetGridTemplateColumnsCount(YGNodeRef node, size_t count) { + resolveRef(node)->style().resizeGridTemplateColumns(count); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridTemplateColumn( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value) { + resolveRef(node)->style().setGridTemplateColumnAt( + index, gridTrackSizeFromTypeAndValue(type, value)); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridTemplateColumnMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue) { + resolveRef(node)->style().setGridTemplateColumnAt( + index, + GridTrackSize::minmax( + styleSizeLengthFromTypeAndValue(minType, minValue), + styleSizeLengthFromTypeAndValue(maxType, maxValue))); + resolveRef(node)->markDirtyAndPropagate(); +} + +// GridTemplateRows + +void YGNodeStyleSetGridTemplateRowsCount(YGNodeRef node, size_t count) { + resolveRef(node)->style().resizeGridTemplateRows(count); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridTemplateRow( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value) { + resolveRef(node)->style().setGridTemplateRowAt( + index, gridTrackSizeFromTypeAndValue(type, value)); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridTemplateRowMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue) { + resolveRef(node)->style().setGridTemplateRowAt( + index, + GridTrackSize::minmax( + styleSizeLengthFromTypeAndValue(minType, minValue), + styleSizeLengthFromTypeAndValue(maxType, maxValue))); + resolveRef(node)->markDirtyAndPropagate(); +} + +// GridAutoColumns + +void YGNodeStyleSetGridAutoColumnsCount(YGNodeRef node, size_t count) { + resolveRef(node)->style().resizeGridAutoColumns(count); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridAutoColumn( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value) { + resolveRef(node)->style().setGridAutoColumnAt( + index, gridTrackSizeFromTypeAndValue(type, value)); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridAutoColumnMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue) { + resolveRef(node)->style().setGridAutoColumnAt( + index, + GridTrackSize::minmax( + styleSizeLengthFromTypeAndValue(minType, minValue), + styleSizeLengthFromTypeAndValue(maxType, maxValue))); + resolveRef(node)->markDirtyAndPropagate(); +} + +// GridAutoRows + +void YGNodeStyleSetGridAutoRowsCount(YGNodeRef node, size_t count) { + resolveRef(node)->style().resizeGridAutoRows(count); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridAutoRow( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value) { + resolveRef(node)->style().setGridAutoRowAt( + index, gridTrackSizeFromTypeAndValue(type, value)); + resolveRef(node)->markDirtyAndPropagate(); +} + +void YGNodeStyleSetGridAutoRowMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue) { + resolveRef(node)->style().setGridAutoRowAt( + index, + GridTrackSize::minmax( + styleSizeLengthFromTypeAndValue(minType, minValue), + styleSizeLengthFromTypeAndValue(maxType, maxValue))); + resolveRef(node)->markDirtyAndPropagate(); +} diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.h b/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.h index 21b8326d854..a1c7e09561f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNodeStyle.h @@ -8,7 +8,7 @@ #pragma once #include - +#include #include #include @@ -29,6 +29,14 @@ YG_EXPORT void YGNodeStyleSetJustifyContent( YGJustify justifyContent); YG_EXPORT YGJustify YGNodeStyleGetJustifyContent(YGNodeConstRef node); +YG_EXPORT void YGNodeStyleSetJustifyItems( + YGNodeRef node, + YGJustify justifyItems); +YG_EXPORT YGJustify YGNodeStyleGetJustifyItems(YGNodeConstRef node); + +YG_EXPORT void YGNodeStyleSetJustifySelf(YGNodeRef node, YGJustify justifySelf); +YG_EXPORT YGJustify YGNodeStyleGetJustifySelf(YGNodeConstRef node); + YG_EXPORT void YGNodeStyleSetAlignContent(YGNodeRef node, YGAlign alignContent); YG_EXPORT YGAlign YGNodeStyleGetAlignContent(YGNodeConstRef node); @@ -148,4 +156,88 @@ YG_EXPORT YGValue YGNodeStyleGetMaxHeight(YGNodeConstRef node); YG_EXPORT void YGNodeStyleSetAspectRatio(YGNodeRef node, float aspectRatio); YG_EXPORT float YGNodeStyleGetAspectRatio(YGNodeConstRef node); +// Grid Item Properties +YG_EXPORT void YGNodeStyleSetGridColumnStart( + YGNodeRef node, + int gridColumnStart); +YG_EXPORT void YGNodeStyleSetGridColumnStartAuto(YGNodeRef node); +YG_EXPORT void YGNodeStyleSetGridColumnStartSpan(YGNodeRef node, int span); +YG_EXPORT int YGNodeStyleGetGridColumnStart(YGNodeConstRef node); + +YG_EXPORT void YGNodeStyleSetGridColumnEnd(YGNodeRef node, int gridColumnEnd); +YG_EXPORT void YGNodeStyleSetGridColumnEndAuto(YGNodeRef node); +YG_EXPORT void YGNodeStyleSetGridColumnEndSpan(YGNodeRef node, int span); +YG_EXPORT int YGNodeStyleGetGridColumnEnd(YGNodeConstRef node); + +YG_EXPORT void YGNodeStyleSetGridRowStart(YGNodeRef node, int gridRowStart); +YG_EXPORT void YGNodeStyleSetGridRowStartAuto(YGNodeRef node); +YG_EXPORT void YGNodeStyleSetGridRowStartSpan(YGNodeRef node, int span); +YG_EXPORT int YGNodeStyleGetGridRowStart(YGNodeConstRef node); + +YG_EXPORT void YGNodeStyleSetGridRowEnd(YGNodeRef node, int gridRowEnd); +YG_EXPORT void YGNodeStyleSetGridRowEndAuto(YGNodeRef node); +YG_EXPORT void YGNodeStyleSetGridRowEndSpan(YGNodeRef node, int span); +YG_EXPORT int YGNodeStyleGetGridRowEnd(YGNodeConstRef node); + +// Grid Container Properties +YG_EXPORT void YGNodeStyleSetGridTemplateColumnsCount( + YGNodeRef node, + size_t count); +YG_EXPORT void YGNodeStyleSetGridTemplateColumn( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value); +YG_EXPORT void YGNodeStyleSetGridTemplateColumnMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue); + +YG_EXPORT void YGNodeStyleSetGridTemplateRowsCount( + YGNodeRef node, + size_t count); +YG_EXPORT void YGNodeStyleSetGridTemplateRow( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value); +YG_EXPORT void YGNodeStyleSetGridTemplateRowMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue); + +YG_EXPORT void YGNodeStyleSetGridAutoColumnsCount(YGNodeRef node, size_t count); +YG_EXPORT void YGNodeStyleSetGridAutoColumn( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value); +YG_EXPORT void YGNodeStyleSetGridAutoColumnMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue); + +YG_EXPORT void YGNodeStyleSetGridAutoRowsCount(YGNodeRef node, size_t count); +YG_EXPORT void YGNodeStyleSetGridAutoRow( + YGNodeRef node, + size_t index, + YGGridTrackType type, + float value); +YG_EXPORT void YGNodeStyleSetGridAutoRowMinMax( + YGNodeRef node, + size_t index, + YGGridTrackType minType, + float minValue, + YGGridTrackType maxType, + float maxValue); + YG_EXTERN_C_END diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp b/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp index b2d8d8dbefc..181dfcb1b0d 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp @@ -23,7 +23,11 @@ static inline void setFlexStartLayoutPosition( axis, direction, containingBlockWidth) + parent->getLayout().border(flexStartEdge(axis)); - if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) { + // https://www.w3.org/TR/css-grid-1/#abspos + // absolute positioned grid items are positioned relative to the padding edge + // of the grid container + if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding) && + parent->style().display() != Display::Grid) { position += parent->getLayout().padding(flexStartEdge(axis)); } @@ -40,7 +44,11 @@ static inline void setFlexEndLayoutPosition( child->style().computeFlexEndMargin( axis, direction, containingBlockWidth); - if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) { + // https://www.w3.org/TR/css-grid-1/#abspos + // absolute positioned grid items are positioned relative to the padding edge + // of the grid container + if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding) && + parent->style().display() != Display::Grid) { flexEndPosition += parent->getLayout().padding(flexEndEdge(axis)); } @@ -60,7 +68,11 @@ static inline void setCenterLayoutPosition( parent->getLayout().border(flexStartEdge(axis)) - parent->getLayout().border(flexEndEdge(axis)); - if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) { + // https://www.w3.org/TR/css-grid-1/#abspos + // absolute positioned grid items are positioned relative to the padding edge + // of the grid container + if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding) && + parent->style().display() != Display::Grid) { parentContentBoxSize -= parent->getLayout().padding(flexStartEdge(axis)); parentContentBoxSize -= parent->getLayout().padding(flexEndEdge(axis)); } @@ -74,7 +86,11 @@ static inline void setCenterLayoutPosition( child->style().computeFlexStartMargin( axis, direction, containingBlockWidth); - if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding)) { + // https://www.w3.org/TR/css-grid-1/#abspos + // absolute positioned grid items are positioned relative to the padding edge + // of the grid container + if (!child->hasErrata(Errata::AbsolutePositionWithoutInsetsExcludesPadding) && + parent->style().display() != Display::Grid) { position += parent->getLayout().padding(flexStartEdge(axis)); } @@ -87,13 +103,19 @@ static void justifyAbsoluteChild( const Direction direction, const FlexDirection mainAxis, const float containingBlockWidth) { - const Justify parentJustifyContent = parent->style().justifyContent(); - switch (parentJustifyContent) { + const Justify justify = parent->style().display() == Display::Grid + ? resolveChildJustification(parent, child) + : parent->style().justifyContent(); + switch (justify) { + case Justify::Start: + case Justify::Auto: + case Justify::Stretch: case Justify::FlexStart: case Justify::SpaceBetween: setFlexStartLayoutPosition( parent, child, direction, mainAxis, containingBlockWidth); break; + case Justify::End: case Justify::FlexEnd: setFlexEndLayoutPosition( parent, child, direction, mainAxis, containingBlockWidth); @@ -124,6 +146,7 @@ static void alignAbsoluteChild( } switch (itemAlign) { + case Align::Start: case Align::Auto: case Align::FlexStart: case Align::Baseline: @@ -134,6 +157,7 @@ static void alignAbsoluteChild( setFlexStartLayoutPosition( parent, child, direction, crossAxis, containingBlockWidth); break; + case Align::End: case Align::FlexEnd: setFlexEndLayoutPosition( parent, child, direction, crossAxis, containingBlockWidth); @@ -234,9 +258,15 @@ void layoutAbsoluteChild( LayoutData& layoutMarkerData, const uint32_t depth, const uint32_t generationCount) { - const FlexDirection mainAxis = - resolveDirection(node->style().flexDirection(), direction); - const FlexDirection crossAxis = resolveCrossDirection(mainAxis, direction); + // For grid containers, use inline (Row) and block (Column) axes for + // positioning, since grid alignment properties (justify-self, align-self) + // operate on inline/block axes, not main/cross axes based on flex-direction. + const FlexDirection mainAxis = node->style().display() == Display::Grid + ? resolveDirection(FlexDirection::Row, direction) + : resolveDirection(node->style().flexDirection(), direction); + const FlexDirection crossAxis = node->style().display() == Display::Grid + ? FlexDirection::Column + : resolveCrossDirection(mainAxis, direction); const bool isMainAxisRow = isRow(mainAxis); float childWidth = YGUndefined; diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/Align.h b/packages/react-native/ReactCommon/yoga/yoga/algorithm/Align.h index bb21fe5dcaf..b12ae7fd532 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/Align.h +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/Align.h @@ -20,12 +20,23 @@ inline Align resolveChildAlignment( const Align align = child->style().alignSelf() == Align::Auto ? node->style().alignItems() : child->style().alignSelf(); - if (align == Align::Baseline && isColumn(node->style().flexDirection())) { + + if (node->style().display() == Display::Flex && align == Align::Baseline && + isColumn(node->style().flexDirection())) { return Align::FlexStart; } + return align; } +inline Justify resolveChildJustification( + const yoga::Node* node, + const yoga::Node* child) { + return child->style().justifySelf() == Justify::Auto + ? node->style().justifyItems() + : child->style().justifySelf(); +} + /** * Fallback alignment to use on overflow * https://www.w3.org/TR/css-align-3/#distribution-values diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp index 5e9350b2f9e..a9bcaf78d0e 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp @@ -35,7 +35,7 @@ namespace facebook::yoga { std::atomic gCurrentGenerationCount(0); -static void constrainMaxSizeForMode( +void constrainMaxSizeForMode( const yoga::Node* node, Direction direction, FlexDirection axis, @@ -509,7 +509,7 @@ static bool measureNodeWithFixedSize( return false; } -static void zeroOutLayoutRecursively(yoga::Node* const node) { +void zeroOutLayoutRecursively(yoga::Node* const node) { node->getLayout() = {}; node->setLayoutDimension(0, Dimension::Width); node->setLayoutDimension(0, Dimension::Height); @@ -521,7 +521,7 @@ static void zeroOutLayoutRecursively(yoga::Node* const node) { } } -static void cleanupContentsNodesRecursively(yoga::Node* const node) { +void cleanupContentsNodesRecursively(yoga::Node* const node) { if (node->hasContentsChildren()) [[unlikely]] { node->cloneContentsChildrenIfNeeded(); for (auto child : node->getChildren()) { @@ -539,7 +539,7 @@ static void cleanupContentsNodesRecursively(yoga::Node* const node) { } } -static float calculateAvailableInnerDimension( +float calculateAvailableInnerDimension( const yoga::Node* const node, const Direction direction, const Dimension dimension, @@ -1089,6 +1089,14 @@ static void justifyMainAxis( if (flexLine.numberOfAutoMargins == 0) { switch (justifyContent) { + case Justify::Start: + case Justify::End: + case Justify::Auto: + // No-Op + break; + case Justify::Stretch: + // No-Op + break; case Justify::Center: leadingMainDim = flexLine.layout.remainingFreeSpace / 2; break; @@ -1886,6 +1894,10 @@ static void calculateLayoutImpl( : fallbackAlignment(node->style().alignContent()); switch (alignContent) { + case Align::Start: + case Align::End: + // No-Op + break; case Align::FlexEnd: currentLead += remainingAlignContentDim; break; @@ -1973,6 +1985,10 @@ static void calculateLayoutImpl( } if (child->style().positionType() != PositionType::Absolute) { switch (resolveChildAlignment(node, child)) { + case Align::Start: + case Align::End: + // Not yet implemented + break; case Align::FlexStart: { child->setLayoutPosition( currentLead + diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h index 5e6884ec1a4..2314bce0e46 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h @@ -35,4 +35,26 @@ bool calculateLayoutInternal( uint32_t depth, uint32_t generationCount); +void constrainMaxSizeForMode( + const yoga::Node* node, + Direction direction, + FlexDirection axis, + float ownerAxisSize, + float ownerWidth, + /*in_out*/ SizingMode* mode, + /*in_out*/ float* size); + +float calculateAvailableInnerDimension( + const yoga::Node* const node, + const Direction direction, + const Dimension dimension, + const float availableDim, + float paddingAndBorder, + const float ownerDim, + const float ownerWidth); + +void zeroOutLayoutRecursively(yoga::Node* const node); + +void cleanupContentsNodesRecursively(yoga::Node* const node); + } // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/enums/Align.h b/packages/react-native/ReactCommon/yoga/yoga/enums/Align.h index 3896fe2b8b1..e1b8b29bd74 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/enums/Align.h +++ b/packages/react-native/ReactCommon/yoga/yoga/enums/Align.h @@ -25,11 +25,13 @@ enum class Align : uint8_t { SpaceBetween = YGAlignSpaceBetween, SpaceAround = YGAlignSpaceAround, SpaceEvenly = YGAlignSpaceEvenly, + Start = YGAlignStart, + End = YGAlignEnd, }; template <> constexpr int32_t ordinalCount() { - return 9; + return 11; } constexpr Align scopedEnum(YGAlign unscoped) { diff --git a/packages/react-native/ReactCommon/yoga/yoga/enums/Display.h b/packages/react-native/ReactCommon/yoga/yoga/enums/Display.h index 9bf23c0ac7b..9edbee80b59 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/enums/Display.h +++ b/packages/react-native/ReactCommon/yoga/yoga/enums/Display.h @@ -19,11 +19,12 @@ enum class Display : uint8_t { Flex = YGDisplayFlex, None = YGDisplayNone, Contents = YGDisplayContents, + Grid = YGDisplayGrid, }; template <> constexpr int32_t ordinalCount() { - return 3; + return 4; } constexpr Display scopedEnum(YGDisplay unscoped) { diff --git a/packages/react-native/ReactCommon/yoga/yoga/enums/GridTrackType.h b/packages/react-native/ReactCommon/yoga/yoga/enums/GridTrackType.h new file mode 100644 index 00000000000..eb6e8332bc9 --- /dev/null +++ b/packages/react-native/ReactCommon/yoga/yoga/enums/GridTrackType.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// @generated by enums.py +// clang-format off +#pragma once + +#include +#include +#include + +namespace facebook::yoga { + +enum class GridTrackType : uint8_t { + Auto = YGGridTrackTypeAuto, + Points = YGGridTrackTypePoints, + Percent = YGGridTrackTypePercent, + Fr = YGGridTrackTypeFr, + Minmax = YGGridTrackTypeMinmax, +}; + +template <> +constexpr int32_t ordinalCount() { + return 5; +} + +constexpr GridTrackType scopedEnum(YGGridTrackType unscoped) { + return static_cast(unscoped); +} + +constexpr YGGridTrackType unscopedEnum(GridTrackType scoped) { + return static_cast(scoped); +} + +inline const char* toString(GridTrackType e) { + return YGGridTrackTypeToString(unscopedEnum(e)); +} + +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/enums/Justify.h b/packages/react-native/ReactCommon/yoga/yoga/enums/Justify.h index 255baa6e27d..db4afece9aa 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/enums/Justify.h +++ b/packages/react-native/ReactCommon/yoga/yoga/enums/Justify.h @@ -16,17 +16,21 @@ namespace facebook::yoga { enum class Justify : uint8_t { + Auto = YGJustifyAuto, FlexStart = YGJustifyFlexStart, Center = YGJustifyCenter, FlexEnd = YGJustifyFlexEnd, SpaceBetween = YGJustifySpaceBetween, SpaceAround = YGJustifySpaceAround, SpaceEvenly = YGJustifySpaceEvenly, + Stretch = YGJustifyStretch, + Start = YGJustifyStart, + End = YGJustifyEnd, }; template <> constexpr int32_t ordinalCount() { - return 6; + return 10; } constexpr Justify scopedEnum(YGJustify unscoped) { diff --git a/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp b/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp index e286ded0555..ac6735d6d44 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/event/event.cpp @@ -29,6 +29,8 @@ const char* LayoutPassReasonToString(const LayoutPassReason value) { return "abs_measure"; case LayoutPassReason::kFlexMeasure: return "flex_measure"; + case LayoutPassReason::kGridLayout: + return "grid_layout"; default: return "unknown"; } diff --git a/packages/react-native/ReactCommon/yoga/yoga/event/event.h b/packages/react-native/ReactCommon/yoga/yoga/event/event.h index 587c1cd0636..0d032240dd9 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/event/event.h +++ b/packages/react-native/ReactCommon/yoga/yoga/event/event.h @@ -32,6 +32,7 @@ enum struct LayoutPassReason : int { kMeasureChild = 5, kAbsMeasureChild = 6, kFlexMeasure = 7, + kGridLayout = 8, COUNT }; diff --git a/packages/react-native/ReactCommon/yoga/yoga/node/Node.h b/packages/react-native/ReactCommon/yoga/yoga/node/Node.h index 8068c814973..d22c4c1ef04 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/node/Node.h +++ b/packages/react-native/ReactCommon/yoga/yoga/node/Node.h @@ -294,15 +294,15 @@ class YG_EXPORT Node : public ::YGNode { bool isNodeFlexible(); void reset(); - private: - // Used to allow resetting the node - Node& operator=(Node&&) noexcept = default; - float relativePosition( FlexDirection axis, Direction direction, float axisSize) const; + private: + // Used to allow resetting the node + Node& operator=(Node&&) noexcept = default; + void useWebDefaults() { style_.setFlexDirection(FlexDirection::Row); style_.setAlignContent(Align::Stretch); diff --git a/packages/react-native/ReactCommon/yoga/yoga/style/GridLine.h b/packages/react-native/ReactCommon/yoga/yoga/style/GridLine.h new file mode 100644 index 00000000000..0a06c0dfa01 --- /dev/null +++ b/packages/react-native/ReactCommon/yoga/yoga/style/GridLine.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include + +namespace facebook::yoga { + +// https://www.w3.org/TR/css-grid-1/#typedef-grid-row-start-grid-line +enum class GridLineType : uint8_t { + Auto, + Integer, + Span, +}; + +struct GridLine { + GridLineType type{}; + // Line position (1, 2, -1, -2, etc) + int32_t integer{}; + + constexpr static GridLine auto_() { + return GridLine{.type = GridLineType::Auto, .integer = 0}; + } + + constexpr static GridLine fromInteger(int32_t value) { + return GridLine{.type = GridLineType::Integer, .integer = value}; + } + + constexpr static GridLine span(int32_t value) { + return GridLine{.type = GridLineType::Span, .integer = value}; + } + + constexpr bool isAuto() const { + return type == GridLineType::Auto; + } + + constexpr bool isInteger() const { + return type == GridLineType::Integer; + } + + constexpr bool isSpan() const { + return type == GridLineType::Span; + } + + bool operator==(const GridLine& other) const = default; +}; + +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/style/GridTrack.h b/packages/react-native/ReactCommon/yoga/yoga/style/GridTrack.h new file mode 100644 index 00000000000..2a2bafb50c6 --- /dev/null +++ b/packages/react-native/ReactCommon/yoga/yoga/style/GridTrack.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include +#include + +namespace facebook::yoga { +// https://www.w3.org/TR/css-grid-1/#typedef-track-size +struct GridTrackSize { + StyleSizeLength minSizingFunction; + StyleSizeLength maxSizingFunction; + + // These are used in the grid layout algorithm when distributing spaces among + // tracks + // TODO: maybe move them to TrackSizing since these are track states + float baseSize = 0.0f; + float growthLimit = 0.0f; + bool infinitelyGrowable = false; + + // Static factory methods for common cases + constexpr static GridTrackSize auto_() { + return GridTrackSize{ + .minSizingFunction = StyleSizeLength::ofAuto(), + .maxSizingFunction = StyleSizeLength::ofAuto()}; + } + + constexpr static GridTrackSize length(float points) { + auto len = StyleSizeLength::points(points); + return GridTrackSize{.minSizingFunction = len, .maxSizingFunction = len}; + } + + constexpr static GridTrackSize fr(float fraction) { + // Flex sizing function is always a max sizing function + return GridTrackSize{ + .minSizingFunction = StyleSizeLength::ofAuto(), + .maxSizingFunction = StyleSizeLength::stretch(fraction)}; + } + + constexpr static GridTrackSize percent(float percentage) { + return GridTrackSize{ + .minSizingFunction = StyleSizeLength::percent(percentage), + .maxSizingFunction = StyleSizeLength::percent(percentage)}; + } + + constexpr static GridTrackSize minmax( + StyleSizeLength min, + StyleSizeLength max) { + return GridTrackSize{.minSizingFunction = min, .maxSizingFunction = max}; + } + + bool operator==(const GridTrackSize& other) const = default; +}; + +// Grid track list for grid-template-rows/columns properties +using GridTrackList = std::vector; + +} // namespace facebook::yoga diff --git a/packages/react-native/ReactCommon/yoga/yoga/style/Style.h b/packages/react-native/ReactCommon/yoga/yoga/style/Style.h index bea3d379924..eedeaba2e50 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/style/Style.h +++ b/packages/react-native/ReactCommon/yoga/yoga/style/Style.h @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -65,6 +67,20 @@ class YG_EXPORT Style { justifyContent_ = value; } + Justify justifyItems() const { + return justifyItems_; + } + void setJustifyItems(Justify value) { + justifyItems_ = value; + } + + Justify justifySelf() const { + return justifySelf_; + } + void setJustifySelf(Justify value) { + justifySelf_ = value; + } + Align alignContent() const { return alignContent_; } @@ -191,6 +207,88 @@ class YG_EXPORT Style { pool_.store(minDimensions_[yoga::to_underlying(axis)], value); } + // Grid Container Properties + const GridTrackList& gridTemplateColumns() const { + return gridTemplateColumns_; + } + void setGridTemplateColumns(GridTrackList value) { + gridTemplateColumns_ = std::move(value); + } + void resizeGridTemplateColumns(size_t count) { + gridTemplateColumns_.resize(count); + } + void setGridTemplateColumnAt(size_t index, GridTrackSize value) { + gridTemplateColumns_[index] = value; + } + + const GridTrackList& gridTemplateRows() const { + return gridTemplateRows_; + } + void setGridTemplateRows(GridTrackList value) { + gridTemplateRows_ = std::move(value); + } + void resizeGridTemplateRows(size_t count) { + gridTemplateRows_.resize(count); + } + void setGridTemplateRowAt(size_t index, GridTrackSize value) { + gridTemplateRows_[index] = value; + } + + const GridTrackList& gridAutoColumns() const { + return gridAutoColumns_; + } + void setGridAutoColumns(GridTrackList value) { + gridAutoColumns_ = std::move(value); + } + void resizeGridAutoColumns(size_t count) { + gridAutoColumns_.resize(count); + } + void setGridAutoColumnAt(size_t index, GridTrackSize value) { + gridAutoColumns_[index] = value; + } + + const GridTrackList& gridAutoRows() const { + return gridAutoRows_; + } + void setGridAutoRows(GridTrackList value) { + gridAutoRows_ = std::move(value); + } + void resizeGridAutoRows(size_t count) { + gridAutoRows_.resize(count); + } + void setGridAutoRowAt(size_t index, GridTrackSize value) { + gridAutoRows_[index] = value; + } + + // Grid Item Properties + const GridLine& gridColumnStart() const { + return gridColumnStart_; + } + void setGridColumnStart(GridLine value) { + gridColumnStart_ = value; + } + + const GridLine& gridColumnEnd() const { + return gridColumnEnd_; + } + void setGridColumnEnd(GridLine value) { + gridColumnEnd_ = value; + } + + const GridLine& gridRowStart() const { + return gridRowStart_; + } + void setGridRowStart(GridLine value) { + gridRowStart_ = value; + } + + const GridLine& gridRowEnd() const { + return gridRowEnd_; + } + void setGridRowEnd(GridLine value) { + gridRowEnd_ = value; + } + FloatOptional resolvedMinDimension( Direction direction, Dimension axis, @@ -515,6 +613,12 @@ class YG_EXPORT Style { return maxOrDefined(gap.resolve(ownerSize).unwrap(), 0.0f); } + float computeGapForDimension(Dimension dimension, float ownerSize) const { + auto gap = + dimension == Dimension::Width ? computeColumnGap() : computeRowGap(); + return maxOrDefined(gap.resolve(ownerSize).unwrap(), 0.0f); + } + bool flexStartMarginIsAuto(FlexDirection axis, Direction direction) const { return computeMargin(flexStartEdge(axis), direction).isAuto(); } @@ -523,10 +627,20 @@ class YG_EXPORT Style { return computeMargin(flexEndEdge(axis), direction).isAuto(); } + bool inlineStartMarginIsAuto(FlexDirection axis, Direction direction) const { + return computeMargin(inlineStartEdge(axis, direction), direction).isAuto(); + } + + bool inlineEndMarginIsAuto(FlexDirection axis, Direction direction) const { + return computeMargin(inlineEndEdge(axis, direction), direction).isAuto(); + } + bool operator==(const Style& other) const { return direction_ == other.direction_ && flexDirection_ == other.flexDirection_ && justifyContent_ == other.justifyContent_ && + justifyItems_ == other.justifyItems_ && + justifySelf_ == other.justifySelf_ && alignContent_ == other.alignContent_ && alignItems_ == other.alignItems_ && alignSelf_ == other.alignSelf_ && positionType_ == other.positionType_ && flexWrap_ == other.flexWrap_ && @@ -545,7 +659,15 @@ class YG_EXPORT Style { minDimensions_, pool_, other.minDimensions_, other.pool_) && lengthsEqual( maxDimensions_, pool_, other.maxDimensions_, other.pool_) && - numbersEqual(aspectRatio_, pool_, other.aspectRatio_, other.pool_); + numbersEqual(aspectRatio_, pool_, other.aspectRatio_, other.pool_) && + gridTemplateColumns_ == other.gridTemplateColumns_ && + gridTemplateRows_ == other.gridTemplateRows_ && + gridAutoColumns_ == other.gridAutoColumns_ && + gridAutoRows_ == other.gridAutoRows_ && + gridColumnStart_ == other.gridColumnStart_ && + gridColumnEnd_ == other.gridColumnEnd_ && + gridRowStart_ == other.gridRowStart_ && + gridRowEnd_ == other.gridRowEnd_; } private: @@ -723,6 +845,8 @@ class YG_EXPORT Style { FlexDirection flexDirection_ : bitCount() = FlexDirection::Column; Justify justifyContent_ : bitCount() = Justify::FlexStart; + Justify justifyItems_ : bitCount() = Justify::Stretch; + Justify justifySelf_ : bitCount() = Justify::Auto; Align alignContent_ : bitCount() = Align::FlexStart; Align alignItems_ : bitCount() = Align::Stretch; Align alignSelf_ : bitCount() = Align::Auto; @@ -749,6 +873,16 @@ class YG_EXPORT Style { Dimensions maxDimensions_{}; StyleValueHandle aspectRatio_{}; + // Grid properties + GridTrackList gridTemplateColumns_{}; + GridTrackList gridTemplateRows_{}; + GridTrackList gridAutoColumns_{}; + GridTrackList gridAutoRows_{}; + GridLine gridColumnStart_{}; + GridLine gridColumnEnd_{}; + GridLine gridRowStart_{}; + GridLine gridRowEnd_{}; + StyleValuePool pool_; }; diff --git a/packages/react-native/ReactCommon/yoga/yoga/style/StyleSizeLength.h b/packages/react-native/ReactCommon/yoga/yoga/style/StyleSizeLength.h index fc4d371e421..76e079b2da5 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/style/StyleSizeLength.h +++ b/packages/react-native/ReactCommon/yoga/yoga/style/StyleSizeLength.h @@ -42,6 +42,12 @@ class StyleSizeLength { : StyleSizeLength{FloatOptional{value}, Unit::Percent}; } + constexpr static StyleSizeLength stretch(float fraction) { + return yoga::isUndefined(fraction) || yoga::isinf(fraction) + ? undefined() + : StyleSizeLength{FloatOptional{fraction}, Unit::Stretch}; + } + constexpr static StyleSizeLength ofAuto() { return StyleSizeLength{{}, Unit::Auto}; } @@ -98,7 +104,7 @@ class StyleSizeLength { return value_; } - constexpr FloatOptional resolve(float referenceLength) { + constexpr FloatOptional resolve(float referenceLength) const { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wswitch-enum" From 3cca0d4f3c1379fef5f265422fdf69352897e3b9 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 5 Mar 2026 05:37:15 -0800 Subject: [PATCH 075/595] Remove embind from Yoga JavaScript bindings (#55864) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55864 X-link: https://github.com/facebook/yoga/pull/1906 Yoga's JavaScript bindings previously used Emscripten embind to bridge C++ wrapper classes to JavaScript. This added unnecessary overhead and complexity: JS calls went through embind → C++ wrapper classes (Node.cpp, Config.cpp) → Yoga C API, requiring the embind runtime to be bundled into the WASM output. This diff removes embind entirely. JavaScript now calls Yoga's C API directly, with a thin C bridge (wasm_bridge.c, ~140 lines) handling only what raw C exports cannot: - Struct returns (YGValue) via a static buffer read through HEAPF32/HEAP32 - Measure/dirtied callbacks via EM_JS dispatching to JS-side Maps The JS side (wrapAssembly.ts) is rewritten to use classes (NodeImpl, ConfigImpl) that store a WASM pointer and call C functions directly via `lib._YGFunctionName()`. Tree hierarchy (children/parent) is tracked entirely in JS, matching the pattern used by the Java JNI bindings. The public API shape (Yoga, Node, Config types) remains identical. **Bundle size (SINGLE_FILE base64-embedded WASM):** | Metric | Before (embind) | After (direct C) | Change | |---|---|---|---| | Raw | 126,288 B | 115,370 B | -8.6% | | Gzip | 51,042 B | 42,764 B | -16.2% | **Benchmark results (median of 3 runs):** | Benchmark | Before | After | Change | |---|---|---|---| | Stack with flex | 20ms | 8ms | 2.5x faster | | Align stretch in undefined axis | 19ms | 5ms | 3.8x faster | | Nested flex | 17ms | 4ms | 4.3x faster | | Huge nested layout | 18ms | 5ms | 3.6x faster | Fixes https://github.com/facebook/yoga/issues/1545 Changelog: [Internal] Reviewed By: elicwhite Differential Revision: D95011356 fbshipit-source-id: a936a9e6705aebe66bf7515ccd67cdc0f55ccae2 --- packages/react-native/ReactCommon/yoga/yoga/YGMacros.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h b/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h index a2b6d60efc2..ab9b2627a45 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGMacros.h @@ -29,6 +29,8 @@ #ifdef _WINDLL #define YG_EXPORT __declspec(dllexport) +#elif defined(__EMSCRIPTEN__) +#define YG_EXPORT __attribute__((visibility("default"), used)) #elif !defined(_MSC_VER) #define YG_EXPORT __attribute__((visibility("default"))) #else From 8c763fcce27a3d487238f293633a13e9ba19a996 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Thu, 5 Mar 2026 06:15:48 -0800 Subject: [PATCH 076/595] Restore inspector addPage listener callback (#55925) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55925 Accidentally clobbered in D93247603. This affects the `fuseboxAssertSingleHostState` feature (https://github.com/facebook/react-native-devtools-frontend/pull/218). Changelog: [Internal] Reviewed By: vzaidman Differential Revision: D95365621 fbshipit-source-id: 0df7f7bb33bb6bf6eabe15c8ee06c1761567c84b --- .../ReactCommon/jsinspector-modern/InspectorInterfaces.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp index 39aec6cdb0a..6a08e59e39e 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp @@ -142,6 +142,12 @@ int InspectorImpl::addPage( pageId, Page{pageId, description, vm, std::move(connectFunc), capabilities}); + for (const auto& listenerWeak : listeners_) { + if (auto listener = listenerWeak.lock()) { + listener->unstable_onHostTargetAdded(); + } + } + return pageId; } From 977ad71cab6d11c334f1f440e0121d701faebd55 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Thu, 5 Mar 2026 06:38:08 -0800 Subject: [PATCH 077/595] Avoid spawning a new iOS simulator if one is already booted (#55931) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55931 Changelog: [Internal] Previously, `testRNTesterIOS` would either unconditionally boot a new simulator (local build path) or check only for an exact "iPhone 16 Pro" match (CI artifacts path). This caused a new iOS simulator to always spawn even when one was already open. Extracted a `bootSimulatorIfNeeded` helper that checks for any booted simulator via `xcrun simctl list devices booted` before attempting to boot a new one. Reviewed By: cipolleschi Differential Revision: D95368633 fbshipit-source-id: 858bd235486597b5c9dbb0b904fcd95707b92b13 --- scripts/release-testing/test-release-local.js | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/scripts/release-testing/test-release-local.js b/scripts/release-testing/test-release-local.js index 936f4b7252b..aa1337bbcc9 100644 --- a/scripts/release-testing/test-release-local.js +++ b/scripts/release-testing/test-release-local.js @@ -102,14 +102,7 @@ async function testRNTesterIOS( exec(`unzip ${hermesAppZipPath} -d ${appOutputFolder}`); // boot device - const bootedDevice = String( - exec('xcrun simctl list | grep "iPhone 16 Pro" | grep Booted', { - silent: true, - }), - ).trim(); - if (!bootedDevice || bootedDevice.length === 0) { - exec('xcrun simctl boot "iPhone 16 Pro"'); - } + bootSimulatorIfNeeded(); // install app on device exec(`xcrun simctl install booted ${appOutputFolder}`); @@ -118,12 +111,13 @@ async function testRNTesterIOS( `USE_HERMES=1 CI=${onReleaseBranch.toString()} RCT_NEW_ARCH_ENABLED=1 bundle exec pod install --ansi`, ); + // boot device + bootSimulatorIfNeeded(); + // build the app on iOS simulator exec( 'xcodebuild -workspace RNTesterPods.xcworkspace -scheme RNTester -sdk "iphonesimulator" -destination "generic/platform=iOS Simulator" -derivedDataPath "/tmp/RNTesterBuild"', ); - // boot device - exec('xcrun simctl boot "iPhone 16 Pro"'); // install app on device exec( 'xcrun simctl install booted "/tmp/RNTesterBuild/Build/Products/Debug-iphonesimulator/RNTester.app"', @@ -324,6 +318,18 @@ async function testRNTestProject( popd(); } +function bootSimulatorIfNeeded() { + const bootedDevices = String( + exec('xcrun simctl list devices booted', {silent: true}), + ).trim(); + // Check if there is at least one booted device by looking for a line with a UDID + if (/\([A-F0-9-]+\)/i.test(bootedDevices)) { + console.info('An iOS simulator is already booted, skipping boot.'); + return; + } + exec('xcrun simctl boot "iPhone 16 Pro"'); +} + async function main() { /* * see the test-local-e2e.js script for clean up process From 4c693792241311767897330c71195fa8b46350d1 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Thu, 5 Mar 2026 06:38:08 -0800 Subject: [PATCH 078/595] Boot latest available iOS simulator instead of hardcoded iPhone 16 Pro (#55932) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55932 Changelog: [Internal] When no simulator is already booted, dynamically discover the latest available iOS runtime and boot the first iPhone device under it, instead of hardcoding "iPhone 16 Pro". This uses `xcrun simctl list devices iPhone available -j` to query available devices and picks the last iOS runtime alphabetically (i.e. the newest). Also moved the `bootSimulatorIfNeeded` call before the `xcodebuild` invocation on the local build path, since `xcodebuild -destination "generic/platform=iOS Simulator"` can itself trigger a new simulator boot. Reviewed By: cipolleschi Differential Revision: D95371266 fbshipit-source-id: 0f4e2a476c971e774b6461edbecba4623f6befa6 --- scripts/release-testing/test-release-local.js | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/scripts/release-testing/test-release-local.js b/scripts/release-testing/test-release-local.js index aa1337bbcc9..41f170d3179 100644 --- a/scripts/release-testing/test-release-local.js +++ b/scripts/release-testing/test-release-local.js @@ -327,7 +327,30 @@ function bootSimulatorIfNeeded() { console.info('An iOS simulator is already booted, skipping boot.'); return; } - exec('xcrun simctl boot "iPhone 16 Pro"'); + + // Find the latest available iPhone simulator by picking the last iOS runtime + // and the first iPhone device listed under it. + const devicesJson = JSON.parse( + String( + exec('xcrun simctl list devices iPhone available -j', {silent: true}), + ), + ); + const runtimes = Object.keys(devicesJson.devices) + .filter(r => r.startsWith('com.apple.CoreSimulator.SimRuntime.iOS')) + .sort(); + const latestRuntime = runtimes[runtimes.length - 1]; + const device = + latestRuntime != null + ? devicesJson.devices[latestRuntime].find(d => d.name.includes('iPhone')) + : null; + + if (device != null) { + console.info(`Booting ${device.name} (${latestRuntime})...`); + exec(`xcrun simctl boot "${device.udid}"`); + } else { + console.error('No available iPhone simulator found.'); + process.exit(1); + } } async function main() { From 4423e8575ebdc562040ff36d5a02e6e1b73d6171 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Thu, 5 Mar 2026 06:46:42 -0800 Subject: [PATCH 079/595] Expand Fantom integration tests for FlatList coverage (#55930) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55930 Expand FlatList Fantom tests to improve FlatList.js code coverage from 44% to 62% line coverage. Changelog: [Internal] Reviewed By: zeyap Differential Revision: D94361042 fbshipit-source-id: 4923886eb7adfa5e5513e1e0a58c6b6f6ff72a2a --- .../Lists/__tests__/FlatList-itest.js | 815 +++++++++++++++++- 1 file changed, 803 insertions(+), 12 deletions(-) diff --git a/packages/react-native/Libraries/Lists/__tests__/FlatList-itest.js b/packages/react-native/Libraries/Lists/__tests__/FlatList-itest.js index 9a54004221f..d5816d9f670 100644 --- a/packages/react-native/Libraries/Lists/__tests__/FlatList-itest.js +++ b/packages/react-native/Libraries/Lists/__tests__/FlatList-itest.js @@ -11,9 +11,13 @@ import '@react-native/fantom/src/setUpDefaultReactNativeEnvironment'; import type {FlatListProps} from 'react-native/Libraries/Lists/FlatList'; +import ensureInstance from '../../../src/private/__tests__/utilities/ensureInstance'; import * as Fantom from '@react-native/fantom'; +import nullthrows from 'nullthrows'; import * as React from 'react'; -import {FlatList, Text} from 'react-native'; +import {createRef} from 'react'; +import {FlatList, Text, View} from 'react-native'; +import ReactNativeElement from 'react-native/src/private/webapis/dom/nodes/ReactNativeElement'; function testPropPropagatedToMountingLayer({ propName, @@ -87,17 +91,13 @@ describe('', () => { ); }); - expect( - JSON.stringify(root.getRenderedOutput({props: []}).toJSX()), - ).toEqual( - JSON.stringify( - - - Title Text - Title Text 2 - - , - ), + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Title Text + Title Text 2 + + , ); }); }); @@ -187,4 +187,795 @@ describe('', () => { defaultValue: true, }); }); + + describe('ListHeaderComponent', () => { + it('renders a header before list items', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + {item.title}} + ListHeaderComponent={() => Header} + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + + Header + + Item 1 + + , + ); + }); + }); + + describe('ListFooterComponent', () => { + it('renders a footer after list items', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + {item.title}} + ListFooterComponent={() => Footer} + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Item 1 + Footer + + , + ); + }); + }); + + describe('ListEmptyComponent', () => { + it('renders the empty component when data is empty', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + should not render} + ListEmptyComponent={() => No items} + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + No items + + , + ); + }); + + it('does not render the empty component when data has items', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + {item.title}} + ListEmptyComponent={() => No items} + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Item 1 + + , + ); + }); + }); + + describe('numColumns', () => { + it('lays out items in a grid when numColumns > 1', () => { + const root = Fantom.createRoot({ + viewportWidth: 400, + viewportHeight: 600, + }); + Fantom.runTask(() => { + root.render( + ( + + )} + />, + ); + }); + + // Items 1 and 2 share the first row (each 200px wide), + // item 3 is alone on the second row (full 400px width). + expect( + root + .getRenderedOutput({ + includeLayoutMetrics: true, + props: ['layoutMetrics-frame'], + }) + .toJSX(), + ).toEqual( + + + + + + + , + ); + }); + }); + + describe('ItemSeparatorComponent', () => { + it('renders separators between items', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + {item.title}} + ItemSeparatorComponent={() => } + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + First + + Second + + Third + + , + ); + }); + }); + + describe('keyExtractor', () => { + it('uses custom keyExtractor for item keys', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + {item.title}} + keyExtractor={(item: {id: string, title: string}) => item.id} + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Item 1 + Item 2 + + , + ); + }); + }); + + describe('getItemLayout', () => { + it('uses getItemLayout to determine item positions', () => { + const root = Fantom.createRoot({ + viewportWidth: 400, + viewportHeight: 600, + }); + Fantom.runTask(() => { + root.render( + } + getItemLayout={( + _data: ?Readonly<$ArrayLike<{key: string}>>, + index: number, + ) => ({ + length: 50, + offset: 50 * index, + index, + })} + />, + ); + }); + + expect( + root + .getRenderedOutput({ + includeLayoutMetrics: true, + props: ['layoutMetrics-frame'], + }) + .toJSX(), + ).toEqual( + + + + + + , + ); + }); + }); + + describe('initialNumToRender', () => { + it('initially renders limited items then renders more on scroll', () => { + const root = Fantom.createRoot({ + viewportWidth: 400, + viewportHeight: 200, + }); + const flatListRef = createRef>(); + Fantom.runTask(() => { + root.render( + {item.title}} + getItemLayout={( + _data: ?Readonly<$ArrayLike<{key: string, title: string}>>, + index: number, + ) => ({ + length: 50, + offset: 50 * index, + index, + })} + initialNumToRender={2} + />, + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Item 1 + Item 2 + + , + ); + + // Scroll down to trigger rendering of additional items. + const scrollView = ensureInstance( + nullthrows(flatListRef.current).getNativeScrollRef(), + ReactNativeElement, + ); + Fantom.scrollTo(scrollView, {x: 0, y: 100}); + + const output = root.getRenderedOutput({props: []}).toJSONObject(); + const innerView = output.children[0]; + expect(typeof innerView).toBe('object'); + if (typeof innerView === 'object') { + expect(innerView.children.length).toBeGreaterThan(2); + } + }); + }); + + describe('onEndReached', () => { + it('calls onEndReached when scrolled near the end', () => { + const root = Fantom.createRoot({ + viewportWidth: 400, + viewportHeight: 200, + }); + const onEndReached = jest.fn(); + const flatListRef = createRef>(); + Fantom.runTask(() => { + root.render( + ({key: String(i)}))} + renderItem={() => ( + + )} + getItemLayout={( + _data: ?Readonly<$ArrayLike<{key: string}>>, + index: number, + ) => ({ + length: 100, + offset: 100 * index, + index, + })} + onEndReached={onEndReached} + onEndReachedThreshold={0.5} + />, + ); + }); + + const scrollView = ensureInstance( + nullthrows(flatListRef.current).getNativeScrollRef(), + ReactNativeElement, + ); + + Fantom.scrollTo(scrollView, {x: 0, y: 800}); + + expect(onEndReached).toHaveBeenCalled(); + }); + }); + + describe('extraData', () => { + it('triggers re-render when extraData changes', () => { + const root = Fantom.createRoot(); + let suffix = 'v1'; + const renderItem = ({ + item, + }: { + item: {key: string, title: string}, + ... + }) => {item.title + ' ' + suffix}; + + Fantom.runTask(() => { + root.render( + , + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Item v1 + + , + ); + + suffix = 'v2'; + Fantom.runTask(() => { + root.render( + , + ); + }); + + expect(root.getRenderedOutput({props: []}).toJSX()).toEqual( + + + Item v2 + + , + ); + }); + }); + + describe('contentContainerStyle', () => { + it('propagates style to the content container', () => { + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render( + {item.title}} + contentContainerStyle={{backgroundColor: 'red', padding: 10}} + />, + ); + }); + + expect( + root.getRenderedOutput({props: ['backgroundColor']}).toJSX(), + ).toEqual( + + + Item 1 + + , + ); + }); + }); + + describe('imperative methods', () => { + const ITEM_HEIGHT = 50; + type Item = {key: string, title: string}; + const DATA: Array = Array.from({length: 20}, (_, i) => ({ + key: String(i), + title: `Item ${i}`, + })); + const getItemLayout = ( + _data: ?Readonly<$ArrayLike>, + index: number, + ) => ({ + length: ITEM_HEIGHT, + offset: ITEM_HEIGHT * index, + index, + }); + + describe('scrollToOffset', () => { + it('dispatches scrollTo command for vertical list', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToOffset({ + offset: 100, + animated: false, + }); + }); + + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "scrollTo, args: [0,100,false]"}', + ]); + }); + + it('dispatches scrollTo command for horizontal list', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToOffset({ + offset: 200, + animated: false, + }); + }); + + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "scrollTo, args: [200,0,false]"}', + ]); + }); + + it('passes animated flag through to the native command', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToOffset({ + offset: 50, + animated: true, + }); + }); + + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "scrollTo, args: [0,50,true]"}', + ]); + }); + }); + + describe('scrollToEnd', () => { + it('dispatches scrollTo command to scroll to end of content', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToEnd({animated: false}); + }); + + // 20 items * 50px = 1000px total content height + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "scrollTo, args: [0,1000,false]"}', + ]); + }); + }); + + describe('scrollToIndex', () => { + it('dispatches scrollTo command for a specific index', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToIndex({ + index: 5, + animated: false, + }); + }); + + // Index 5 with ITEM_HEIGHT=50 should scroll to offset 250 + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "scrollTo, args: [0,250,false]"}', + ]); + }); + }); + + describe('scrollToItem', () => { + it('dispatches scrollTo command for a specific item', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToItem({ + item: DATA[3], + animated: false, + }); + }); + + // Item at index 3 with ITEM_HEIGHT=50 should scroll to offset 150 + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "scrollTo, args: [0,150,false]"}', + ]); + }); + + it('does not dispatch command when item is not in data', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + getItemLayout={getItemLayout} + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).scrollToItem({ + item: {key: 'not-in-data', title: 'Missing'}, + animated: false, + }); + }); + + expect(root.takeMountingManagerLogs()).toEqual([]); + }); + }); + + describe('recordInteraction', () => { + it('can be called without throwing', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + />, + ); + }); + + expect(() => { + nullthrows(flatListRef.current).recordInteraction(); + }).not.toThrow(); + }); + }); + + describe('flashScrollIndicators', () => { + it('dispatches flashScrollIndicators command', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + />, + ); + }); + + root.takeMountingManagerLogs(); + + Fantom.runTask(() => { + nullthrows(flatListRef.current).flashScrollIndicators(); + }); + + expect(root.takeMountingManagerLogs()).toEqual([ + 'Command {type: "ScrollView", nativeID: "flat-list", name: "flashScrollIndicators"}', + ]); + }); + }); + + describe('getScrollResponder', () => { + it('returns a non-null scroll responder', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + />, + ); + }); + + const responder = nullthrows(flatListRef.current).getScrollResponder(); + expect(responder).not.toBeNull(); + }); + }); + + describe('getNativeScrollRef', () => { + it('returns a non-null native scroll ref', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + />, + ); + }); + + const nativeRef = nullthrows(flatListRef.current).getNativeScrollRef(); + expect(nativeRef).not.toBeNull(); + }); + }); + + describe('getScrollableNode', () => { + it('returns a non-null scrollable node', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + />, + ); + }); + + const node = nullthrows(flatListRef.current).getScrollableNode(); + expect(node).not.toBeNull(); + }); + }); + + describe('setNativeProps', () => { + it('can be called without throwing', () => { + const root = Fantom.createRoot(); + const flatListRef = createRef>(); + + Fantom.runTask(() => { + root.render( + } + />, + ); + }); + + expect(() => { + nullthrows(flatListRef.current).setNativeProps({ + scrollEnabled: false, + }); + }).not.toThrow(); + }); + }); + }); }); From 6d4fcbf5d4a28a156ce5ef01cf65d6efdd86b3b9 Mon Sep 17 00:00:00 2001 From: Laura Macaluso Date: Thu, 5 Mar 2026 07:02:49 -0800 Subject: [PATCH 080/595] Add missing Fantom integration test coverage for TouchableHighlight (#55928) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55928 Changelog: [Internal] Add tests for previously untested TouchableHighlight-specific features in the Fantom integration test suite: - **underlayColor**: Verify default underlay color ('black') and custom underlay color ('red') render correctly when pressed, using `testOnly_pressed={true}` to force the pressed visual state. - **activeOpacity (pressed state)**: Verify default activeOpacity (0.85) and custom activeOpacity (0.5) are applied to the child element's opacity when pressed. - **onShowUnderlay**: Verify the callback fires when the element is clicked, via `Fantom.dispatchNativeEvent`. - **displayName**: Verify `TouchableHighlight.displayName` is `'TouchableHighlight'`. These tests cover the underlay mechanism, which is the defining feature of TouchableHighlight that distinguishes it from TouchableOpacity. Reviewed By: NickGerleman Differential Revision: D95225416 fbshipit-source-id: d1923c27d1ec9536d6b1e4ae41ba750212f27bc6 --- .../__tests__/TouchableHighlight-itest.js | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) diff --git a/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js b/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js index 5073c21afe5..776ec964a4e 100644 --- a/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js +++ b/packages/react-native/Libraries/Components/Touchable/__tests__/TouchableHighlight-itest.js @@ -116,6 +116,84 @@ describe('', () => { , ); }); + + it('applies default activeOpacity (0.85) to child when pressed', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect(root.getRenderedOutput({props: ['opacity']}).toJSX()).toEqual( + + + , + ); + }); + + it('applies custom activeOpacity to child when pressed', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect(root.getRenderedOutput({props: ['opacity']}).toJSX()).toEqual( + + + , + ); + }); + }); + + describe('underlayColor', () => { + it('renders default underlay color (black) when pressed', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['backgroundColor']}).toJSX(), + ).toEqual( + + + , + ); + }); + + it('renders custom underlay color when pressed', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['backgroundColor']}).toJSX(), + ).toEqual( + + + , + ); + }); }); describe('onPress', () => { @@ -143,6 +221,32 @@ describe('', () => { }); }); + describe('onShowUnderlay', () => { + it('triggers onShowUnderlay callback when pressed', () => { + const elementRef = createRef(); + const onShowUnderlayCallback = jest.fn(); + + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + {}} + onShowUnderlay={onShowUnderlayCallback} + style={{height: 100}}> + + , + ); + }); + + const element = ensureInstance(elementRef.current, ReactNativeElement); + Fantom.dispatchNativeEvent(element, 'click'); + + expect(onShowUnderlayCallback).toHaveBeenCalledTimes(1); + }); + }); + describe('disabled', () => { it('cannot be pressed when disabled', () => { const elementRef = createRef(); @@ -184,6 +288,93 @@ describe('', () => { , ); }); + + it('sets accessibilityState disabled when accessibilityState is empty', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + }); + + it('preserves accessibilityState values when disabled is true', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + }); + + it('overwrites accessibilityState disabled with disabled prop', () => { + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + }); + + it('disables when only accessibilityState disabled is set', () => { + const elementRef = createRef(); + const onPressCallback = jest.fn(); + + const root = Fantom.createRoot(); + + Fantom.runTask(() => { + root.render( + + + , + ); + }); + + expect( + root.getRenderedOutput({props: ['accessibilityState']}).toJSX(), + ).toEqual( + , + ); + + const element = ensureInstance(elementRef.current, ReactNativeElement); + Fantom.dispatchNativeEvent(element, 'click'); + + expect(onPressCallback).toHaveBeenCalledTimes(0); + }); }); describe('children', () => { @@ -243,4 +434,8 @@ describe('', () => { }); }); }); + + it('has the correct displayName', () => { + expect(TouchableHighlight.displayName).toBe('TouchableHighlight'); + }); }); From d473d9b598ef003ed0bf84df7e75477187fe1537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 081/595] Fix parsing of Objective-C interface generic inheritance (#55775) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55775 Doxygen incorrectly parses Objective-C interface declarations with protocol conformance. For example: ```objc interface RCTAppearance : RCTEventEmitter ``` Doxygen splits this into **two separate base classes** in the XML: ```xml RCTEventEmitter <RCTBridgeModule> ``` This caused the parser to output: ``` interface RCTAppearance : public RCTEventEmitter, public { ``` Instead of the expected: ``` interface RCTAppearance : public RCTEventEmitter { ``` The fix detects when a "base class" name starts and ends with `<...>` (indicating it's a protocol conformance) and combines it with the preceding actual base class name. Also for multiple generics like: ``` interface RCTAlertManager : NSObject end ``` The output should be ``` interface RCTAlertManager : public NSObject end ``` Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94351731 fbshipit-source-id: 05ee2729c7a60800e9350193ef04ee6e2b125522 --- scripts/cxx-api/parser/builders.py | 19 ++++++++++++++++++- .../snapshot.api | 3 +++ .../test.h | 16 ++++++++++++++++ .../snapshot.api | 2 ++ .../test.h | 16 ++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/test.h create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/test.h diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index 85d11f7ccc6..3361c25a35d 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -465,7 +465,24 @@ def create_interface_scope( interface_scope = snapshot.create_interface(interface_name) base_classes = get_base_classes(scope_def, base_class=InterfaceScopeKind.Base) - interface_scope.kind.add_base(base_classes) + + # Doxygen incorrectly splits "Foo " into separate base classes: + # "Foo", "", "". Combine them back into "Foo ". + combined_bases = [] + for base in base_classes: + if base.name.startswith("<") and base.name.endswith(">") and combined_bases: + prev_name = combined_bases[-1].name + protocol = base.name[1:-1] # Strip < and > + if "<" in prev_name and prev_name.endswith(">"): + # Previous base already has protocols, merge inside the brackets + combined_bases[-1].name = f"{prev_name[:-1]}, {protocol}>" + else: + # First protocol for this base class + combined_bases[-1].name = f"{prev_name} <{protocol}>" + else: + combined_bases.append(base) + + interface_scope.kind.add_base(combined_bases) interface_scope.location = scope_def.location.file _process_objc_sections( diff --git a/scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/snapshot.api new file mode 100644 index 00000000000..e10fec618c7 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/snapshot.api @@ -0,0 +1,3 @@ +interface RCTAppearance : public RCTEventEmitter { + public virtual instancetype init(); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/test.h b/scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/test.h new file mode 100644 index 00000000000..dc261f9b508 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_class_with_generic_inheritance/test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +namespace test { + +@interface RCTAppearance : RCTEventEmitter +- (instancetype)init; +@end + +} // namespace test diff --git a/scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/snapshot.api new file mode 100644 index 00000000000..f66dd58f6c0 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/snapshot.api @@ -0,0 +1,2 @@ +interface RCTAlertManager : public NSObject { +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/test.h b/scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/test.h new file mode 100644 index 00000000000..02d7e217d22 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_class_with_multiple_protocol_conformances/test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +namespace test { + +@interface RCTAlertManager : NSObject + +@end + +} // namespace test From 47ef0e173f61c497c1a2ca7173be32d24476fb22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 082/595] Fix parsing of Objective-C block properties (#55776) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55776 Doxygen splits block property types across `` and `` elements. For example: ```objc property (nonatomic, copy) void (^eventInterceptor)(NSString *eventName, NSDictionary *event, NSNumber *reactTag); ``` Produces XML like: ```xml void(^ eventInterceptor )(NSString *eventName, NSDictionary *event, NSNumber *reactTag) ``` This caused the parser to output incomplete types. The fix detects when the property type ends with `(^` and combines it with the property name and argsstring: ``` property (copy) void(^eventInterceptor)(NSString *eventName, NSDictionary *event, NSNumber *reactTag); ``` Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94366205 fbshipit-source-id: 2d741401f63916284d453f1112ae0f349234308e --- scripts/cxx-api/parser/builders.py | 10 ++++++++++ scripts/cxx-api/parser/member.py | 6 +++++- .../snapshot.api | 5 +++++ .../test.h | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/test.h diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index 3361c25a35d..4dbd7466596 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -337,6 +337,16 @@ def get_property_member( is_readable = getattr(member_def, "readable", "no") == "yes" is_writable = getattr(member_def, "writable", "no") == "yes" + # Handle block properties: Doxygen splits the block type across and + # = "void(^" + # = ")(NSString *eventName, NSDictionary *event, NSNumber *reactTag)" + # We need to combine them: "void(^eventInterceptor)(NSString *, NSDictionary *, NSNumber *)" + if property_type.endswith("(^"): + argsstring = member_def.get_argsstring() + if argsstring: + property_type = f"{property_type}{property_name}{argsstring}" + property_name = "" + return PropertyMember( property_name, property_type, diff --git a/scripts/cxx-api/parser/member.py b/scripts/cxx-api/parser/member.py index 407fa078aec..2069aa80a84 100644 --- a/scripts/cxx-api/parser/member.py +++ b/scripts/cxx-api/parser/member.py @@ -404,7 +404,11 @@ def to_string( if self.is_static: result += "static " - result += f"@property {attrs_str}{self.type} {name};" + # For block properties, name is embedded in the type (e.g., "void(^eventInterceptor)(args)") + if name: + result += f"@property {attrs_str}{self.type} {name};" + else: + result += f"@property {attrs_str}{self.type};" return result diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api new file mode 100644 index 00000000000..01e1b9d3f9c --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api @@ -0,0 +1,5 @@ +interface RCTInterfaceWithBlockProperty : public NSObject { + public @property (copy) NSString *(^blockWithReturn)(int value); + public @property (copy) void(^eventInterceptor)(NSString *eventName, NSDictionary *event, NSNumber *reactTag); + public @property (copy) void(^simpleBlock)(void); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/test.h b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/test.h new file mode 100644 index 00000000000..e9fc1c8b965 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/test.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTInterfaceWithBlockProperty : NSObject + +@property (nonatomic, copy, nullable) void (^eventInterceptor) + (NSString *eventName, NSDictionary *event, NSNumber *reactTag); +@property (nonatomic, copy) void (^simpleBlock)(void); +@property (nonatomic, copy) NSString * (^blockWithReturn)(int value); + +@end From d680d7001eddea1562ef39482c3a9da08bd6a1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 083/595] Remove `__deprecated_msg` from the snapshot (#55780) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55780 Set predefined `__deprecated_msg` to empty string in the `.doxygen.config.template` as doxygen has problem with parsing and produces malformed xml. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D94517576 fbshipit-source-id: eaaf0f66feacb47f725c34a5c93201f5103b92bb --- .../react-native/.doxygen.config.template | 2 +- .../manual_test/.doxygen.config.template | 2 +- .../tests/snapshots/.doxygen.config.template | 2 +- .../should_handle_deprecated_msg/snapshot.api | 16 +++++++++ .../should_handle_deprecated_msg/test.h | 34 +++++++++++++++++++ 5 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/test.h diff --git a/packages/react-native/.doxygen.config.template b/packages/react-native/.doxygen.config.template index 72db8de8be9..cd4047ae375 100644 --- a/packages/react-native/.doxygen.config.template +++ b/packages/react-native/.doxygen.config.template @@ -2443,7 +2443,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" ${PREDEFINED} +PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" __deprecated_msg(x)="" ${PREDEFINED} # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/manual_test/.doxygen.config.template b/scripts/cxx-api/manual_test/.doxygen.config.template index 80290595ec9..6f762bb4b57 100644 --- a/scripts/cxx-api/manual_test/.doxygen.config.template +++ b/scripts/cxx-api/manual_test/.doxygen.config.template @@ -2442,7 +2442,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" ${PREDEFINED} +PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" __deprecated_msg(x)="" ${PREDEFINED} # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/tests/snapshots/.doxygen.config.template b/scripts/cxx-api/tests/snapshots/.doxygen.config.template index a01a146395a..13cbc7b5737 100644 --- a/scripts/cxx-api/tests/snapshots/.doxygen.config.template +++ b/scripts/cxx-api/tests/snapshots/.doxygen.config.template @@ -2442,7 +2442,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" +PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" __deprecated_msg(x)="" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api new file mode 100644 index 00000000000..65e0334c1d0 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api @@ -0,0 +1,16 @@ +interface RCTDeprecatedInterface { + public virtual void customBubblingEventTypes(); + public virtual void legacyTitle(); + public virtual void normalMethod(); + public virtual void oldMethod(); +} + +interface RCTTestInterface { + public virtual NSArray * deprecatedMethod:(id param); + public virtual void normalMethod:(NSString * name); +} + +protocol RCTDeprecatedProtocol { + public virtual void deprecatedProtocolMethod(); + public virtual void normalProtocolMethod(); +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/test.h b/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/test.h new file mode 100644 index 00000000000..b3d47328979 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/test.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTTestInterface + +- (void)normalMethod:(NSString *)name; + +- (NSArray *)deprecatedMethod:(id)param __deprecated_msg("Use newMethod instead."); + +@end + +@interface RCTDeprecatedInterface + +- (void)normalMethod; + +- (void)oldMethod __deprecated_msg("Use newMethod instead."); + +- (void)customBubblingEventTypes __deprecated_msg("Use RCTBubblingEventBlock props instead."); + +- (void)legacyTitle __deprecated_msg("This API will be removed along with the legacy architecture."); + +@end + +@protocol RCTDeprecatedProtocol + +- (void)normalProtocolMethod; + +- (void)deprecatedProtocolMethod __deprecated_msg("Protocol method is deprecated."); + +@end From a6d29d0d38ac005159709b33aa658ed7de9913ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 084/595] Set more predefined macros in the doxygen config. (#55900) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55900 Doxygen incorrectly parses macros like `NS_DESIGNATED_INITIALIZER`, `RCT_EXTERN`, `RCT_DEPRECATED`, `RCT_EXTERN_MODULE`, `API_AVAILABLE`. Setting them them as predefined empty string solves the issue. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D94534964 fbshipit-source-id: 57a084e58479d079d43b234e3882346c5c443a69 --- .../react-native/.doxygen.config.template | 16 ++++++++- .../manual_test/.doxygen.config.template | 15 +++++++- .../tests/snapshots/.doxygen.config.template | 14 +++++++- .../should_strip_objc_macros/snapshot.api | 14 ++++++++ .../snapshots/should_strip_objc_macros/test.h | 36 +++++++++++++++++++ 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_strip_objc_macros/test.h diff --git a/packages/react-native/.doxygen.config.template b/packages/react-native/.doxygen.config.template index cd4047ae375..d7f5cd197aa 100644 --- a/packages/react-native/.doxygen.config.template +++ b/packages/react-native/.doxygen.config.template @@ -2443,7 +2443,21 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" __deprecated_msg(x)="" ${PREDEFINED} +PREDEFINED = FOLLY_PACK_PUSH="" \ + FOLLY_PACK_POP="" \ + FOLLY_PACK_ATTR="" \ + __attribute__(x)="" \ + __deprecated_msg(x)="" \ + NS_REQUIRES_SUPER="" \ + NS_UNAVAILABLE="" \ + CF_RETURNS_NOT_RETAINED="" \ + NS_DESIGNATED_INITIALIZER="" \ + NS_DESIGNATED_INITIALIZER="" \ + RCT_EXTERN="" \ + RCT_DEPRECATED="" \ + RCT_EXTERN_MODULE="" \ + API_AVAILABLE(x)="" \ + ${PREDEFINED} # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/manual_test/.doxygen.config.template b/scripts/cxx-api/manual_test/.doxygen.config.template index 6f762bb4b57..15952235cae 100644 --- a/scripts/cxx-api/manual_test/.doxygen.config.template +++ b/scripts/cxx-api/manual_test/.doxygen.config.template @@ -2442,7 +2442,20 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" __deprecated_msg(x)="" ${PREDEFINED} +PREDEFINED = FOLLY_PACK_PUSH="" \ + FOLLY_PACK_POP="" \ + FOLLY_PACK_ATTR="" \ + __attribute__(x)="" \ + __deprecated_msg(x)="" \ + NS_REQUIRES_SUPER="" \ + NS_UNAVAILABLE="" \ + CF_RETURNS_NOT_RETAINED="" \ + NS_DESIGNATED_INITIALIZER="" \ + RCT_EXTERN="" \ + RCT_DEPRECATED="" \ + RCT_EXTERN_MODULE="" \ + API_AVAILABLE(x)="" \ + ${PREDEFINED} # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/tests/snapshots/.doxygen.config.template b/scripts/cxx-api/tests/snapshots/.doxygen.config.template index 13cbc7b5737..50d418c394f 100644 --- a/scripts/cxx-api/tests/snapshots/.doxygen.config.template +++ b/scripts/cxx-api/tests/snapshots/.doxygen.config.template @@ -2442,7 +2442,19 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" FOLLY_PACK_POP="" FOLLY_PACK_ATTR="" __attribute__(x)="" __deprecated_msg(x)="" +PREDEFINED = FOLLY_PACK_PUSH="" \ + FOLLY_PACK_POP="" \ + FOLLY_PACK_ATTR="" \ + __attribute__(x)="" \ + __deprecated_msg(x)="" \ + NS_REQUIRES_SUPER="" \ + NS_UNAVAILABLE="" \ + CF_RETURNS_NOT_RETAINED="" \ + NS_DESIGNATED_INITIALIZER="" \ + RCT_EXTERN="" \ + RCT_DEPRECATED="" \ + RCT_EXTERN_MODULE="" \ + API_AVAILABLE(x)="" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api b/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api new file mode 100644 index 00000000000..b0c18447476 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api @@ -0,0 +1,14 @@ +interface RCTTestMacros { + public @property (strong, readonly) dispatch_queue_t methodQueue; + public @property (weak, readonly) id bridge; + public virtual instancetype initWithDelegate:options:(id delegate, NSDictionary * options); + public virtual instancetype initWithName:(NSString * name); + public virtual static UIUserInterfaceStyle userInterfaceStyle(); + public virtual void deprecatedMethod(); +} + +protocol RCTTestProtocol { + public @property (assign, readonly) NSString * name; + public virtual void normalMethod(); + public virtual void requiredMethod(); +} diff --git a/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/test.h b/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/test.h new file mode 100644 index 00000000000..d03ef29db63 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/test.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTTestMacros + +- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithDelegate:(id)delegate options:(NSDictionary *)options NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, strong, readonly) dispatch_queue_t methodQueue RCT_DEPRECATED; + +@property (nonatomic, weak, readonly) id bridge RCT_DEPRECATED; + +- (void)deprecatedMethod RCT_DEPRECATED; + ++ (UIUserInterfaceStyle)userInterfaceStyle API_AVAILABLE(ios(12)); + +@end + +RCT_EXTERN void RCTExternFunction(const char *input, NSString **output); + +RCT_EXTERN NSString *RCTParseType(const char **input); + +@protocol RCTTestProtocol + +- (void)normalMethod; + +- (void)requiredMethod NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, readonly) NSString *name RCT_DEPRECATED; + +@end From 6558d0d374961229224c2d74c136ce4078938e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 085/595] Add doxygen input filter to strip block comments (#55888) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55888 Adds a doxygen input filter (`input_filters/doxygen_strip_comments.py`) that strips block comments from source files before doxygen parses them. This prevents doxygen from incorrectly parsing Objective-C code examples (like `interface`, `protocol`) within documentation comments as actual code declarations. For example, a doc comment containing: ``` /** * Example: * interface RCT_EXTERN_MODULE(MyModule, NSObject) * end */ ``` Was being parsed by doxygen as an actual interface declaration, resulting in malformed output like `interface RCT_EXTERN_MODULE {}` in the API snapshot. The filter preserves line numbers by replacing comment content with the equivalent number of newlines, ensuring error messages remain accurate. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D94538938 fbshipit-source-id: 4abbb9ed80cc1ca8eb8f128a4f06a0f4d2bc70d3 --- .../react-native/.doxygen.config.template | 2 +- .../input_filters/doxygen_strip_comments.py | 60 ++++++++++++++++ .../manual_test/.doxygen.config.template | 2 +- scripts/cxx-api/parser/__main__.py | 22 ++++-- .../tests/snapshots/.doxygen.config.template | 2 +- .../snapshot.api | 3 + .../test.h | 18 +++++ scripts/cxx-api/tests/test_input_filters.py | 71 +++++++++++++++++++ scripts/cxx-api/tests/test_snapshots.py | 31 ++++++-- 9 files changed, 197 insertions(+), 14 deletions(-) create mode 100755 scripts/cxx-api/input_filters/doxygen_strip_comments.py create mode 100644 scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/test.h create mode 100644 scripts/cxx-api/tests/test_input_filters.py diff --git a/packages/react-native/.doxygen.config.template b/packages/react-native/.doxygen.config.template index d7f5cd197aa..4f982c734bc 100644 --- a/packages/react-native/.doxygen.config.template +++ b/packages/react-native/.doxygen.config.template @@ -1123,7 +1123,7 @@ IMAGE_PATH = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by Doxygen. -INPUT_FILTER = +INPUT_FILTER = ${DOXYGEN_INPUT_FILTER} # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the diff --git a/scripts/cxx-api/input_filters/doxygen_strip_comments.py b/scripts/cxx-api/input_filters/doxygen_strip_comments.py new file mode 100755 index 00000000000..d379f7d1c9d --- /dev/null +++ b/scripts/cxx-api/input_filters/doxygen_strip_comments.py @@ -0,0 +1,60 @@ +#!/usr/bin/env fbpython +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Doxygen input filter to strip block comments from source files. + +This prevents Doxygen from incorrectly parsing code examples within +documentation comments as actual code declarations (e.g., @interface, +@protocol examples in doc comments being parsed as real interfaces). + +Usage in doxygen config: + INPUT_FILTER = "python3 /path/to/doxygen_strip_comments.py" +""" + +import re +import sys + + +def strip_block_comments(content: str) -> str: + """ + Remove all block comments (/* ... */ and /** ... */) from content. + Preserves line count by replacing comment content with newlines. + """ + + def replace_with_newlines(match: re.Match) -> str: + # Count newlines in original comment to preserve line numbers + newline_count = match.group().count("\n") + return "\n" * newline_count + + # Pattern to match block comments (non-greedy) + comment_pattern = re.compile(r"/\*[\s\S]*?\*/") + + return comment_pattern.sub(replace_with_newlines, content) + + +def main(): + if len(sys.argv) < 2: + print("Usage: doxygen_strip_comments.py ", file=sys.stderr) + sys.exit(1) + + filename = sys.argv[1] + + try: + with open(filename, "r", encoding="utf-8", errors="replace") as f: + content = f.read() + + filtered = strip_block_comments(content) + print(filtered, end="") + except Exception as e: + # On error, output original content to not break the build + print(f"Warning: Filter error for {filename}: {e}", file=sys.stderr) + with open(filename, "r", encoding="utf-8", errors="replace") as f: + print(f.read(), end="") + + +if __name__ == "__main__": + main() diff --git a/scripts/cxx-api/manual_test/.doxygen.config.template b/scripts/cxx-api/manual_test/.doxygen.config.template index 15952235cae..cac0975942a 100644 --- a/scripts/cxx-api/manual_test/.doxygen.config.template +++ b/scripts/cxx-api/manual_test/.doxygen.config.template @@ -1122,7 +1122,7 @@ IMAGE_PATH = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by Doxygen. -INPUT_FILTER = +INPUT_FILTER = ${DOXYGEN_INPUT_FILTER} # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the diff --git a/scripts/cxx-api/parser/__main__.py b/scripts/cxx-api/parser/__main__.py index 96673ad2dfe..2d7a8cfd52c 100644 --- a/scripts/cxx-api/parser/__main__.py +++ b/scripts/cxx-api/parser/__main__.py @@ -33,6 +33,7 @@ def build_doxygen_config( include_directories: list[str] = None, exclude_patterns: list[str] = None, definitions: dict[str, str | int] = None, + input_filter: str = None, ) -> None: if include_directories is None: include_directories = [] @@ -53,6 +54,8 @@ def build_doxygen_config( ] ) + input_filter_str = input_filter if input_filter else "" + # read the template file with open(os.path.join(directory, ".doxygen.config.template")) as f: template = f.read() @@ -62,6 +65,7 @@ def build_doxygen_config( template.replace("${INPUTS}", include_directories_str) .replace("${EXCLUDE_PATTERNS}", exclude_patterns_str) .replace("${PREDEFINED}", definitions_str) + .replace("${DOXYGEN_INPUT_FILTER}", input_filter_str) ) # write the config file @@ -77,6 +81,7 @@ def build_snapshot_for_view( definitions: dict[str, str | int], output_dir: str, verbose: bool = True, + input_filter: str = None, ) -> None: if verbose: print(f"Generating API view: {api_view}") @@ -87,6 +92,7 @@ def build_snapshot_for_view( include_directories=include_directories, exclude_patterns=exclude_patterns, definitions=definitions, + input_filter=input_filter, ) # If there is already a doxygen output directory, delete it @@ -188,6 +194,17 @@ def main(): if verbose and args.codegen_path: print(f"Codegen output path: {os.path.abspath(args.codegen_path)}") + input_filter_path = os.path.join( + get_react_native_dir(), + "scripts", + "cxx-api", + "input_filters", + "doxygen_strip_comments.py", + ) + input_filter = None + if os.path.exists(input_filter_path): + input_filter = f"python3 {input_filter_path}" + # Parse config file config_path = os.path.join( get_react_native_dir(), "scripts", "cxx-api", "config.yml" @@ -219,6 +236,7 @@ def build_snapshots(output_dir: str, verbose: bool) -> None: definitions={}, output_dir=output_dir, verbose=verbose, + input_filter=input_filter, ) if verbose: @@ -245,7 +263,3 @@ def build_snapshots(output_dir: str, verbose: bool) -> None: ) ) build_snapshots(output_dir, verbose=True) - - -if __name__ == "__main__": - main() diff --git a/scripts/cxx-api/tests/snapshots/.doxygen.config.template b/scripts/cxx-api/tests/snapshots/.doxygen.config.template index 50d418c394f..f5f56836001 100644 --- a/scripts/cxx-api/tests/snapshots/.doxygen.config.template +++ b/scripts/cxx-api/tests/snapshots/.doxygen.config.template @@ -1122,7 +1122,7 @@ IMAGE_PATH = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by Doxygen. -INPUT_FILTER = +INPUT_FILTER = ${DOXYGEN_INPUT_FILTER} # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the diff --git a/scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/snapshot.api b/scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/snapshot.api new file mode 100644 index 00000000000..e5a54251d3c --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/snapshot.api @@ -0,0 +1,3 @@ +interface RCTRealInterface { + public virtual void realMethod(); +} diff --git a/scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/test.h b/scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/test.h new file mode 100644 index 00000000000..3ffcc2f8474 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_not_parse_interface_from_doc_comment/test.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Example of how to use this module: + * + * @interface RCT_EXTERN_MODULE(MyModule, NSObject) + * @end + */ +@interface RCTRealInterface + +- (void)realMethod; + +@end diff --git a/scripts/cxx-api/tests/test_input_filters.py b/scripts/cxx-api/tests/test_input_filters.py new file mode 100644 index 00000000000..2aa3bf50881 --- /dev/null +++ b/scripts/cxx-api/tests/test_input_filters.py @@ -0,0 +1,71 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import annotations + +import unittest + +from ..input_filters.doxygen_strip_comments import strip_block_comments + + +class TestDoxygenStripComments(unittest.TestCase): + def test_strips_single_line_block_comment(self): + content = "/* comment */ code" + result = strip_block_comments(content) + self.assertEqual(result, " code") + + def test_strips_multiline_block_comment(self): + content = """/** + * Doc comment + * with multiple lines + */ +@interface RealInterface +@end""" + result = strip_block_comments(content) + # Should preserve 4 newlines (one for each line in the comment) + self.assertEqual( + result, + """\n\n\n +@interface RealInterface +@end""", + ) + + def test_preserves_code_outside_comments(self): + content = """@interface MyClass +- (void)method; +@end""" + result = strip_block_comments(content) + self.assertEqual(result, content) + + def test_strips_comment_with_objc_keywords(self): + """This is the main use case - stripping comments that contain @interface etc.""" + content = """/** + * Example: + * @interface RCT_EXTERN_MODULE(MyModule, NSObject) + * @end + */ +@interface RealInterface +@end""" + result = strip_block_comments(content) + self.assertNotIn("RCT_EXTERN_MODULE", result) + self.assertIn("@interface RealInterface", result) + + def test_handles_multiple_comments(self): + content = """/* first */ code /* second */ more""" + result = strip_block_comments(content) + self.assertEqual(result, " code more") + + def test_handles_empty_content(self): + result = strip_block_comments("") + self.assertEqual(result, "") + + def test_handles_no_comments(self): + content = "just code without comments" + result = strip_block_comments(content) + self.assertEqual(result, content) + + +if __name__ == "__main__": + unittest.main() diff --git a/scripts/cxx-api/tests/test_snapshots.py b/scripts/cxx-api/tests/test_snapshots.py index c78687904d4..4b21fcd728f 100644 --- a/scripts/cxx-api/tests/test_snapshots.py +++ b/scripts/cxx-api/tests/test_snapshots.py @@ -49,18 +49,21 @@ def _assert_text_equal_with_diff( tc.fail(diff) -def _get_doxygen_bin() -> str: - return os.environ.get("DOXYGEN_BIN", "doxygen") - - -def _generate_doxygen_api(case_dir_path: str, doxygen_config_path: str) -> None: +def _generate_doxygen_api( + case_dir_path: str, doxygen_config_path: str, filter_script_path: str | None = None +) -> None: """Run doxygen to generate XML API documentation.""" - doxygen_bin = _get_doxygen_bin() + env = os.environ.copy() + if filter_script_path: + env["DOXYGEN_INPUT_FILTER"] = f"python3 {filter_script_path}" + + doxygen_bin = env.get("DOXYGEN_BIN", "doxygen") result = subprocess.run( [doxygen_bin, doxygen_config_path], cwd=case_dir_path, capture_output=True, text=True, + env=env, ) if result.returncode != 0: raise RuntimeError(f"Doxygen failed: {result.stderr}") @@ -101,8 +104,22 @@ def _test(self: unittest.TestCase) -> None: case_dir_path = tests_root_path / case_dir.name doxygen_config_path = tests_root_path / ".doxygen.config.template" + # Find the filter script in the package resources + pkg_root = ir.files(__package__ if __package__ else "__main__") + filter_script = ( + pkg_root.parent / "input_filters" / "doxygen_strip_comments.py" + ) + + # Get real filesystem path for filter script if it exists + filter_script_path = None + if filter_script.is_file(): + with ir.as_file(filter_script) as fs_path: + filter_script_path = str(fs_path) + # Run doxygen to generate the XML - _generate_doxygen_api(str(case_dir_path), str(doxygen_config_path)) + _generate_doxygen_api( + str(case_dir_path), str(doxygen_config_path), filter_script_path + ) # Parse the generated XML xml_dir = case_dir_path / "api" / "xml" From f2ea073857706c895bacc0ec684e573252d7f107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 086/595] Normalize pointer and reference spacing in parser output (#55901) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55901 Fixes inconsistent spacing around pointer (`*`) and reference (`&`, `&&`) symbols in the parser output. Doxygen outputs types with a space before `*` and `&` (e.g., `NSString *`), which is inconsistent. This diff adds `normalize_pointer_spacing()` to standardize the output: - `NSString *` → `NSString*` - `int &` → `int&` - `T &&` → `T&&` - For function arguments: `NSString *name` → `NSString* name` ## Changes 1. Added `normalize_pointer_spacing()` function in `text_resolution.py` 2. Applied normalization in `resolve_ref_text_name()` and `resolve_linked_text_name()` 3. Applied normalization to block property argsstrings in `builders.py` 4. Updated all affected snapshot files to use normalized spacing Changelog: [Internal] Reviewed By: cortinico Differential Revision: D95078214 fbshipit-source-id: 1a21361565fd7915a3a597ac729cecc2cfe99961 --- scripts/cxx-api/parser/builders.py | 5 ++- scripts/cxx-api/parser/utils/__init__.py | 1 + .../cxx-api/parser/utils/text_resolution.py | 40 ++++++++++++++++++- .../snapshot.api | 2 +- .../should_handle_concept/snapshot.api | 2 +- .../should_handle_concept_indent/snapshot.api | 8 ++-- .../should_handle_deprecated_msg/snapshot.api | 4 +- .../snapshot.api | 2 +- .../snapshot.api | 4 +- .../snapshot.api | 4 +- .../snapshot.api | 2 +- .../snapshot.api | 4 +- .../snapshot.api | 8 ++-- .../snapshot.api | 4 +- .../snapshot.api | 2 +- .../snapshot.api | 2 +- .../snapshot.api | 2 +- .../snapshot.api | 4 +- .../snapshot.api | 2 +- .../snapshot.api | 2 +- .../should_strip_objc_macros/snapshot.api | 6 +-- 21 files changed, 75 insertions(+), 35 deletions(-) diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index 4dbd7466596..e3c0b772818 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -33,6 +33,7 @@ Argument, extract_qualifiers, InitializerType, + normalize_pointer_spacing, parse_qualified_path, resolve_linked_text_name, ) @@ -344,7 +345,9 @@ def get_property_member( if property_type.endswith("(^"): argsstring = member_def.get_argsstring() if argsstring: - property_type = f"{property_type}{property_name}{argsstring}" + # Normalize pointer spacing in the argsstring + normalized_argsstring = normalize_pointer_spacing(argsstring) + property_type = f"{property_type}{property_name}{normalized_argsstring}" property_name = "" return PropertyMember( diff --git a/scripts/cxx-api/parser/utils/__init__.py b/scripts/cxx-api/parser/utils/__init__.py index 25fd05b4183..248136e621f 100644 --- a/scripts/cxx-api/parser/utils/__init__.py +++ b/scripts/cxx-api/parser/utils/__init__.py @@ -18,6 +18,7 @@ extract_namespace_from_refid, InitializerType, normalize_angle_brackets, + normalize_pointer_spacing, resolve_linked_text_name, ) from .type_qualification import qualify_arguments, qualify_parsed_type, qualify_type_str diff --git a/scripts/cxx-api/parser/utils/text_resolution.py b/scripts/cxx-api/parser/utils/text_resolution.py index 497e1267a5d..8d5e7c46ad2 100644 --- a/scripts/cxx-api/parser/utils/text_resolution.py +++ b/scripts/cxx-api/parser/utils/text_resolution.py @@ -83,13 +83,46 @@ def extract_namespace_from_refid(refid: str) -> str: def normalize_angle_brackets(text: str) -> str: """Doxygen adds spaces around < and > to avoid XML ambiguity. - e.g. "NSArray< id< RCTBridgeMethod > > *" -> "NSArray> *" + e.g. "NSArray< id< RCTBridgeMethod > > *" -> "NSArray>*" """ text = re.sub(r"<\s+", "<", text) text = re.sub(r"\s+>", ">", text) return text +def normalize_pointer_spacing(text: str) -> str: + """Normalize spacing around pointer (*) and reference (&, &&) symbols. + + Doxygen outputs types with a space before * and &, e.g.: + - "NSString *" -> "NSString*" + - "int &" -> "int&" + - "T &&" -> "T&&" + + But for function arguments like "NSString *name", we want "NSString* name" + (space moved from before * to after *). + + This normalizes to have no space before the pointer/reference symbol, + while preserving the space after if there's an identifier following. + """ + # For patterns like "Type *name" -> "Type* name" (move space from before to after) + # Match: word/type character or > followed by space(s), then *, then word char + text = re.sub(r"(\w|>)\s+\*(\w)", r"\1* \2", text) + # For patterns like "Type *" at end or before comma/paren/angle/open-paren -> "Type*" + text = re.sub(r"(\w|>)\s+\*(?=\s*[,)>(]|$)", r"\1*", text) + # For patterns like "Type *" followed by another * (pointer to pointer) + text = re.sub(r"(\w|>)\s+\*(?=\*)", r"\1*", text) + + # Same for && (rvalue reference) + text = re.sub(r"(\w|>)\s+&&(\w)", r"\1&& \2", text) + text = re.sub(r"(\w|>)\s+&&(?=\s*[,)>(]|$)", r"\1&&", text) + + # Same for & (lvalue reference) - but don't match && + text = re.sub(r"(\w|>)\s+&(?!&)(\w)", r"\1& \2", text) + text = re.sub(r"(\w|>)\s+&(?!&)(?=\s*[,)>(]|$)", r"\1&", text) + + return text + + class InitializerType(Enum): NONE = (0,) ASSIGNMENT = (1,) @@ -145,7 +178,10 @@ def resolve_linked_text_name( initialier_type = InitializerType.BRACE name = name[1:-1].strip() - return (normalize_angle_brackets(name.strip()), initialier_type) + return ( + normalize_pointer_spacing(normalize_angle_brackets(name.strip())), + initialier_type, + ) def _qualify_text_with_refid(text: str, refid: str) -> str: diff --git a/scripts/cxx-api/tests/snapshots/should_handle_class_public_method_arguments/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_class_public_method_arguments/snapshot.api index f0d525d1c1c..264305555fc 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_class_public_method_arguments/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_class_public_method_arguments/snapshot.api @@ -10,7 +10,7 @@ class test::Clss { public void fn7(std::vector>> v); public void fn8(std::map> m); public void fn9(int(*)(int, int) callback); - public void fn10(void(*)(const char *, size_t) handler); + public void fn10(void(*)(const char*, size_t) handler); public void fn11(int(*(*fp)(int))(double)); public void fn12(int x = 5, std::string s = "default"); public void fn13(std::function f = nullptr); diff --git a/scripts/cxx-api/tests/snapshots/should_handle_concept/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_concept/snapshot.api index 1b3a474c3a0..e3b332471d7 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_concept/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_concept/snapshot.api @@ -1,4 +1,4 @@ template -concept test::CSSParserSink = requires(CSSSyntaxParser &parser) { +concept test::CSSParserSink = requires(CSSSyntaxParser& parser) { { T::consume(parser) } -> std::convertible_to; }; diff --git a/scripts/cxx-api/tests/snapshots/should_handle_concept_indent/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_concept_indent/snapshot.api index 8ed0e695f88..28740457b61 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_concept_indent/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_concept_indent/snapshot.api @@ -1,9 +1,9 @@ template -concept test::CSSUniqueComponentValueVisitors = CSSSyntaxVisitorReturn && (CSSComponentValueVisitor && ...) && - ((CSSFunctionVisitor ? 1 : 0) + ... + 0) <= 1 && - ((CSSPreservedTokenVisitor ? 1 : 0) + ... + 0) <= 1 && +concept test::CSSUniqueComponentValueVisitors = CSSSyntaxVisitorReturn&& (CSSComponentValueVisitor && ...) && + ((CSSFunctionVisitor ? 1 : 0) + ... + 0) <= 1&& + ((CSSPreservedTokenVisitor ? 1 : 0) + ... + 0) <= 1&& ((CSSSimpleBlockVisitor ? 1 : 0) + ... + 0) <= 1; template -concept test::CSSParserSink = requires(CSSSyntaxParser &parser) { +concept test::CSSParserSink = requires(CSSSyntaxParser& parser) { { T::consume(parser) } -> std::convertible_to; }; diff --git a/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api index 65e0334c1d0..3e8df8d033e 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_deprecated_msg/snapshot.api @@ -6,8 +6,8 @@ interface RCTDeprecatedInterface { } interface RCTTestInterface { - public virtual NSArray * deprecatedMethod:(id param); - public virtual void normalMethod:(NSString * name); + public virtual NSArray* deprecatedMethod:(id param); + public virtual void normalMethod:(NSString* name); } protocol RCTDeprecatedProtocol { diff --git a/scripts/cxx-api/tests/snapshots/should_handle_function_pointer_variable/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_function_pointer_variable/snapshot.api index 9ad3ff78f6b..2ca7bdec336 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_function_pointer_variable/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_function_pointer_variable/snapshot.api @@ -1,5 +1,5 @@ struct test::FunctionPointers { public int(*withReturn)(double, float); - public void *(*returnsPointer)(const char *); public void(*simple)(int); + public void*(*returnsPointer)(const char *); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api index 01e1b9d3f9c..4293bf02625 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_block_property/snapshot.api @@ -1,5 +1,5 @@ interface RCTInterfaceWithBlockProperty : public NSObject { - public @property (copy) NSString *(^blockWithReturn)(int value); - public @property (copy) void(^eventInterceptor)(NSString *eventName, NSDictionary *event, NSNumber *reactTag); + public @property (copy) NSString*(^blockWithReturn)(int value); + public @property (copy) void(^eventInterceptor)(NSString* eventName, NSDictionary* event, NSNumber* reactTag); public @property (copy) void(^simpleBlock)(void); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api index 09d8acf7014..df124af7b02 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_method/snapshot.api @@ -1,5 +1,5 @@ interface RCTInterfaceWithMethod { - public virtual NSString * getTitle(); + public virtual NSString* getTitle(); public virtual void doSomething(); - public virtual void processValue:withName:(int value, NSString * name); + public virtual void processValue:withName:(int value, NSString* name); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api index b5649f46485..a478845b700 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_interface_with_property/snapshot.api @@ -1,5 +1,5 @@ interface RCTInterfaceWithProperty { public @property (assign) BOOL enabled; - public @property (copy) NSString * title; + public @property (copy) NSString* title; public @property (weak) id delegate; } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api index bf63be61569..522f4d92cdd 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_method_with_attribute/snapshot.api @@ -1,4 +1,4 @@ interface RCTTestInterface { - public virtual NSArray * interfaceDeprecatedMethod:(id param); - public virtual void normalMethod:(NSString * name); + public virtual NSArray* interfaceDeprecatedMethod:(id param); + public virtual void normalMethod:(NSString* name); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api index 32cebd4b82f..d3f3804fada 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api @@ -1,12 +1,12 @@ category RCTConvert(CategoryOne) { - public virtual static NSString * methodOne:(id json); + public virtual static NSString* methodOne:(id json); } category RCTConvert(CategoryTwo) { - public virtual static NSString * methodTwo:(id json); + public virtual static NSString* methodTwo:(id json); } interface RCTConvert : public NSObject { - public virtual static NSString * methodOne:(id json); - public virtual static NSString * methodTwo:(id json); + public virtual static NSString* methodOne:(id json); + public virtual static NSString* methodTwo:(id json); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_method/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_method/snapshot.api index 3cd0361bbc0..3ca06a48508 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_method/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_method/snapshot.api @@ -1,5 +1,5 @@ protocol RCTProtocolWithMethod { - public virtual NSString * getTitle(); + public virtual NSString* getTitle(); public virtual void doSomething(); - public virtual void processValue:withName:(int value, NSString * name); + public virtual void processValue:withName:(int value, NSString* name); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_property/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_property/snapshot.api index c2322a45e0b..1b95f53fce4 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_property/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_protocol_with_property/snapshot.api @@ -1,5 +1,5 @@ protocol RCTProtocolWithProperty { public @property (assign) BOOL enabled; - public @property (copy) NSString * title; + public @property (copy) NSString* title; public @property (weak) id delegate; } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_pure_virtual_trailing_return/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_pure_virtual_trailing_return/snapshot.api index ea4b88b13cd..d814c71a0dd 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_pure_virtual_trailing_return/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_pure_virtual_trailing_return/snapshot.api @@ -1,5 +1,5 @@ class test::Base { - public virtual const char * getName() = 0; + public virtual const char* getName() = 0; public virtual std::vector getMethods() = 0; } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_unnamed_template_param_with_default_value/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_unnamed_template_param_with_default_value/snapshot.api index 2e9194009db..50a277c93f2 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_unnamed_template_param_with_default_value/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_unnamed_template_param_with_default_value/snapshot.api @@ -12,5 +12,5 @@ class test::Symbol { struct test::Value { template ::value || std::is_base_of::value || std::is_base_of::value || std::is_base_of::value>> - public Value(T && other); + public Value(T&& other); } diff --git a/scripts/cxx-api/tests/snapshots/should_not_requalify_globally_qualified_type/snapshot.api b/scripts/cxx-api/tests/snapshots/should_not_requalify_globally_qualified_type/snapshot.api index af18855b4a5..88badbbccb0 100644 --- a/scripts/cxx-api/tests/snapshots/should_not_requalify_globally_qualified_type/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_not_requalify_globally_qualified_type/snapshot.api @@ -1,7 +1,7 @@ struct other::Consumer { public ::test::inner::MyType create(); - public void process(const ::test::inner::MyType & param); - public void processPtr(::test::inner::MyType * param); + public void process(const ::test::inner::MyType& param); + public void processPtr(::test::inner::MyType* param); } diff --git a/scripts/cxx-api/tests/snapshots/should_qualify_nested_template_type_with_underscore/snapshot.api b/scripts/cxx-api/tests/snapshots/should_qualify_nested_template_type_with_underscore/snapshot.api index 616760305e9..1f67e496a5b 100644 --- a/scripts/cxx-api/tests/snapshots/should_qualify_nested_template_type_with_underscore/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_qualify_nested_template_type_with_underscore/snapshot.api @@ -1,5 +1,5 @@ template -facebook::react::detail::is_dynamic::type & facebook::react::jsArgAsDynamic(T && args, size_t n); +facebook::react::detail::is_dynamic::type& facebook::react::jsArgAsDynamic(T&& args, size_t n); template diff --git a/scripts/cxx-api/tests/snapshots/should_qualify_ptr_const_args/snapshot.api b/scripts/cxx-api/tests/snapshots/should_qualify_ptr_const_args/snapshot.api index a75e6cc67a1..ec31650e946 100644 --- a/scripts/cxx-api/tests/snapshots/should_qualify_ptr_const_args/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_qualify_ptr_const_args/snapshot.api @@ -1 +1 @@ -void test::doSomething(const Node *const node, int x); +void test::doSomething(const Node* const node, int x); diff --git a/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api b/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api index b0c18447476..e42d0b90b9d 100644 --- a/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_strip_objc_macros/snapshot.api @@ -1,14 +1,14 @@ interface RCTTestMacros { public @property (strong, readonly) dispatch_queue_t methodQueue; public @property (weak, readonly) id bridge; - public virtual instancetype initWithDelegate:options:(id delegate, NSDictionary * options); - public virtual instancetype initWithName:(NSString * name); + public virtual instancetype initWithDelegate:options:(id delegate, NSDictionary* options); + public virtual instancetype initWithName:(NSString* name); public virtual static UIUserInterfaceStyle userInterfaceStyle(); public virtual void deprecatedMethod(); } protocol RCTTestProtocol { - public @property (assign, readonly) NSString * name; + public @property (assign, readonly) NSString* name; public virtual void normalMethod(); public virtual void requiredMethod(); } From 97430c8165b5c2e852f211de83fd571341fa1a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 087/595] Include definitions behind __cplusplus macro (#55902) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55902 Includes definitions behind the `__cplusplus` macro to also be visible in the API snapshot. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D95189538 fbshipit-source-id: 35a632b83b6d6c4f330ac80b52b4ee203f692748 --- scripts/cxx-api/config.yml | 1 + .../tests/snapshots/.doxygen.config.template | 3 ++- .../should_handle_ifdef_cplusplus/snapshot.api | 7 +++++++ .../should_handle_ifdef_cplusplus/test.h | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/test.h diff --git a/scripts/cxx-api/config.yml b/scripts/cxx-api/config.yml index 65ceefb0022..78a1f74a985 100644 --- a/scripts/cxx-api/config.yml +++ b/scripts/cxx-api/config.yml @@ -61,6 +61,7 @@ ReactApple: - "*/platform/macos/*" - "*/platform/android/*" definitions: + __cplusplus: 1 variants: debug: definitions: diff --git a/scripts/cxx-api/tests/snapshots/.doxygen.config.template b/scripts/cxx-api/tests/snapshots/.doxygen.config.template index f5f56836001..00ae22eb9d2 100644 --- a/scripts/cxx-api/tests/snapshots/.doxygen.config.template +++ b/scripts/cxx-api/tests/snapshots/.doxygen.config.template @@ -2442,7 +2442,8 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = FOLLY_PACK_PUSH="" \ +PREDEFINED = __cplusplus=1 \ + FOLLY_PACK_PUSH="" \ FOLLY_PACK_POP="" \ FOLLY_PACK_ATTR="" \ __attribute__(x)="" \ diff --git a/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api new file mode 100644 index 00000000000..eb5f4fcd4d9 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api @@ -0,0 +1,7 @@ +category RCTBridgeProxy(Cxx) { + public @property (assign) int cxxOnlyProperty; +} + +interface RCTBridgeProxy : public NSObject { + public @property (assign) int cxxOnlyProperty; +} diff --git a/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/test.h b/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/test.h new file mode 100644 index 00000000000..fe2a5d4afcc --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/test.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface RCTBridgeProxy : NSObject + +@end + +@interface RCTBridgeProxy (Cxx) + +#ifdef __cplusplus +@property (nonatomic, readwrite) int cxxOnlyProperty; +#endif + +@end From 725b056dc7a72d65f9beb4ce8894fa9f91054740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 088/595] Filter category members from interface scope (#55899) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55899 Doxygen incorrectly merges category members into the base interface XML output. This causes duplicate members to appear in both the category scope and the interface scope. The fix detects category members by checking if their definition contains the pattern `ClassName(CategoryName)::` (e.g., `RCTBridgeProxy(Cxx)::cxxOnlyProperty`) and filters them out when processing interface sections. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D95191148 fbshipit-source-id: 69d2f35d5aabd8e7567d254dc9b4686b4da2eb89 --- scripts/cxx-api/parser/builders.py | 34 +++++++++++++++++++ .../snapshot.api | 1 - .../snapshot.api | 2 -- .../snapshot.api | 1 - .../snapshot.api | 2 -- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index e3c0b772818..95c8dba7faf 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -389,15 +389,40 @@ def create_enum_scope(snapshot: Snapshot, enum_def: compound.EnumdefType) -> Non ) +def _is_category_member(member_def: compound.MemberdefType) -> bool: + """ + Check if a member comes from a category based on its definition. + + Doxygen merges category members into the base interface XML output, but the + member's definition field contains the category name in parentheses, e.g.: + "int RCTBridgeProxy(Cxx)::cxxOnlyProperty" + + We use this to filter out category members from the interface scope. + """ + definition = member_def.definition + if not definition: + return False + + # Look for pattern: ClassName(CategoryName)::memberName + # The definition contains the qualified name with category info + return bool(re.search(r"\w+\([^)]+\)::", definition)) + + def _process_objc_sections( snapshot: Snapshot, scope, section_defs: list, location_file: str, scope_type: str, + filter_category_members: bool = False, ) -> None: """ Common section processing for protocols and interfaces. + + Args: + filter_category_members: If True, skip members that come from categories. + This is used for interfaces since Doxygen incorrectly merges category + members into the base interface XML output. """ for section_def in section_defs: kind = section_def.kind @@ -412,11 +437,15 @@ def _process_objc_sections( if member_type == "attrib": for member_def in section_def.memberdef: if member_def.kind == "variable": + if filter_category_members and _is_category_member(member_def): + continue scope.add_member( get_variable_member(member_def, visibility, is_static) ) elif member_type == "func": for function_def in section_def.memberdef: + if filter_category_members and _is_category_member(function_def): + continue scope.add_member( get_function_member(function_def, visibility, is_static) ) @@ -425,6 +454,8 @@ def _process_objc_sections( if member_def.kind == "enum": create_enum_scope(snapshot, member_def) elif member_def.kind == "typedef": + if filter_category_members and _is_category_member(member_def): + continue scope.add_member(get_typedef_member(member_def, visibility)) else: print( @@ -435,6 +466,8 @@ def _process_objc_sections( elif visibility == "property": for member_def in section_def.memberdef: if member_def.kind == "property": + if filter_category_members and _is_category_member(member_def): + continue scope.add_member( get_property_member(member_def, "public", is_static) ) @@ -504,6 +537,7 @@ def create_interface_scope( scope_def.sectiondef, scope_def.location.file, "interface", + filter_category_members=True, ) diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api index a09b6d80df7..55910acb2ed 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_with_method/snapshot.api @@ -3,5 +3,4 @@ category RCTConvert(UIActivityIndicatorView) { } interface RCTConvert : public NSObject { - public virtual static UIActivityIndicatorViewStyle UIActivityIndicatorViewStyle:(id json); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api index 1c99214249a..8159b254a2c 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_category_with_multiple_methods/snapshot.api @@ -4,6 +4,4 @@ category RCTConvert(Transform) { } interface RCTConvert : public NSObject { - public virtual static CATransform3D CATransform3D:(id json); - public virtual static RCTTransformOrigin RCTTransformOrigin:(id json); } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api index eb5f4fcd4d9..2ce3fc4be46 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_ifdef_cplusplus/snapshot.api @@ -3,5 +3,4 @@ category RCTBridgeProxy(Cxx) { } interface RCTBridgeProxy : public NSObject { - public @property (assign) int cxxOnlyProperty; } diff --git a/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api index d3f3804fada..b1e280967e5 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_multiple_categories/snapshot.api @@ -7,6 +7,4 @@ category RCTConvert(CategoryTwo) { } interface RCTConvert : public NSObject { - public virtual static NSString* methodOne:(id json); - public virtual static NSString* methodTwo:(id json); } From 78c8842f9e85387bd3d87f8d96faab35913820d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 089/595] Normalize Objective-C nullability annotations (#55898) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55898 Normalize Objective-C nullability annotations in the cxx-api parser to ensure consistent output in API snapshots. Objective-C has three different forms of nullability annotations that are semantically equivalent: - `nonnull`/`nullable` (context-sensitive keywords) - `_Nonnull`/`_Nullable` (type qualifiers) - `__nonnull`/`__nullable` (legacy Apple macros) This diff normalizes all forms to `_Nonnull`/`_Nullable` for consistency. **Examples:** - `nonnull NSString*` → `_Nonnull NSString*` - `NSString* __nonnull` → `NSString* _Nonnull` - `nullable id` → `_Nullable id` - `id __nullable` → `id _Nullable` - `NSString* _Nonnull` → `NSString* _Nonnull` (unchanged) Added a test case to verify the normalization works correctly. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D95195669 fbshipit-source-id: ca2afd14b3c8bf7e62864daf9c3848f5d713898e --- .../cxx-api/parser/utils/text_resolution.py | 28 ++++++++++++++++++- .../should_normalize_nullability/snapshot.api | 10 +++++++ .../should_normalize_nullability/test.h | 21 ++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_normalize_nullability/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_normalize_nullability/test.h diff --git a/scripts/cxx-api/parser/utils/text_resolution.py b/scripts/cxx-api/parser/utils/text_resolution.py index 8d5e7c46ad2..e9b67f64203 100644 --- a/scripts/cxx-api/parser/utils/text_resolution.py +++ b/scripts/cxx-api/parser/utils/text_resolution.py @@ -90,6 +90,30 @@ def normalize_angle_brackets(text: str) -> str: return text +def normalize_nullability(text: str) -> str: + """Normalize Objective-C nullability annotations to a consistent form. + + There are three forms of nullability annotations in Objective-C: + - nonnull/nullable (context-sensitive keywords, typically used as prefix) + - _Nonnull/_Nullable (type qualifiers, can appear after the type) + - __nonnull/__nullable (legacy Apple macros, deprecated but still used) + + This function normalizes all forms to _Nonnull/_Nullable, which is the + most flexible form that can be used in any position. + """ + # Normalize __nonnull -> _Nonnull (must come before nonnull) + text = re.sub(r"\b__nonnull\b", "_Nonnull", text) + # Normalize nonnull -> _Nonnull (negative lookbehind to avoid _Nonnull) + text = re.sub(r"(? _Nullable (must come before nullable) + text = re.sub(r"\b__nullable\b", "_Nullable", text) + # Normalize nullable -> _Nullable (negative lookbehind to avoid _Nullable) + text = re.sub(r"(? str: """Normalize spacing around pointer (*) and reference (&, &&) symbols. @@ -179,7 +203,9 @@ def resolve_linked_text_name( name = name[1:-1].strip() return ( - normalize_pointer_spacing(normalize_angle_brackets(name.strip())), + normalize_nullability( + normalize_pointer_spacing(normalize_angle_brackets(name.strip())) + ), initialier_type, ) diff --git a/scripts/cxx-api/tests/snapshots/should_normalize_nullability/snapshot.api b/scripts/cxx-api/tests/snapshots/should_normalize_nullability/snapshot.api new file mode 100644 index 00000000000..dc16c53ac34 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_normalize_nullability/snapshot.api @@ -0,0 +1,10 @@ +interface NullabilityTest : public NSObject { + public @property (assign) NSString* nonnullProperty; + public @property (assign) NSString* nullableProperty; + public virtual NSString* _Nonnull legacyNonnullMethod(); + public virtual NSString* _Nonnull modernNonnullMethod(); + public virtual NSString* _Nullable legacyNullableMethod(); + public virtual NSString* _Nullable modernNullableMethod(); + public virtual _Nonnull NSString* nonnullMethod(); + public virtual _Nullable NSString* nullableMethod(); +} diff --git a/scripts/cxx-api/tests/snapshots/should_normalize_nullability/test.h b/scripts/cxx-api/tests/snapshots/should_normalize_nullability/test.h new file mode 100644 index 00000000000..b702b80276b --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_normalize_nullability/test.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +@interface NullabilityTest : NSObject + +// Different nullability annotation styles that should be normalized +- (nonnull NSString *)nonnullMethod; +- (nullable NSString *)nullableMethod; +- (NSString *__nonnull)legacyNonnullMethod; +- (NSString *__nullable)legacyNullableMethod; +- (NSString *_Nonnull)modernNonnullMethod; +- (NSString *_Nullable)modernNullableMethod; + +@property (nonatomic, nonnull) NSString *nonnullProperty; +@property (nonatomic, nullable) NSString *nullableProperty; + +@end From dc8c442aa57d7d75a51af4254654c63e46a5385c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Thu, 5 Mar 2026 07:21:42 -0800 Subject: [PATCH 090/595] Normalize template specialization angle bracket spacing (#55910) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55910 Normalizes angle bracket spacing in scope names for template specializations. Doxygen encodes template specializations with spaces around angle brackets in compound names (e.g., `CSSDataTypeParser< CSSMatrix >`). This caused inconsistent output in API snapshots. The fix applies `normalize_angle_brackets()` to qualified paths when parsing scope names, ensuring consistent output: - `CSSDataTypeParser< CSSMatrix >` → `CSSDataTypeParser` - `Callback< R(Args...)>` → `Callback` Added a new test case `should_normalize_template_specialization_angle_brackets` to verify the fix. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D95204780 fbshipit-source-id: d0d5fe7759a414b32630647f334b39e26da15108 --- scripts/cxx-api/parser/__main__.py | 5 +++ scripts/cxx-api/parser/builders.py | 3 +- .../cxx-api/parser/utils/qualified_path.py | 7 +++ .../snapshot.api | 2 +- .../snapshot.api | 17 +++++++ .../test.h | 44 +++++++++++++++++++ 6 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/snapshot.api create mode 100644 scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/test.h diff --git a/scripts/cxx-api/parser/__main__.py b/scripts/cxx-api/parser/__main__.py index 2d7a8cfd52c..49270bad790 100644 --- a/scripts/cxx-api/parser/__main__.py +++ b/scripts/cxx-api/parser/__main__.py @@ -201,6 +201,7 @@ def main(): "input_filters", "doxygen_strip_comments.py", ) + input_filter = None if os.path.exists(input_filter_path): input_filter = f"python3 {input_filter_path}" @@ -263,3 +264,7 @@ def build_snapshots(output_dir: str, verbose: bool) -> None: ) ) build_snapshots(output_dir, verbose=True) + + +if __name__ == "__main__": + main() diff --git a/scripts/cxx-api/parser/builders.py b/scripts/cxx-api/parser/builders.py index 95c8dba7faf..47b3eb2ed40 100644 --- a/scripts/cxx-api/parser/builders.py +++ b/scripts/cxx-api/parser/builders.py @@ -33,6 +33,7 @@ Argument, extract_qualifiers, InitializerType, + normalize_angle_brackets, normalize_pointer_spacing, parse_qualified_path, resolve_linked_text_name, @@ -59,7 +60,7 @@ def get_base_classes( # - prot: protection level (public, protected, private) # - virt: virtual inheritance (non-virtual, virtual, pure-virtual) # - valueOf_: the name of the base class - base_name = base.valueOf_ + base_name = normalize_angle_brackets(base.valueOf_) base_prot = base.prot base_virt = base.virt base_refid = base.refid diff --git a/scripts/cxx-api/parser/utils/qualified_path.py b/scripts/cxx-api/parser/utils/qualified_path.py index 1010ca6a6cd..95d06d3581b 100644 --- a/scripts/cxx-api/parser/utils/qualified_path.py +++ b/scripts/cxx-api/parser/utils/qualified_path.py @@ -5,6 +5,8 @@ from __future__ import annotations +from .text_resolution import normalize_angle_brackets + def parse_qualified_path(path: str) -> list[str]: """ @@ -19,7 +21,12 @@ def parse_qualified_path(path: str) -> list[str]: - Comparison operators inside parentheses: "std::enable_if<(N > 0)>::type" - Arrow operators: "decltype(ptr->member)::type" - Bitshift operators: "std::integral_constant> 2)>::value" + + Normalizes angle bracket spacing (e.g., "Foo< Bar >" -> "Foo"). """ + # Normalize angle bracket spacing before parsing + path = normalize_angle_brackets(path) + result = [] current = "" angle_depth = 0 diff --git a/scripts/cxx-api/tests/snapshots/should_handle_template_specialization_self_reference/snapshot.api b/scripts/cxx-api/tests/snapshots/should_handle_template_specialization_self_reference/snapshot.api index a21de2ffbd2..8baf3d8840b 100644 --- a/scripts/cxx-api/tests/snapshots/should_handle_template_specialization_self_reference/snapshot.api +++ b/scripts/cxx-api/tests/snapshots/should_handle_template_specialization_self_reference/snapshot.api @@ -3,7 +3,7 @@ class test::Callback { } template -class test::Callback< R(Args...)> { +class test::Callback { public Callback(const test::Callback&) = delete; public Callback(test::Callback&& other) noexcept; public R call(Args... args) const; diff --git a/scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/snapshot.api b/scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/snapshot.api new file mode 100644 index 00000000000..54af97aa469 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/snapshot.api @@ -0,0 +1,17 @@ +class AndroidSwitchComponentDescriptor : public ConcreteComponentDescriptor { + public AndroidSwitchComponentDescriptor(const ComponentDescriptorParameters& parameters); + public void adopt(ShadowNode& shadowNode) const; +} + +struct CSSDataTypeParser { + public static constexpr std::optional consumeFunctionBlock(const CSSFunctionBlock& func, CSSValueParser& parser); +} + +struct CSSMatrix { + public constexpr bool operator==(const CSSMatrix& rhs) const = default; + public std::array values; +} + +template +class ConcreteComponentDescriptor { +} diff --git a/scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/test.h b/scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/test.h new file mode 100644 index 00000000000..f7eba86e456 --- /dev/null +++ b/scripts/cxx-api/tests/snapshots/should_normalize_template_specialization_angle_brackets/test.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +struct CSSMatrix { + std::array values{}; + + constexpr bool operator==(const CSSMatrix &rhs) const = default; +}; + +template <> +struct CSSDataTypeParser { + static constexpr auto consumeFunctionBlock(const CSSFunctionBlock &func, CSSValueParser &parser) + -> std::optional + { + if (!iequals(func.name, "matrix")) { + return {}; + } + + CSSMatrix matrix{}; + for (int i = 0; i < 6; i++) { + auto value = parser.parseNextValue(i == 0 ? CSSDelimiter::None : CSSDelimiter::Comma); + if (std::holds_alternative(value)) { + return {}; + } + matrix.values[i] = std::get(value).value; + } + + return matrix; + } +}; + +// Test base class inheritance with template angle brackets +template +class ConcreteComponentDescriptor {}; + +class AndroidSwitchComponentDescriptor : public ConcreteComponentDescriptor { + public: + AndroidSwitchComponentDescriptor(const ComponentDescriptorParameters ¶meters); + void adopt(ShadowNode &shadowNode) const; +}; From dc4c36e7d9c5d13c2b97217c07c9cbc55c02f7ed Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Thu, 5 Mar 2026 09:37:57 -0800 Subject: [PATCH 091/595] Move screenshot Base64 encoding to trace serialization (#55803) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55803 Refactor Android FrameTimings to reduce memory usage in trace buffer. Binary data instead of Base64 should be ~25% smaller, and eliminates string copies during JNI transfer. Changelog: [Internal] Reviewed By: rubennorte Differential Revision: D94657907 fbshipit-source-id: c4a183ff00c519fd1545992340fd445530abab99 --- .../inspector/FrameTimingSequence.kt | 2 +- .../inspector/FrameTimingsObserver.kt | 19 ++++++++++++++----- .../runtime/jni/JReactHostInspectorTarget.h | 13 +++++++++---- .../jsinspector-modern/tests/TracingTest.cpp | 2 +- .../jsinspector-modern/tracing/CMakeLists.txt | 1 + .../tracing/FrameTimingSequence.h | 10 +++++++--- .../tracing/React-jsinspectortracing.podspec | 1 + .../tracing/TraceEventGenerator.cpp | 17 ++++++++++++----- .../tracing/TraceEventGenerator.h | 4 +++- 9 files changed, 49 insertions(+), 20 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt index e6aa485371c..5eaae383eed 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingSequence.kt @@ -12,5 +12,5 @@ internal data class FrameTimingSequence( val threadId: Int, val beginTimestamp: Long, val endTimestamp: Long, - val screenshot: String? = null, + val screenshot: ByteArray? = null, ) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt index bf352f9b8f1..e7ce2e3b8e2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/FrameTimingsObserver.kt @@ -12,7 +12,6 @@ import android.os.Build import android.os.Handler import android.os.Looper import android.os.Process -import android.util.Base64 import android.view.FrameMetrics import android.view.PixelCopy import android.view.Window @@ -109,7 +108,7 @@ internal class FrameTimingsObserver( } // Must be called from the main thread so that PixelCopy captures the current frame. - private fun captureScreenshot(callback: (String?) -> Unit) { + private fun captureScreenshot(callback: (ByteArray?) -> Unit) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { callback(null) return @@ -143,7 +142,12 @@ internal class FrameTimingsObserver( ) } - private fun encodeScreenshot(window: Window, bitmap: Bitmap, width: Int, height: Int): String? { + private fun encodeScreenshot( + window: Window, + bitmap: Bitmap, + width: Int, + height: Int, + ): ByteArray? { var scaledBitmap: Bitmap? = null return try { val density = window.context.resources.displayMetrics.density @@ -155,9 +159,9 @@ internal class FrameTimingsObserver( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) Bitmap.CompressFormat.WEBP_LOSSY else Bitmap.CompressFormat.JPEG - ByteArrayOutputStream().use { outputStream -> + ByteArrayOutputStream(SCREENSHOT_OUTPUT_SIZE_HINT).use { outputStream -> scaledBitmap.compress(compressFormat, SCREENSHOT_QUALITY, outputStream) - Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP) + outputStream.toByteArray() } } catch (e: Exception) { null @@ -170,5 +174,10 @@ internal class FrameTimingsObserver( companion object { private const val SCREENSHOT_SCALE_FACTOR = 0.75f private const val SCREENSHOT_QUALITY = 80 + + // Capacity hint for the ByteArrayOutputStream used during bitmap + // compression. Sized slightly above typical compressed output to minimise + // internal buffer resizing. + private const val SCREENSHOT_OUTPUT_SIZE_HINT = 65536 // 64 KB } } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h index 5f69f05829d..761fbb6b892 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h @@ -7,6 +7,7 @@ #pragma once +#include #include #include @@ -98,13 +99,17 @@ struct JFrameTimingSequence : public jni::JavaClass { std::chrono::steady_clock::time_point(std::chrono::nanoseconds(getFieldValue(field)))); } - std::optional getScreenshot() const + std::optional> getScreenshot() const { - auto field = javaClassStatic()->getField("screenshot"); + auto field = javaClassStatic()->getField("screenshot"); auto javaScreenshot = getFieldValue(field); if (javaScreenshot) { - auto jstring = jni::static_ref_cast(javaScreenshot); - return jstring->toStdString(); + auto size = static_cast(javaScreenshot->size()); + if (size > 0) { + std::vector result(size); + javaScreenshot->getRegion(0, javaScreenshot->size(), reinterpret_cast(result.data())); + return result; + } } return std::nullopt; } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tests/TracingTest.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tests/TracingTest.cpp index ffd3d4a05bf..c371e76349e 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tests/TracingTest.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tests/TracingTest.cpp @@ -103,7 +103,7 @@ TEST_F(TracingTest, EmitsScreenshotEventWhenScreenshotValuePassed) { 11, // threadId now, now + HighResDuration::fromNanoseconds(50), - "base64EncodedScreenshotData")); + std::vector{})); auto allTraceEvents = endTracingAndCollectEvents(); EXPECT_THAT(allTraceEvents, Contains(AtJsonPtr("/name", "Screenshot"))); diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt b/packages/react-native/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt index cfd3ba84b28..f0c7cd063c4 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/CMakeLists.txt @@ -22,6 +22,7 @@ target_link_libraries(jsinspector_tracing jsinspector_network oscompat react_timing + react_utils ) target_compile_reactnative_options(jsinspector_tracing PRIVATE) target_compile_options(jsinspector_tracing PRIVATE -Wpedantic) diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h b/packages/react-native/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h index 65d492276ae..6aa0db5d174 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/FrameTimingSequence.h @@ -11,6 +11,10 @@ #include +#include +#include +#include + namespace facebook::react::jsinspector_modern::tracing { using FrameSequenceId = uint64_t; @@ -26,7 +30,7 @@ struct FrameTimingSequence { ThreadId threadId, HighResTimeStamp beginTimestamp, HighResTimeStamp endTimestamp, - std::optional screenshot = std::nullopt) + std::optional> screenshot = std::nullopt) : id(id), threadId(threadId), beginTimestamp(beginTimestamp), @@ -49,9 +53,9 @@ struct FrameTimingSequence { HighResTimeStamp endTimestamp; /** - * Optional screenshot data (base64 encoded) captured during the frame. + * Optional screenshot data captured during the frame. */ - std::optional screenshot; + std::optional> screenshot; }; } // namespace facebook::react::jsinspector_modern::tracing diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec b/packages/react-native/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec index 38675d36751..1b988ab698c 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec @@ -47,6 +47,7 @@ Pod::Spec.new do |s| s.dependency "React-jsi" s.dependency "React-oscompat" s.dependency "React-timing" + add_dependency(s, "React-utils", :additional_framework_paths => ["react/utils/platform/ios"]) if use_hermes() s.dependency "hermes-engine" diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp index 0c94276d76e..215c25e1bd8 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.cpp @@ -9,6 +9,8 @@ #include "Timing.h" #include "TracingCategory.h" +#include + namespace facebook::react::jsinspector_modern::tracing { /* static */ TraceEvent TraceEventGenerator::createSetLayerTreeIdEvent( @@ -70,14 +72,19 @@ TraceEventGenerator::createFrameTimingsEvents( /* static */ TraceEvent TraceEventGenerator::createScreenshotEvent( FrameSequenceId frameSequenceId, int sourceId, - std::string&& snapshot, + std::vector&& snapshot, HighResTimeStamp expectedDisplayTime, ProcessId processId, ThreadId threadId) { - folly::dynamic args = folly::dynamic::object("snapshot", std::move(snapshot))( - "source_id", sourceId)("frame_sequence", frameSequenceId)( - "expected_display_time", - highResTimeStampToTracingClockTimeStamp(expectedDisplayTime)); + // Convert binary data to string for Base64 encoding + std::string snapshotBytes(snapshot.begin(), snapshot.end()); + std::string base64Snapshot = base64Encode(snapshotBytes); + + folly::dynamic args = + folly::dynamic::object("snapshot", std::move(base64Snapshot))( + "source_id", sourceId)("frame_sequence", frameSequenceId)( + "expected_display_time", + highResTimeStampToTracingClockTimeStamp(expectedDisplayTime)); return TraceEvent{ .name = "Screenshot", diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h b/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h index 26db3d49968..898fba6ef72 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/TraceEventGenerator.h @@ -12,7 +12,9 @@ #include #include +#include #include +#include namespace facebook::react::jsinspector_modern::tracing { @@ -49,7 +51,7 @@ class TraceEventGenerator { static TraceEvent createScreenshotEvent( FrameSequenceId frameSequenceId, int sourceId, - std::string &&snapshot, + std::vector &&snapshot, HighResTimeStamp expectedDisplayTime, ProcessId processId, ThreadId threadId); From 57e42c29d67aa535d576540288c3844b026def5f Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Thu, 5 Mar 2026 09:59:15 -0800 Subject: [PATCH 092/595] Add changelog for v0.83.3 (#55933) Summary: Add Changelog for 0.83.3 ## Changelog: [Internal] - Add Changelog for 0.83.3 Pull Request resolved: https://github.com/facebook/react-native/pull/55933 Test Plan: N/A Reviewed By: cortinico Differential Revision: D95392057 Pulled By: fabriziocucci fbshipit-source-id: 474198c25aa2e408c2dd20e2383f3ecdb1115437 --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ac2a222ff0..db8cc314552 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -191,6 +191,26 @@ - **Touch Handling**: Respect `cancelsTouchesInView` when canceling touches in `RCTSurfaceTouchHandler` ([5634e8a601](https://github.com/facebook/react-native/commit/5634e8a601caf0faa174bac3511929de767609ac) by [@intmain](https://github.com/intmain)) - **View**: Fix duplicate shadow bug during component recycling by cleaning up visual layers in prepareForRecycle ([7dcedf1def](https://github.com/facebook/react-native/commit/7dcedf1def880163ab7ca07b2575a8153029a925) by Atharv Soni) +## v0.83.3 + +### Added + +#### Android specific + +- **Dev Support**: [0.83] Add support for custom header in devsupport ([c8ab750148](https://github.com/facebook/react-native/commit/c8ab750148f318062a75f5294020e854d91969dc) by [@cortinico](https://github.com/cortinico)) + +### Changed + +- **CI**: Skip set-rn-artifacts-version for PRs targeting stable branches ([81223f27b7](https://github.com/facebook/react-native/commit/81223f27b7cba74a9c560614b3b9655e54b12b31) by [@cipolleschi](https://github.com/cipolleschi)) + +### Fixed + +- **Build**: [0.83] Fix rncore tarball extraction for EdenFS compatibility ([becef72f12](https://github.com/facebook/react-native/commit/becef72f1216430f9ac0c3e9c90c87a2167651d3) by [@cipolleschi](https://github.com/cipolleschi)) + +#### Android specific + +- **Gradle**: Fix included-build `gradle.properties` resolution for monorepos by reading from parent Gradle start parameters (`projectDir`/`currentDir`) before falling back to `../../android/gradle.properties`, so `hermesV1Enabled` can be inherited correctly. ([c5ae0c820a](https://github.com/facebook/react-native/commit/c5ae0c820a571141a43de980cb011d232fc2268f) by [@Titozzz](https://github.com/Titozzz)) + ## v0.83.2 ### Added From 43278f94d20f4750d2aca62311363e2be5205dd7 Mon Sep 17 00:00:00 2001 From: Andrew Datsenko Date: Thu, 5 Mar 2026 11:14:41 -0800 Subject: [PATCH 093/595] Add toMatchInlineSnapshot support (#55892) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55892 Adds `toMatchInlineSnapshot()` to the Fantom custom `expect` implementation, matching Jest's inline snapshot behavior. On first run, snapshot values are written directly into the test source file as template literal arguments. On subsequent runs, values are compared and the test fails on mismatch unless the `-u` flag is passed to force an update. The implementation spans the two-process Fantom architecture: **Runtime (Hermes VM):** - `snapshotContext.js`: New `toMatchInlineSnapshot` method that compares received values against existing inline snapshots, captures stack traces for new/mismatched snapshots, and tracks results per test. - `expect.js`: New `toMatchInlineSnapshot` method on the `Expect` class that serializes values with `prettyFormat` and delegates to snapshot context. - `setup.js`: Plumbs `inlineSnapshotResults` through `TestCaseResult`. **Runner (Node.js):** - `snapshotUtils.js`: New `processInlineSnapshotResults` resolves VM stack traces back to original source locations via source map symbolication. New `saveInlineSnapshotsToSource` directly rewrites the test source file by finding each `toMatchInlineSnapshot(...)` call and replacing its argument with the formatted template literal. This avoids jest-snapshot's `saveInlineSnapshots` which requires Babel and Prettier 2.x. - `runner.js`: Generates source maps when inline snapshots need updating, collects pending snapshots across test configs, and writes them after all configs complete. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D95077617 fbshipit-source-id: 6a25c8ce966ed71ecd8977c13c25de5907311c6e --- private/react-native-fantom/runner/runner.js | 38 ++- .../runner/snapshotUtils.js | 249 +++++++++++++++++- private/react-native-fantom/runtime/expect.js | 24 ++ private/react-native-fantom/runtime/setup.js | 9 +- .../runtime/snapshotContext.js | 112 ++++++++ .../src/__tests__/expect-itest.js | 58 ++++ 6 files changed, 486 insertions(+), 4 deletions(-) diff --git a/private/react-native-fantom/runner/runner.js b/private/react-native-fantom/runner/runner.js index 20883c00377..66b586868b6 100644 --- a/private/react-native-fantom/runner/runner.js +++ b/private/react-native-fantom/runner/runner.js @@ -13,9 +13,13 @@ import type { TestCaseResult, TestSuiteResult, } from '../runtime/setup'; -import type {TestSnapshotResults} from '../runtime/snapshotContext'; +import type { + TestInlineSnapshotResults, + TestSnapshotResults, +} from '../runtime/snapshotContext'; import type {BenchmarkResult} from '../src/Benchmark'; import type {CoverageMap} from './coverage/types.flow'; +import type {PendingInlineSnapshot} from './snapshotUtils'; import type { AsyncCommandResult, ConsoleLogMessage, @@ -45,6 +49,8 @@ import { } from './paths'; import { getInitialSnapshotData, + processInlineSnapshotResults, + saveInlineSnapshotsToSource, updateSnapshotsAndGetJestSnapshotResult, } from './snapshotUtils'; import { @@ -239,6 +245,7 @@ module.exports = async function runTest( const testResultsByConfig = []; const benchmarkResults = []; + const allPendingInlineSnapshots: Array = []; const skippedTestResults = ({ ancestorTitles, @@ -255,6 +262,7 @@ module.exports = async function runTest( fullName: title, numPassingAsserts: 0, snapshotResults: {} as TestSnapshotResults, + inlineSnapshotResults: [] as TestInlineSnapshotResults, status: 'pending' as TestCaseResult['status'], testFilePath: testPath, title, @@ -414,7 +422,16 @@ module.exports = async function runTest( const [processedResult, benchmarkResult] = await processRNTesterCommandResult(rnTesterCommandResult); - if (containsError(processedResult) || EnvironmentOptions.profileJS) { + const hasInlineSnapshotUpdates = + processedResult.testResults?.some(r => + r.inlineSnapshotResults.some(ir => !ir.pass), + ) ?? false; + + if ( + containsError(processedResult) || + EnvironmentOptions.profileJS || + hasInlineSnapshotUpdates + ) { await createSourceMap({ ...bundleOptions, out: sourceMapPath, @@ -452,6 +469,20 @@ module.exports = async function runTest( snapshotResults: testResult.snapshotResults, })) ?? []; + // Process inline snapshot results (requires source map for symbolication) + if (hasInlineSnapshotUpdates) { + const inlineResults = nullthrows(processedResult.testResults).map( + r => r.inlineSnapshotResults, + ); + const pending = processInlineSnapshotResults( + snapshotState, + inlineResults, + sourceMapPath, + testPath, + ); + allPendingInlineSnapshots.push(...pending); + } + // Display the Fantom test configuration as a suffix of the name of the root // `describe` block of the test, or adds one if the test doesn't have it. const maybeCommonAncestor = testResults[0]?.ancestorTitles?.[0]; @@ -515,6 +546,9 @@ module.exports = async function runTest( } } + // Write pending inline snapshots to the test source file + saveInlineSnapshotsToSource(testPath, allPendingInlineSnapshots); + const endTime = Date.now(); const testResults = testResultsByConfig.flat(); diff --git a/private/react-native-fantom/runner/snapshotUtils.js b/private/react-native-fantom/runner/snapshotUtils.js index e008840bd00..e3cd2f0d168 100644 --- a/private/react-native-fantom/runner/snapshotUtils.js +++ b/private/react-native-fantom/runner/snapshotUtils.js @@ -8,9 +8,16 @@ * @format */ -import type {TestSnapshotResults} from '../runtime/snapshotContext'; +import type { + TestInlineSnapshotResults, + TestSnapshotResults, +} from '../runtime/snapshotContext'; import type {SnapshotState} from 'jest-snapshot'; +import {symbolicateStackTrace} from './utils'; +import fs from 'fs'; +import path from 'path'; + type JestSnapshotResult = { added: number, fileDeleted: boolean, @@ -46,6 +53,246 @@ export const getInitialSnapshotData = ( return initialData; }; +const STACK_FRAME_REGEX: RegExp = /at .* \((.+):(\d+):(\d+)\)/; + +/** + * Extract the frame from a symbolicated stack trace that points to the test file. + */ +function extractTestFileFrame( + symbolicatedStack: string, + testPath: string, +): {file: string, line: number, column: number} | null { + const testBaseName = path.basename(testPath); + const lines = symbolicatedStack.split('\n'); + + for (const line of lines) { + const match = line.match(STACK_FRAME_REGEX); + if (match) { + const file = match[1]; + const lineNumber = parseInt(match[2], 10); + const column = parseInt(match[3], 10); + + // Match by basename since source map paths may be relative + if (file.endsWith(testBaseName) || file === testPath) { + return {file, line: lineNumber, column}; + } + } + } + + return null; +} + +export type PendingInlineSnapshot = { + line: number, + snapshot: string, +}; + +/** + * Process inline snapshot results from the VM. Resolves stack traces to + * source locations and returns pending snapshots for source file rewriting. + * Also updates snapshotState counters. + */ +export const processInlineSnapshotResults = ( + snapshotState: SnapshotState, + inlineSnapshotResults: Array, + sourceMapPath: string, + testPath: string, +): Array => { + const pending: Array = []; + + for (const results of inlineSnapshotResults) { + for (const result of results) { + if (result.pass) { + snapshotState.matched++; + continue; + } + + // For new snapshots in CI mode, don't write + if (result.isNew && snapshotState._updateSnapshot === 'none') { + snapshotState.unmatched++; + continue; + } + + // For mismatches without -u, don't write to source + if (!result.isNew && snapshotState._updateSnapshot !== 'all') { + snapshotState.unmatched++; + continue; + } + + // Symbolicate stack trace to get original source location + const symbolicatedStack = symbolicateStackTrace( + sourceMapPath, + result.stackTrace, + ); + const frame = extractTestFileFrame(symbolicatedStack, testPath); + + if (frame == null) { + continue; + } + + pending.push({ + line: frame.line, + snapshot: result.value, + }); + + snapshotState._dirty = true; + if (result.isNew) { + snapshotState.added++; + snapshotState.matched++; + } else { + snapshotState.updated++; + } + } + } + + return pending; +}; + +/** + * Escape a string for use inside a template literal. + */ +function escapeForTemplateLiteral(str: string): string { + return str.replace(/`/g, '\\`').replace(/\$\{/g, '\\${'); +} + +/** + * Format a snapshot value as a template literal string for source insertion. + */ +function formatSnapshotAsTemplateLiteral( + snapshot: string, + baseIndent: string, +): string { + const escaped = escapeForTemplateLiteral(snapshot); + + if (!escaped.includes('\n')) { + return '`' + escaped + '`'; + } + + // Multiline: snapshot has \n prefix and \n suffix from addExtraLineBreaks. + // Indent content lines and place closing backtick at baseIndent. + const lines = escaped.split('\n'); + const result = lines.map((line, i) => { + if (i === 0) { + // Opening empty line (after the leading \n) + return line; + } + if (i === lines.length - 1) { + // Closing line: just the base indent before the backtick + return baseIndent; + } + if (line === '') { + return ''; + } + return baseIndent + ' ' + line; + }); + + return '`' + result.join('\n') + '`'; +} + +/** + * Find the offset of the closing paren that matches the open paren at + * `openParenOffset`. Handles template literals inside the arguments. + */ +function findMatchingParen(source: string, openParenOffset: number): number { + let depth = 1; + let i = openParenOffset + 1; + let inTemplate = false; + + while (i < source.length && depth > 0) { + const ch = source[i]; + + if (inTemplate) { + if (ch === '\\') { + i += 2; + continue; + } + if (ch === '`') { + inTemplate = false; + } + } else { + if (ch === '`') { + inTemplate = true; + } else if (ch === '(') { + depth++; + } else if (ch === ')') { + depth--; + if (depth === 0) { + return i; + } + } + } + + i++; + } + + return -1; +} + +/** + * Write pending inline snapshots directly into the test source file. + * Replaces argument of each `toMatchInlineSnapshot(...)` call at the + * resolved line with the formatted snapshot template literal. + */ +export function saveInlineSnapshotsToSource( + testPath: string, + pendingSnapshots: Array, +): void { + if (pendingSnapshots.length === 0) { + return; + } + + // Deduplicate by line (last value wins) + const byLine = new Map(); + for (const snapshot of pendingSnapshots) { + byLine.set(snapshot.line, snapshot); + } + + let source = fs.readFileSync(testPath, 'utf8'); + const originalLines = source.split('\n'); + + // Process in reverse line order so earlier offsets stay valid + const sorted = [...byLine.values()].sort((a, b) => b.line - a.line); + + for (const {line, snapshot} of sorted) { + const lineContent = originalLines[line - 1]; + if (lineContent == null) { + continue; + } + + const matcherIndex = lineContent.indexOf('toMatchInlineSnapshot'); + if (matcherIndex === -1) { + continue; + } + + const parenIndex = lineContent.indexOf('(', matcherIndex); + if (parenIndex === -1) { + continue; + } + + // Compute character offset of the open paren in the current source + let lineOffset = 0; + for (let i = 0; i < line - 1; i++) { + lineOffset += originalLines[i].length + 1; + } + const openParenOffset = lineOffset + parenIndex; + + const closeParenOffset = findMatchingParen(source, openParenOffset); + if (closeParenOffset === -1) { + continue; + } + + const baseIndent = lineContent.match(/^(\s*)/)?.[1] ?? ''; + const formatted = formatSnapshotAsTemplateLiteral(snapshot, baseIndent); + + source = + source.slice(0, openParenOffset + 1) + + formatted + + source.slice(closeParenOffset); + } + + fs.writeFileSync(testPath, source, 'utf8'); +} + export const updateSnapshotsAndGetJestSnapshotResult = ( snapshotState: SnapshotState, testSnapshotResults: Array, diff --git a/private/react-native-fantom/runtime/expect.js b/private/react-native-fantom/runtime/expect.js index 8407436cade..16c78002eb9 100644 --- a/private/react-native-fantom/runtime/expect.js +++ b/private/react-native-fantom/runtime/expect.js @@ -528,6 +528,30 @@ class Expect { } } + toMatchInlineSnapshot(expected?: string): void { + if (this.#isNot) { + throw new ErrorWithCustomBlame( + 'Snapshot matchers cannot be used with not.', + ).blameToPreviousFrame(); + } + + const receivedValue = format(this.#received, { + plugins: [plugins.ReactElement], + }); + + const stackTrace = new Error().stack ?? ''; + + try { + snapshotContext.toMatchInlineSnapshot( + receivedValue, + expected, + stackTrace, + ); + } catch (err) { + throw new ErrorWithCustomBlame(err.message).blameToPreviousFrame(); + } + } + #isExpectedResult(pass: boolean): boolean { return this.#isNot ? !pass : pass; } diff --git a/private/react-native-fantom/runtime/setup.js b/private/react-native-fantom/runtime/setup.js index 31bcd574fe4..7a5c198aa3c 100644 --- a/private/react-native-fantom/runtime/setup.js +++ b/private/react-native-fantom/runtime/setup.js @@ -10,7 +10,11 @@ import type {CoverageMap} from '../runner/coverage/types.flow'; import type {BenchmarkResult} from '../src/Benchmark'; -import type {SnapshotConfig, TestSnapshotResults} from './snapshotContext'; +import type { + SnapshotConfig, + TestInlineSnapshotResults, + TestSnapshotResults, +} from './snapshotContext'; import {getConstants} from '../src/Constants'; import expect from './expect'; @@ -28,6 +32,7 @@ export type TestCaseResult = { failureDetails: Array, numPassingAsserts: number, snapshotResults: TestSnapshotResults, + inlineSnapshotResults: TestInlineSnapshotResults, // location: string, }; @@ -317,6 +322,7 @@ function runSpec(spec: Spec): TestCaseResult { failureDetails: [], numPassingAsserts: 0, snapshotResults: {}, + inlineSnapshotResults: [], }; if (!shouldRunSuite(spec)) { @@ -356,6 +362,7 @@ function runSpec(spec: Spec): TestCaseResult { } result.snapshotResults = snapshotContext.getSnapshotResults(); + result.inlineSnapshotResults = snapshotContext.getInlineSnapshotResults(); return result; } diff --git a/private/react-native-fantom/runtime/snapshotContext.js b/private/react-native-fantom/runtime/snapshotContext.js index 8b6ae339084..e89b54c80ba 100644 --- a/private/react-native-fantom/runtime/snapshotContext.js +++ b/private/react-native-fantom/runtime/snapshotContext.js @@ -26,14 +26,60 @@ export type TestSnapshotResults = { }, }; +export type InlineSnapshotResult = + | {pass: true} + | {pass: false, isNew: boolean, value: string, stackTrace: string}; + +export type TestInlineSnapshotResults = Array; + const COMPARISON_EQUALS_STRING = 'Compared values have no visual difference.'; +const INDENTATION_REGEX: RegExp = /^([^\S\n]*)\S/m; + let snapshotConfig: ?SnapshotConfig; +// Add extra line breaks at beginning and end of multiline snapshot +// to make the content easier to read. +const addExtraLineBreaks = (string: string): string => + string.includes('\n') ? `\n${string}\n` : string; + +// Strips source-code indentation from inline snapshot template literals. +// Matches jest-snapshot's stripAddedIndentation implementation. +function stripAddedIndentation(inlineSnapshot: string): string { + const match = inlineSnapshot.match(INDENTATION_REGEX); + if (!match || !match[1]) { + return inlineSnapshot; + } + + const indentation = match[1]; + const lines = inlineSnapshot.split('\n'); + + if (lines.length <= 2) { + return inlineSnapshot; + } + + if (lines[0].trim() !== '' || lines[lines.length - 1].trim() !== '') { + return inlineSnapshot; + } + + for (let i = 1; i < lines.length - 1; i++) { + if (lines[i] !== '') { + if (lines[i].indexOf(indentation) !== 0) { + return inlineSnapshot; + } + lines[i] = lines[i].substring(indentation.length); + } + } + + lines[lines.length - 1] = ''; + return lines.join('\n'); +} + type SnapshotState = { callCount: number, testFullName: string, snapshotResults: TestSnapshotResults, + inlineSnapshotResults: TestInlineSnapshotResults, }; class SnapshotContext { @@ -44,6 +90,7 @@ class SnapshotContext { callCount: 0, testFullName, snapshotResults: {}, + inlineSnapshotResults: [], }; } @@ -100,9 +147,74 @@ class SnapshotContext { snapshotState.snapshotResults[snapshotKey] = {pass: true}; } + toMatchInlineSnapshot( + received: string, + inlineSnapshot: string | void, + stackTrace: string, + ): void { + const snapshotState = this.#snapshotState; + if (snapshotState == null) { + throw new Error( + 'Snapshot state is not set, call `setTargetTest()` first', + ); + } + + if (snapshotConfig == null) { + throw new Error( + 'Snapshot config is not set. Did you forget to call `setupSnapshotConfig`?', + ); + } + + const updateSnapshot = snapshotConfig.updateSnapshot; + const receivedSerialized = addExtraLineBreaks(received); + + if (inlineSnapshot === undefined) { + // First run - no inline snapshot yet + snapshotState.inlineSnapshotResults.push({ + pass: false, + isNew: true, + value: receivedSerialized, + stackTrace, + }); + + if (updateSnapshot === 'none') { + throw new Error( + 'New inline snapshot was not written. The update flag must be explicitly passed to write a new snapshot.\n\nThis is likely because this test is run in a continuous integration (CI) environment in which snapshots are not written by default.', + ); + } + + return; + } + + const expected = stripAddedIndentation(inlineSnapshot); + + if (receivedSerialized === expected) { + snapshotState.inlineSnapshotResults.push({pass: true}); + return; + } + + // Mismatch + snapshotState.inlineSnapshotResults.push({ + pass: false, + isNew: false, + value: receivedSerialized, + stackTrace, + }); + + if (updateSnapshot !== 'all') { + const diffResult = + diff(expected, receivedSerialized) ?? 'Failed to compare output'; + throw new Error(`Expected to match inline snapshot.\n${diffResult}`); + } + } + getSnapshotResults(): TestSnapshotResults { return {...this.#snapshotState?.snapshotResults}; } + + getInlineSnapshotResults(): TestInlineSnapshotResults { + return [...(this.#snapshotState?.inlineSnapshotResults ?? [])]; + } } export const snapshotContext: SnapshotContext = new SnapshotContext(); diff --git a/private/react-native-fantom/src/__tests__/expect-itest.js b/private/react-native-fantom/src/__tests__/expect-itest.js index 98dffb75a0f..3bc828363a5 100644 --- a/private/react-native-fantom/src/__tests__/expect-itest.js +++ b/private/react-native-fantom/src/__tests__/expect-itest.js @@ -865,4 +865,62 @@ describe('expect', () => { expect({a: 'b'}).toMatchSnapshot('named snapshot'); }); }); + + describe('toMatchInlineSnapshot()', () => { + test('primitive types', () => { + expect(42).toMatchInlineSnapshot(`42`); + expect('hello').toMatchInlineSnapshot(`"hello"`); + expect(true).toMatchInlineSnapshot(`true`); + expect(null).toMatchInlineSnapshot(`null`); + expect(undefined).toMatchInlineSnapshot(`undefined`); + expect('foo\nbar').toMatchInlineSnapshot(` + "foo + bar" + `); + }); + + test('complex types', () => { + expect({foo: 'bar'}).toMatchInlineSnapshot(` + Object { + "foo": "bar", + } + `); + expect(new Map([['foo', 'bar']])).toMatchInlineSnapshot(` + Map { + "foo" => "bar", + } + `); + expect(new Set([1, 2])).toMatchInlineSnapshot(` + Set { + 1, + 2, + } + `); + expect(new Date('2025-01-02')).toMatchInlineSnapshot( + `2025-01-02T00:00:00.000Z`, + ); + expect(new Error()).toMatchInlineSnapshot(`[Error]`); + expect(new RegExp('asd')).toMatchInlineSnapshot(`/asd/`); + expect(function foo() {}).toMatchInlineSnapshot(`[Function foo]`); + }); + + test('JSX elements', () => { + expect(hello).toMatchInlineSnapshot(` + + hello + + `); + expect( +

+ nested +
, + ).toMatchInlineSnapshot(` +
+ + nested + +
+ `); + }); + }); }); From d0fe56f7ddd040d28294f4cb75650c6bfde27c93 Mon Sep 17 00:00:00 2001 From: generatedunixname1899117597419293 Date: Thu, 5 Mar 2026 11:57:52 -0800 Subject: [PATCH 094/595] fbsource//xplat/js/react-native-github/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll:scrollAndroid (#55945) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55945 Reviewed By: cortinico Differential Revision: D95365592 fbshipit-source-id: fb716cb007046aca70f04742fe41536c280110df --- .../views/scroll/ReactHorizontalScrollView.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index 4a5d3f9d54a..84995436de6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -158,7 +158,7 @@ public ReactHorizontalScrollView(Context context, @Nullable FpsListener fpsListe /** * Set all default values here as opposed to in the constructor or field defaults. It is important * that these properties are set during the constructor, but also on-demand whenever an existing - * ReactTextView is recycled. + * ReactHorizontalScrollView is recycled. */ private void initView() { mOverflowInset = new Rect(); @@ -552,7 +552,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { /** * Since ReactHorizontalScrollView handles layout changes on JS side, it does not call - * super.onlayout due to which mIsLayoutDirty flag in HorizontalScrollView remains true and + * super.onLayout due to which mIsLayoutDirty flag in HorizontalScrollView remains true and * prevents scrolling to child when requestChildFocus is called. Overriding this method and * scrolling to child without checking any layout dirty flag. This will fix focus navigation issue * for KeyEvents which are not handled in HorizontalScrollView, for example: KEYCODE_TAB. @@ -568,7 +568,7 @@ public void requestChildFocus(View child, View focused) { /** * In rare cases where an app overrides the built-in ReactScrollView by overriding it, and also * needs to customize scroll into view on focus behaviors, this protected method can be used to - * unblocks such customization. + * unblock such customization. */ protected void requestChildFocusWithoutScroll(View child, View focused) { super.requestChildFocus(child, focused); @@ -1008,10 +1008,10 @@ protected void onDetachedFromWindow() { return nextFocus; } - @Nullable View nextfocusableView = findNextFocusableView(this, focused, direction); + @Nullable View nextFocusableView = findNextFocusableView(this, focused, direction); - if (nextfocusableView != null) { - return nextfocusableView; + if (nextFocusableView != null) { + return nextFocusableView; } } @@ -1700,7 +1700,7 @@ private void recreateFlingAnimation(int scrollX, int maxX) { if (mScroller != null && !mScroller.isFinished()) { // Calculate the velocity and position of the fling animation at the time of this layout - // event, which may be later than the last ScrollView tick. These values are not commited to + // event, which may be later than the last ScrollView tick. These values are not committed to // the underlying ScrollView, which will recalculate positions on its next tick. int scrollerXBeforeTick = mScroller.getCurrX(); boolean hasMoreTicks = mScroller.computeScrollOffset(); From c828539b7809c63382810b4fbcd6615f6837ce53 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Thu, 5 Mar 2026 13:14:52 -0800 Subject: [PATCH 095/595] Add changelog for v0.85.0-rc.0 (#55895) Summary: Add Changelog for 0.85.0-rc.0 ## Changelog: [Internal] - Add Changelog for 0.85.0-rc.0 Pull Request resolved: https://github.com/facebook/react-native/pull/55895 Test Plan: N/A Reviewed By: fabriziocucci Differential Revision: D95140710 Pulled By: alanleedev fbshipit-source-id: b84817b576a9e79aae498265f93e99c2082aca3c --- CHANGELOG.md | 200 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db8cc314552..caa18f211b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,205 @@ # Changelog +## v0.85.0-rc.0 + +### Breaking + +- **Build**: Drop support for EOL Node.js lines and old minors. ([c9c601d61a](https://github.com/facebook/react-native/commit/c9c601d61af836d26ab628c2c8a30bae713ef010) by [@robhogan](https://github.com/robhogan)) +- **Jest**: Move Jest preset to new `react-native/jest-preset` package ([c4ae05534a](https://github.com/facebook/react-native/commit/c4ae05534ad5b6e6def35e736764f64b1f145a2b) by [@kitten](https://github.com/kitten)) +- **StyleSheet**: Remove deprecated `StyleSheet.absoluteFill` API ([5681db09b8](https://github.com/facebook/react-native/commit/5681db09b875e8c2b59b14df2300bad2b68d8a17) by [@huntie](https://github.com/huntie)) +- **TypeScript**: Removing deprecated type aliases. Use the type directly. ([1813df743d](https://github.com/facebook/react-native/commit/1813df743db3852f3b667e36c31d564867c257fc) by [@sammy-SC](https://github.com/sammy-SC)) +- **TypeScript**: Removing deprecated type aliases. Use the type directly. ([796a9a8922](https://github.com/facebook/react-native/commit/796a9a892283feeb01e9ded21c40dc91409c1499) by [@sammy-SC](https://github.com/sammy-SC)) + +#### Android specific + +- **Events**: Re-added `receiveTouches` to `RCTEventEmitter` with a default no-op implementation to avoid breaking ecosystem libraries ([67db89d08a](https://github.com/facebook/react-native/commit/67db89d08aa2aaaed6ff270032024fee1dcad531) by [@javache](https://github.com/javache)) +- **Legacy Architecture**: Deprecated UIManagerHelper.getEventDispatcherForReactTag and UIManagerHelper.getEventDispatcher(ReactContext, UIManagerType Int), use getEventDispatcher ([4e5d45f4db](https://github.com/facebook/react-native/commit/4e5d45f4dbea143b72925078c65ab2ad4846dfd3) by [@javache](https://github.com/javache)) +- **Legacy Architecture**: Stub UIImplementation class, this class is unused in the new architecture ([fbe15f6605](https://github.com/facebook/react-native/commit/fbe15f6605bb99c451d1105bcac72af7692182fe) by [@mdvacca](https://github.com/mdvacca)) +- **Text**: Make ReactTextUpdate internal ([faebee4338](https://github.com/facebook/react-native/commit/faebee4338e5842b2dd915eede0ee049d4fd7368) by [@NickGerleman](https://github.com/NickGerleman)) + +### Added + +- **Animated**: `RCTAnimationChoreographer` to `RCTScheduler` ([019c9a7d8f](https://github.com/facebook/react-native/commit/019c9a7d8f56fe895253de8487b4c6d0d76f85be) by Bartlomiej Bloniarz) +- **Animated**: `std::mutex` to `AnimationBackend` to protect `start`, `stop` and `callbacks`. ([4064b89867](https://github.com/facebook/react-native/commit/4064b89867cb7424fd02433c6d597e534bfc8cbc) by Bartlomiej Bloniarz) +- **Animated**: Added support for transform operations. ([58b7b052c0](https://github.com/facebook/react-native/commit/58b7b052c092e79277ab026ea6dd4f78021ed6c5) by [@coado](https://github.com/coado)) +- **Animated**: Animated calls `AnimationBackend::trigger` to push updates from. events to the mounting layer ([ac06f3bdc7](https://github.com/facebook/react-native/commit/ac06f3bdc76a9fd7c65ab899e82bff5cad9b94b6) by Bartlomiej Bloniarz) +- **Animated**: Animated can now prompt the backend to push changes to the shadowTree on the JS thread, making RSNRU update the ShadowNode references held by the react renderer. ([f9e94c0502](https://github.com/facebook/react-native/commit/f9e94c050251c67bf0d2c806738b8c6e59bb59d5) by Bartlomiej Bloniarz) +- **Animated**: Animation Backend examples in RNTester ([149a4b8dcd](https://github.com/facebook/react-native/commit/149a4b8dcde07df9c2f4d8456463ad242a2cb842) by Bartlomiej Bloniarz) +- **Animated**: AnimationBackend docs ([f3678f51d9](https://github.com/facebook/react-native/commit/f3678f51d9873cb19602d7e36a4d8ed71562b9d0) by Bartlomiej Bloniarz) +- **Animated**: AnimationBackend now cleans-up the AnimatedPropsRegistry after the js sync when `updateRuntimeShadowNodeReferencesOnCommitThread` is enabled ([b38428c9bc](https://github.com/facebook/react-native/commit/b38428c9bc9ad2e62a4cedf2240d44eb7a5b52df) by Bartlomiej Bloniarz) +- **Animated**: Moved `shadowNodeFamily_` from a map in `NativeAnimatedNodesManager` to `PropsAnimatedNode` ([af96497b54](https://github.com/facebook/react-native/commit/af96497b543a44c5ce93464346d853b50159432a) by Bartlomiej Bloniarz) +- **Animated**: Updated `AnimationBackend` usages to use `AnimationTimestamp` ([2a4a54ae6c](https://github.com/facebook/react-native/commit/2a4a54ae6c92c9fbf8601601aae50fd1f1115871) by Bartlomiej Bloniarz) +- **Animated**: Upstream useAnimatedColor and useAnimatedValueXY ([b92d37879e](https://github.com/facebook/react-native/commit/b92d37879e8e6ca5dbb3c0047a50b20ae6286bc5) by [@zeyap](https://github.com/zeyap)) +- **Dev Server**: Make metro accept tls server config ([8915d81a5b](https://github.com/facebook/react-native/commit/8915d81a5bae5b37247ab56bf9f1b4aace189b9c) by [@vzaidman](https://github.com/vzaidman)) +- **Feature Flags**: Create featureflag viewTransitionEnabled ([d7a1d080c2](https://github.com/facebook/react-native/commit/d7a1d080c242300986935f64ac7906924a5f7189) by [@zeyap](https://github.com/zeyap)) +- **JavaScript API**: Added `EventEmitter` to `react-native` exports. ([f7cd8c4c1c](https://github.com/facebook/react-native/commit/f7cd8c4c1ccc7738fcfea193019f190d4a6effb2) by [@yungsters](https://github.com/yungsters)) +- **Pressable**: Added tests for `Pressability` `onHoverOut` property ([de5994817d](https://github.com/facebook/react-native/commit/de5994817d8214cae217fca583f89a71c08d7b40) by [@chicio](https://github.com/chicio)) +- **React Native DevTools**: Added missing tests for Standalone fusebox shell ([e5d720d98d](https://github.com/facebook/react-native/commit/e5d720d98d55b1f23e49d3820df6957063a1d1a7) by [@chicio](https://github.com/chicio)) +- **React Native DevTools**: Support multiple CDP connections to one React Native Host (diff 1 of 2) ([534c06f3c8](https://github.com/facebook/react-native/commit/534c06f3c85394c8294f080e57ffb76dc655fb74) by [@motiz88](https://github.com/motiz88)) +- **React Native DevTools**: Support multiple CDP connections to one React Native Host (diff 2 of 2) ([f04659972c](https://github.com/facebook/react-native/commit/f04659972c0996ada70ded2cf1456865cf3a7f32) by [@motiz88](https://github.com/motiz88)) +- **Runtime**: Added a synchronization mechanism for the layout information between the React branch and the main branch of the ShadowTree ([c8d498d62d](https://github.com/facebook/react-native/commit/c8d498d62d73ea8d58a6017bd0283e43d78d2c8a) by [@j-piasecki](https://github.com/j-piasecki)) +- **TextInput**: TextInput onChange event now includes selection data (cursor location) on iOS and Android ([162627af7c](https://github.com/facebook/react-native/commit/162627af7c53e27433f39f82c4630baff0695bf1) by [@alanleedev](https://github.com/alanleedev)) +- **TextInput**: TextInput onChange event types now include optional selection data ([c1f5445f4a](https://github.com/facebook/react-native/commit/c1f5445f4a59d0035389725e47da58eb3d2c267c) by [@alanleedev](https://github.com/alanleedev)) +- **TypeScript**: Add missing `onPressMove` prop to `` ([d07318226d](https://github.com/facebook/react-native/commit/d07318226d4b8d66e1bd55c9b683d1715c39b84e) by [@retyui](https://github.com/retyui)) + +#### Android specific + +- **Animated**: Decouple ReactScrollViewHelper from kt NativeAnimated ([0cde8ed0bb](https://github.com/facebook/react-native/commit/0cde8ed0bb6bbd8159f5b07405ed8e5a685ed3eb) by [@zeyap](https://github.com/zeyap)) +- **Build**: Allow specifying dev server ip via gradle property ([6f54846a08](https://github.com/facebook/react-native/commit/6f54846a08025c05ab7c7bf514f189085cde7b18) by [@amartinz](https://github.com/amartinz)) +- **Build**: Re-added prefabPublishing=true to make Android build from source work again ([e8eb37414e](https://github.com/facebook/react-native/commit/e8eb37414ed34c360eef6bf988d8cee445e6e72b) by [@chrfalch](https://github.com/chrfalch)) +- **Dev Server**: Make DevSupportHttpClient public for custom dev-support HTTP header registration ([58d94863f8](https://github.com/facebook/react-native/commit/58d94863f896a64e3ab176008d4141a0a68da71f) by [@cortinico](https://github.com/cortinico)) +- **Dev Server**: Public DevSupportRequestHeaders API for registering custom dev-support HTTP headers ([e0d34b254a](https://github.com/facebook/react-native/commit/e0d34b254aca4b695c2eda24f1fb086ee3a037f6) by [@cortinico](https://github.com/cortinico)) +- **React Native DevTools**: Restore request payload previews on Android ([cc44e96e0b](https://github.com/facebook/react-native/commit/cc44e96e0bc7f82a1729301dce7c4ca5a5e11f65) by [@huntie](https://github.com/huntie)) +- **Runtime**: Add `StateWrapper` to C++ fbjni types ([99b328bffa](https://github.com/facebook/react-native/commit/99b328bffae134430e864af999237c3c39170c5a) by [@mrousavy](https://github.com/mrousavy)) +- **ScrollView**: Add `scrollsChildToFocus` prop to ScrollView to control automatic scrolling when a child receives focus ([d9ee4bb0aa](https://github.com/facebook/react-native/commit/d9ee4bb0aa55a71fd2328a8b9dfdca56a4a1e75a) by [@johankasperi](https://github.com/johankasperi)) +- **Text**: `ReactFontManager.customFontFamilies` property to query registered custom font family names ([c3acbc424d](https://github.com/facebook/react-native/commit/c3acbc424da9b044957d5a35c4a2d4a1254a3729) by [@vonovak](https://github.com/vonovak)) +- **Text**: Add Unstable DrawCommandSpan Usable with PreparedLayoutTextView ([ad8ac5e176](https://github.com/facebook/react-native/commit/ad8ac5e17602919ac3a6c287d176cd07d8fd18f9) by [@NickGerleman](https://github.com/NickGerleman)) + +#### iOS specific + +- **Build**: Added support for clang virtual file system in React.XCFramework ([f0422abd23](https://github.com/facebook/react-native/commit/f0422abd23b87d086d02a5afd6b8b9f300528137) by [@chrfalch](https://github.com/chrfalch)) + +### Changed + +- **Animated**: `AnimationChoreographer` interface with an implementation for fantom tests ([f8564b47fd](https://github.com/facebook/react-native/commit/f8564b47fd742bce3dc68b129ea0d4ae04e61bc3) by Bartlomiej Bloniarz) +- **Animated**: Enable -DRN_USE_ANIMATION_BACKEND by default ([4cfb2ee468](https://github.com/facebook/react-native/commit/4cfb2ee46831b57987873b1d7ce6306778463afd) by [@zeyap](https://github.com/zeyap)) +- **Build**: Metro bump to ^0.84.0 ([58ed78fec1](https://github.com/facebook/react-native/commit/58ed78fec1714003c25311def5e95d4d212337d7) by [@robhogan](https://github.com/robhogan)) +- **Dev Server**: `createDevMiddleware` now accepts `string | URL` for `serverBaseUrl` ([10709f427d](https://github.com/facebook/react-native/commit/10709f427d164ed07fbd9e462334c9a0cb9bceb5) by [@emily8rown](https://github.com/emily8rown)) +- **Dev Server**: Remove "JavaScript logs have moved!" notice from dev server CLI ([4bd62a1d41](https://github.com/facebook/react-native/commit/4bd62a1d41417b9feaeef2a5e03532ef66587f9d) by [@huntie](https://github.com/huntie)) +- **Hermes**: Bump hermes version ([4379f21bd7](https://github.com/facebook/react-native/commit/4379f21bd7f04f977f0dc7bfe1efa55400cf52e0) by [@alanleedev](https://github.com/alanleedev)) +- **Hermes**: Do not use hermesNightly on the release branch ([c35a22db2b](https://github.com/facebook/react-native/commit/c35a22db2b1427e7e4fe404dfc10cc711a7558f8) by [@cortinico](https://github.com/cortinico)) +- **Hermes**: Introduce 'Determine Hermes build flag' step ([111bd59db5](https://github.com/facebook/react-native/commit/111bd59db5ddeb2201de7f88fce14d2f4223432e) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **JavaScript API**: Changed Flow type for `URL` constructor to accept `URL` as first argument, matching the second argument type ([678f7a9cfb](https://github.com/facebook/react-native/commit/678f7a9cfb01efc97c66ba2c178dbaa7b2837be5) by [@emily8rown](https://github.com/emily8rown)) +- **Pressable**: `Pressable` no longer unmounts event listeners in a hidden `Activity`. ([c295ec2261](https://github.com/facebook/react-native/commit/c295ec22617985b757775bfcca75a4ea9471a689) by [@yungsters](https://github.com/yungsters)) +- **Pressable**: Migrated `Pressability` tests to Jest modern timers ([7dd2d255de](https://github.com/facebook/react-native/commit/7dd2d255deaecf20101675cb4a616226e48a80d7) by [@chicio](https://github.com/chicio)) +- **React Native DevTools**: Changed debugger proxy to only permit connections from localhost. ([f34b8702db](https://github.com/facebook/react-native/commit/f34b8702dbb3843429a76779ca0800e99d5cfa10) by [@yungsters](https://github.com/yungsters)) +- **React Native DevTools**: Enable native macOS window merging ([34b3c108bc](https://github.com/facebook/react-native/commit/34b3c108bcd57c9466e8fd74e5588832d1bd864b) by [@huntie](https://github.com/huntie)) +- **React Native DevTools**: Extracting shared logic for fuseboxSessionObserver into reusable components ([b0013ea22a](https://github.com/facebook/react-native/commit/b0013ea22a70f28efe02425f0faa58ac404b9f6e) by [@emily8rown](https://github.com/emily8rown)) +- **React Native DevTools**: Page targets returned from `/json/list` will no longer set `prefersFuseboxFrontend` ([421de23470](https://github.com/facebook/react-native/commit/421de234700805cec1277940187020e6baa5c8eb) by [@huntie](https://github.com/huntie)) +- **React Native DevTools**: Suppress LogBox warnings and errors during CDP performance tracing ([a308014d87](https://github.com/facebook/react-native/commit/a308014d879dffc142335aff344ace2bfd77eb26) by [@emily8rown](https://github.com/emily8rown)) +- **React**: Make React Native consume 250829098.0.6 ([4fb33022bc](https://github.com/facebook/react-native/commit/4fb33022bc57dd719ce46a1a074b029cdfd8ff24) by [@cipolleschi](https://github.com/cipolleschi)) +- **Runtime**: `cancelAnimationFrame`, `clearImmediate`, `clearTimeout` and `clearInterval` do nothing If there is no callback associated the given handle ([9d3cc383ba](https://github.com/facebook/react-native/commit/9d3cc383ba9b45ef28721a1ae81b2d0429363bf5) by [@retyui](https://github.com/retyui)) +- **Runtime**: Changed how React changes are commited to the Shadow Tree (behind a feature flag) ([45b4817414](https://github.com/facebook/react-native/commit/45b4817414928c9bfa0b055bb09533ac177cada6) by [@j-piasecki](https://github.com/j-piasecki)) +- **Runtime**: Importing `hairlineWidth` no longer eagerly initializes the `PixelRatio` TurboModule. ([e11a2f07e8](https://github.com/facebook/react-native/commit/e11a2f07e8fd962adb76ff55a9b159e8ca3ae51f) by [@yungsters](https://github.com/yungsters)) +- **Runtime**: Logs created by `console.error` that begin with "Warning: " will no longer be treated as warnings. These call sites should migrate to using `console.warn` instead. ([5ab418460b](https://github.com/facebook/react-native/commit/5ab418460b573a02feb5e394392ac87a8b79848b) by [@yungsters](https://github.com/yungsters)) +- **Runtime**: Refactor how shadow tree revisions are promoted as latest for JS consistency ([4a7bc4c0e7](https://github.com/facebook/react-native/commit/4a7bc4c0e7424bf0dcea9ae2a3c1ce3e4cbb1333) by [@j-piasecki](https://github.com/j-piasecki)) +- **Runtime**: The JS revision merge now is scheduled on the main thread ([47e5e6c394](https://github.com/facebook/react-native/commit/47e5e6c3945b97fd64b9dd0465a30b42259d6157) by [@j-piasecki](https://github.com/j-piasecki)) +- **Text**: Text Can Conditionally Use "RCTSelectableText" Native Component ([a175bff10a](https://github.com/facebook/react-native/commit/a175bff10a459005504ba037ab6eede0d2724e29) by [@NickGerleman](https://github.com/NickGerleman)) +- **Text**: Text outside the bounds of a borderRadius is now hidden by default ([2111bec8d5](https://github.com/facebook/react-native/commit/2111bec8d5044486f5f123949b32dc58657a21ab) by [@NickGerleman](https://github.com/NickGerleman)) +- **TypeScript**: Transform `$Values` to `Values` ([94383613d8](https://github.com/facebook/react-native/commit/94383613d8a836682a4789ce7528b05b4a2b1c3d) by [@marcoww6](https://github.com/marcoww6)) +- **TypeScript**: Transform `mixed` to `unknown` in xplat/js ([625d702fec](https://github.com/facebook/react-native/commit/625d702fec0d0aa29953a8152219f9651f490dcd) by [@marcoww6](https://github.com/marcoww6)) +- **TypeScript**: Transform $ReadOnly to Readonly 38/n ([41efc3b588](https://github.com/facebook/react-native/commit/41efc3b5886e285b9b660fa4504f759eeac796c4) by [@marcoww6](https://github.com/marcoww6)) +- **TypeScript**: Transform $ReadOnlyArray to ReadonlyArray 17/n ([7051a07c63](https://github.com/facebook/react-native/commit/7051a07c637bc221889eba5017d62600cca7701d) by [@marcoww6](https://github.com/marcoww6)) +- **TypeScript**: Transform $ReadOnlyArray to ReadonlyArray 18/n ([92c32780f1](https://github.com/facebook/react-native/commit/92c32780f1842be4d0bb82ca06f66cf3d2ea4011) by [@marcoww6](https://github.com/marcoww6)) +- **TypeScript**: Transform all remaining utility types ([cd3a9c55c1](https://github.com/facebook/react-native/commit/cd3a9c55c109e7312152653f8a4ccacc58ddf0f8) by [@marcoww6](https://github.com/marcoww6)) +- **TypeScript**: Transform mixed to unknown ([60f9bfd546](https://github.com/facebook/react-native/commit/60f9bfd5469c9de61559cb4d5941748394fd5a19) by [@marcoww6](https://github.com/marcoww6)) +- **Yoga**: Migrate `YogaNode` to Kotlin ([cd27b7e1a8](https://github.com/facebook/react-native/commit/cd27b7e1a85c89423f88b9ab0e53f620a146b9a0) by [@mateoguzmana](https://github.com/mateoguzmana)) + +#### Android specific + +- **Animated**: Log error when unsupported type is passed to interpolation outputRange ([30fd0c4ac8](https://github.com/facebook/react-native/commit/30fd0c4ac82edb8716c8b05239ae55909bc83b12) by [@zeyap](https://github.com/zeyap)) +- **Build**: Add Sonatype Central repository for users of nightly builds only ([47c3ebe23f](https://github.com/facebook/react-native/commit/47c3ebe23f201f012dc077293065090d5a16de61) by [@sergeich](https://github.com/sergeich)) +- **Build**: Gradle to 9.3.1 ([319e589d3d](https://github.com/facebook/react-native/commit/319e589d3d15f226f29bced5bb66d4aa3c63ef10) by [@cortinico](https://github.com/cortinico)) +- **i18n**: Translation auto-update for batch 0/61 on master ([26da0fa509](https://github.com/facebook/react-native/commit/26da0fa50995d6ba33fbfafeb74d31e5115869c5) by Intl Scheduler) +- **React Native DevTools**: CDP: The`deviceName` field in app metadata is now prefixed with the manufacturer ([9b906753d9](https://github.com/facebook/react-native/commit/9b906753d9ac44e84bdd46ba6868f9a16604a5e7) by [@huntie](https://github.com/huntie)) +- **Runtime**: Updated documentation for GuardedFrameCallback class ([dfcb56dfea](https://github.com/facebook/react-native/commit/dfcb56dfea3b71a091e2b84bd27b1ca7bde7724f) by [@mdvacca](https://github.com/mdvacca)) +- **ScrollView**: Updated the `nestedScrollEnabled` prop to default to true if the ScrollView defines a `refreshControl` ([95bac85b5a](https://github.com/facebook/react-native/commit/95bac85b5a8bba67289a503544a00615b3506047) by [@Abbondanzo](https://github.com/Abbondanzo)) +- **Text**: Merge ReactTextAnchorViewManager into ReactTextViewManager ([f67f6a2448](https://github.com/facebook/react-native/commit/f67f6a244852b22bf8dcd79a3269073143aeba58) by [@NickGerleman](https://github.com/NickGerleman)) +- **Yoga**: Migrate `YogaConfigJNIBase` to Kotlin ([9db85e7503](https://github.com/facebook/react-native/commit/9db85e75037656616cc396ea34a6cf5f087c4da4) by [@mateoguzmana](https://github.com/mateoguzmana)) +- **Yoga**: Migrate `YogaProps` to Kotlin ([2e12cbdfb3](https://github.com/facebook/react-native/commit/2e12cbdfb396ca865d3088caf9aba3acf153a0b9) by [@mateoguzmana](https://github.com/mateoguzmana)) + +#### iOS specific + +- **Build**: Changed umbrella header template to use angled import syntax ([2b66a9a622](https://github.com/facebook/react-native/commit/2b66a9a622ada3b540e1466d1dea61f2404d34ab) by [@chrfalch](https://github.com/chrfalch)) + +### Deprecated + +- **Accessibility**: Deprecated `AccessibilityInfo.setAccessibilityFocus` in favor of `AccessibilityInfo.sendAccessibilityEvent` ([36a0d9ef63](https://github.com/facebook/react-native/commit/36a0d9ef63b5ecb1cdf62d6d56b420f484bfa037) by [@Abbondanzo](https://github.com/Abbondanzo)) + +#### Android specific + +- **Legacy Architecture**: Deprecate NativeViewHierarchyOptimizer as part of Legacy Architecture cleanup ([352d73bef0](https://github.com/facebook/react-native/commit/352d73bef0663643a976e947aa3dd40d20542498) by [@mdvacca](https://github.com/mdvacca)) + +#### iOS specific + +- **Runtime**: Deprecate `RCTHostRuntimeDelegate` and merge into `RCTHostDelegate` ([4626732f5b](https://github.com/facebook/react-native/commit/4626732f5b0558ee9bc661deba09e531b96b9b87) by [@tsapeta](https://github.com/tsapeta)) + +### Removed + +- **Animated**: `AnimationBackendChoreographer`, `AndroidAnimationChoregrapher` ([bb7c0f7c5f](https://github.com/facebook/react-native/commit/bb7c0f7c5f5d8648a1feddf42a6927d7eb0e6299) by Bartlomiej Bloniarz) +- **Legacy Architecture**: Stub UIViewOperationQueue and remove its usages ([7de3dbe1c8](https://github.com/facebook/react-native/commit/7de3dbe1c864c7159034287960befd8756aac69e) by [@mdvacca](https://github.com/mdvacca)) + +#### Android specific + +- **Legacy Architecture**: Remove deprecated CatalystInstanceImpl ([0889f7d774](https://github.com/facebook/react-native/commit/0889f7d774138596b8a6c510424fe151fea09a50) by [@mdvacca](https://github.com/mdvacca)) +- **Legacy Architecture**: Removed Paper-specific event dispatching methods. ([05d64d9316](https://github.com/facebook/react-native/commit/05d64d9316fa43838438673a8041e557e33d030a) by [@javache](https://github.com/javache)) +- **Legacy Architecture**: Stub out NativeViewHierarchyManager (Legacy Architecture) ([c2156a835f](https://github.com/facebook/react-native/commit/c2156a835ffc2d1d6f15d7b28cbc59bd8a9720ec) by [@mdvacca](https://github.com/mdvacca)) +- **Text**: Remove Deprecated ReactTextInputShadowNode ([d5399dd40d](https://github.com/facebook/react-native/commit/d5399dd40d8f939f3009288a4b69f7ab5282e89d) by [@NickGerleman](https://github.com/NickGerleman)) +- **View**: Removed support for ReactZIndexedViewGroup ([81acf78f81](https://github.com/facebook/react-native/commit/81acf78f81ebde3bc6aa06c817e490e858a33e67) by [@javache](https://github.com/javache)) + +### Fixed + +- **Animated**: (animationbackend) add default in switch statements ([66f6146f6f](https://github.com/facebook/react-native/commit/66f6146f6f0689c54034aa2615f4cdc5c89cbd5d) by [@zeyap](https://github.com/zeyap)) +- **Animated**: Fixed TypeError when serializing arbitrary transform operation ([8067f7b353](https://github.com/facebook/react-native/commit/8067f7b3533de890f80afad86ece12f0d83d1d8c) by [@coado](https://github.com/coado)) +- **Babel**: Babel-preset: Don't override explicitly-passed `dev` config if obsolete `withDevTools` is missing ([c5a38ab285](https://github.com/facebook/react-native/commit/c5a38ab2859ba64f424655948fd2cd76159b272a) by [@robhogan](https://github.com/robhogan)) +- **Babel**: Fix Babel transformer changing `BABEL_ENV` as a side effect ([88d40dcda3](https://github.com/facebook/react-native/commit/88d40dcda3f44f64a295bce6560f86fab39962f4) by [@robhogan](https://github.com/robhogan)) +- **Build**: Fix test build breaks after GoogleTest update ([2a776b1f65](https://github.com/facebook/react-native/commit/2a776b1f657235246843ec3f4ff24fc0a583e6c1) by Tal Benesh) +- **CI**: Typo on maestro ios gh action for jdk step ([0344c0c9cb](https://github.com/facebook/react-native/commit/0344c0c9cb67643c54a6e110e5b9bdd9c3da5e77) by [@gkartalis](https://github.com/gkartalis)) +- **Image**: When using Image with a `uri`, `width` and `height` the default dimensions were being lost ([dd3c20057b](https://github.com/facebook/react-native/commit/dd3c20057b3b550797750d9f9aefe3468a736aa9) by [@javache](https://github.com/javache)) +- **LogBox**: Fix TypeError in LogBoxInspectorReactFrames on Windows/macOS ([995879ca9b](https://github.com/facebook/react-native/commit/995879ca9b30f160e0d7b0e7143227130a2fd9a3) by [@jisoo-hisoo](https://github.com/jisoo-hisoo)) +- **React Native DevTools**: Reaching Metro from Debugger on urls other than localhost:8081 and 127.0.0.1:8081. ([3c7b4881dd](https://github.com/facebook/react-native/commit/3c7b4881dde4cb417bedea7f3c28aa98c3500c13) by [@vzaidman](https://github.com/vzaidman)) +- **React Native DevTools**: Send network events to all CDP clients with the Network domain enabled ([93a43c90ce](https://github.com/facebook/react-native/commit/93a43c90ce35ca346319b9877dbfbe0c971b5b41) by [@motiz88](https://github.com/motiz88)) +- **Runtime**: Fixed crash in `cloneMultiple` when families have no path to root ([54b4cb5e89](https://github.com/facebook/react-native/commit/54b4cb5e8926770935f2c482b5f2fbdac66d2d83) by [@coado](https://github.com/coado)) +- **TextInput**: Fix memory leak in TextInput ([5229e507e1](https://github.com/facebook/react-native/commit/5229e507e1a1cb0cff00ab49fb21f9d47438582d) by [@mobinni](https://github.com/mobinni)) +- **TextInput**: Fixed isFocused false positive ([42cd0f0414](https://github.com/facebook/react-native/commit/42cd0f04148ad7760e5c2099954b6912d02b35c4) by [@chicio](https://github.com/chicio)) +- **Yoga**: Fix CQS signal modernize-use-designated-initializers in xplat/yoga/yoga/algorithm ([4ef7ac3136](https://github.com/facebook/react-native/commit/4ef7ac3136e500fdd400e05d283d2e6abfcbeec5) by generatedunixname1587093422349604) + +#### Android specific + +- **Accessibility**: Properly set view.setEnabled() based on accessibilityState.disabled ([fc66884d73](https://github.com/facebook/react-native/commit/fc66884d7350230f0b682b6d0394a922d5409196) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **Accessibility**: Reset isClickable to false when recycling views to avoid accessibility tools finding views with incorrect state ([07c0539cb8](https://github.com/facebook/react-native/commit/07c0539cb81d02d69e20d3733e479228e7bc8469) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **Accessibility**: Reset OnClickListener to null when recycling views to avoid accessibility tools finding views with incorrect state ([04bdebc585](https://github.com/facebook/react-native/commit/04bdebc585840c6a4b72be435a7f399082319da9) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **Accessibility**: Set accessibilityRole to "link" for pressable Text components by default ([68e5b4ee9f](https://github.com/facebook/react-native/commit/68e5b4ee9f9c5bc4b1b1d38595320054e5b54fd5) by [@fabriziocucci](https://github.com/fabriziocucci)) +- **Animated**: Fix null pointer crash in FabricUIManagerBinding::driveCxxAnimations by adding null check for scheduler ([349cf1595b](https://github.com/facebook/react-native/commit/349cf1595bd0135e07862d4f51b2eb2eda610db4) by Dileep Siva Sai Nallabothu) +- **Animated**: Prevent Native Animated tracking spring crash when tracked `toValue` node is detached. ([45de7109fe](https://github.com/facebook/react-native/commit/45de7109fe93db8052e9ba06e53807f89cbd7fd9) by [@kmsbernard](https://github.com/kmsbernard)) +- **Build**: Fix included-build `gradle.properties` resolution for monorepos by reading from parent Gradle start parameters (`projectDir`/`currentDir`) before falling back to `../../android/gradle.properties`, so `hermesV1Enabled` can be inherited correctly. ([c5ae0c820a](https://github.com/facebook/react-native/commit/c5ae0c820a571141a43de980cb011d232fc2268f) by [@Titozzz](https://github.com/Titozzz)) +- **Codegen**: Validate module names in codegen ([a748a405b6](https://github.com/facebook/react-native/commit/a748a405b66546367f0160425d135be88812763d) by [@RSNara](https://github.com/RSNara)) +- **Dev Server**: Sync bundling progress between Metro cli and app hints ([56e1710b73](https://github.com/facebook/react-native/commit/56e1710b73f0011516872bc6a62e52626588839c) by [@vzaidman](https://github.com/vzaidman)) +- **Hermes**: Fixed so that all build types get the HERMES_V1_ENABLED flag ([8d68b11005](https://github.com/facebook/react-native/commit/8d68b110059fbd0b6e5da24e7ead66554262af60) by [@chrfalch](https://github.com/chrfalch)) +- **Hermes**: Provide symbol fallbacks for `inspector-modern/chrome/Registration.h` when HermesV1 is disabled. ([5ee695ad8f](https://github.com/facebook/react-native/commit/5ee695ad8f41d7c9a92a83fa1f0acd227cdab7b8) by [@tjzel](https://github.com/tjzel)) +- **Hermes**: ReactPlugin.kt always setting `hermesV1Enabled` to `true` ([45896674d1](https://github.com/facebook/react-native/commit/45896674d14d4b0104cb166e83c5b403f90981c0) by [@tjzel](https://github.com/tjzel)) +- **Image**: Image fadeDuration=0 not working with props 2.0 enabled ([3fb5c0bc02](https://github.com/facebook/react-native/commit/3fb5c0bc0224a33afb275d73e963d85111b561b2) by [@hannojg](https://github.com/hannojg)) +- **Legacy Architecture**: Restore getUIImplementation() stub for backwards compatibility with third-party libraries ([e5d2d951de](https://github.com/facebook/react-native/commit/e5d2d951de3e2081d512d363120c0d38eb21d3c9) by [@sammy-SC](https://github.com/sammy-SC)) +- **Networking**: File:// URIs passed to fetch() or XMLHttpRequest no longer fail (https://github.com/facebook/react-native/issues/54626) ([e76a6e2ef4](https://github.com/facebook/react-native/commit/e76a6e2ef4bfd2cf9e10a4a2ffe21bd1b2c981a9) by [@bhamiltoncx](https://github.com/bhamiltoncx)) +- **Runtime**: Capture idle callback before running it ([90e48d6031](https://github.com/facebook/react-native/commit/90e48d6031de3188a71157fe22d80b138a8d7605) by [@mozzius](https://github.com/mozzius)) +- **Runtime**: Fix thread-safety crash in `DynamicFromArray` by using `ThreadLocal` instead of a shared `SimplePool`, matching the existing fix in `DynamicFromMap` ([21fae86546](https://github.com/facebook/react-native/commit/21fae865468fa0ec178078ca834e77964abf7d0a) by [@edwii-zhu](https://github.com/edwii-zhu)) +- **ScrollView**: Fixed bug where joystick could still scroll when scrollEnabled is false ([c51b9698c7](https://github.com/facebook/react-native/commit/c51b9698c7e5f571146264c5ba0281dd7b28e408) by William Khoe) +- **Text**: Fix crash with setting certain `` props back to `undefined` when using `enablePropsUpdateReconciliationAndroid` feature flag ([50289e3add](https://github.com/facebook/react-native/commit/50289e3addcfc4162b72d46e03c1750523418c39) by [@hannojg](https://github.com/hannojg)) +- **Text**: FontVariants `stylistic-{num}` not being propagated correctly ([9353eb55b8](https://github.com/facebook/react-native/commit/9353eb55b877e6e51c35c6041eebd72971c6b9a5) by [@dragoncodes](https://github.com/dragoncodes)) +- **View**: Fix image content disappearing on API 24 (Nougat) when antialiased border radius clipping is applied ([51ec52e806](https://github.com/facebook/react-native/commit/51ec52e8068bd90cca20d9e5bfe369565fb0454f) by [@Abbondanzo](https://github.com/Abbondanzo)) + +#### iOS specific + +- **Accessibility**: Ensure accessibilityElementsHidden prop is respected in recursive accessibility label aggregation ([b60f533acc](https://github.com/facebook/react-native/commit/b60f533accc589ddff7fde8fbdaa65606b2cad85) by Max Polevy) +- **Animated**: Fixed edge-case with animating non-layout props through the `commitUpdates` path. ([31f215a421](https://github.com/facebook/react-native/commit/31f215a42183fa815204c8d730cc41437b077534) by [@coado](https://github.com/coado)) +- **Build**: Fix unused exception parameter compile error in RCTUIManager catch block in certain build mode ([58bc6c3e38](https://github.com/facebook/react-native/commit/58bc6c3e38d45398ebec01a5399eac8d72f83adc) by Yannick Loriot) +- **Build**: Fixed replace script deleting the react-vfs.yaml file on iOS ([11e257cec0](https://github.com/facebook/react-native/commit/11e257cec09d1e69e7261fd769ad0f0e4007e09e) by [@chrfalch](https://github.com/chrfalch)) +- **CocoaPods**: Add `nkf` and `base64` as ruby dependencies ([51c965883f](https://github.com/facebook/react-native/commit/51c965883f609b93b47c99b18ab260633a57346a) by [@kimchi-developer](https://github.com/kimchi-developer)) +- **CocoaPods**: Allow absolute react-native paths to be passed to `use_react_native!` in project podfiles ([33641f09fa](https://github.com/facebook/react-native/commit/33641f09fa91e93bc5780c2d6999515f9761a17f) by [@kitten](https://github.com/kitten)) +- **CocoaPods**: Regression from https://github.com/facebook/react-native/issues/54948 preventing `pod install --project-directory` from working properly ([9f686f2014](https://github.com/facebook/react-native/commit/9f686f2014aefd2ad6ee3b5843718d5d7d72d13a) by [@kitten](https://github.com/kitten)) +- **Dev Server**: Not crashing on network issues with connecting to DevServer ([ec29c292e0](https://github.com/facebook/react-native/commit/ec29c292e0417ef2c02fefe08f904117c3d5972e) by [@vzaidman](https://github.com/vzaidman)) +- **Dev Server**: Sync bundling progress between Metro cli and app hints ([e112934f2e](https://github.com/facebook/react-native/commit/e112934f2e1c74732e2fcf828299d8afab648d8e) by [@vzaidman](https://github.com/vzaidman)) +- **Image**: Fix expo-image-manipulator cropped image orientation ([978d5a2d4f](https://github.com/facebook/react-native/commit/978d5a2d4f4eede9cd6ba4786cae2dcc99ce3a37) by [@mlazari](https://github.com/mlazari)) +- **Image**: Resolves a rare race-condition that can trigger in RCTImageComponentView. ([3b46755b3b](https://github.com/facebook/react-native/commit/3b46755b3b2f4a53b79d0828ef4c0cfe319a34ac) by Ryan Frawley) +- **Prebuild**: Refactored header files generator for prebuilt React framework ([3fad7dc13d](https://github.com/facebook/react-native/commit/3fad7dc13dc6a7e4a2e9f5e877561526f990e90d) by [@chrfalch](https://github.com/chrfalch)) +- **ScrollView**: Reset contentInset in scroll view prepareForRecycle ([984dbe83d8](https://github.com/facebook/react-native/commit/984dbe83d8de76fd94c191173dc23897d31edcd8) by [@sandeee1928](https://github.com/sandeee1928)) +- **View**: Fixed `transformOrigin` using stale layout dimensions from recycled views, causing incorrect transform positioning ([0eb5e652a2](https://github.com/facebook/react-native/commit/0eb5e652a2957720500f1689c7d41528f8b13738) by Mazin Zakaria) + +### Security + +- **Dependencies**: Bump to `chromium-edge-launcher@^0.3.0` to drop `rimraf` ([1f2312687b](https://github.com/facebook/react-native/commit/1f2312687bae96d8a1f7bbd5d44ec628859656eb) by [@kitten](https://github.com/kitten)) + + ## v0.84.0 ### Breaking From 59e6ce22eaa4a6dd58368728e0c2ff6a25ce4c45 Mon Sep 17 00:00:00 2001 From: Sam Zhou Date: Thu, 5 Mar 2026 14:13:42 -0800 Subject: [PATCH 096/595] Deploy 0.304.0 to xplat Summary: [changelog](https://github.com/facebook/flow/blob/main/Changelog.md) Changelog: [Internal] Reviewed By: marcoww6 Differential Revision: D95440622 fbshipit-source-id: 827f1a20c4cddcc93a74ad8630acd89c1b13deb7 --- .flowconfig | 2 +- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.flowconfig b/.flowconfig index 067d84d5827..d47ccc43fa4 100644 --- a/.flowconfig +++ b/.flowconfig @@ -95,4 +95,4 @@ untyped-import untyped-type-import [version] -^0.303.0 +^0.304.0 diff --git a/package.json b/package.json index 3c9036a2df8..a098bf037bc 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "eslint-plugin-relay": "^1.8.3", "fb-dotslash": "0.5.8", "flow-api-translator": "0.33.3", - "flow-bin": "^0.303.0", + "flow-bin": "^0.304.0", "hermes-eslint": "0.33.3", "hermes-transform": "0.33.3", "ini": "^5.0.0", diff --git a/yarn.lock b/yarn.lock index 4fa58c9e049..e0b33855b60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4742,10 +4742,10 @@ flow-api-translator@0.33.3: hermes-transform "0.33.3" typescript "5.3.2" -flow-bin@^0.303.0: - version "0.303.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.303.0.tgz#17606a14c051b08a41168815f3b490c666fbc0c3" - integrity sha512-fXt97/JNYmounn1rIGzal3zOA6HJPdrQv8qh4LeR0flwlCFGH3mX7bnE5JzEhntSKOGOroxo7AJCMUTzP7lt7g== +flow-bin@^0.304.0: + version "0.304.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.304.0.tgz#5ca723aa761ce518d94949f8e7544eaac57f2ee8" + integrity sha512-6MT0Q9RMAetQMziFSwJrfA0GWagivGZQx9tcmwCKEYklBoITQ7wsV5V4FuoUNwK6Byb8SalUkqK0K0xssgr0wA== flow-enums-runtime@^0.0.6: version "0.0.6" From 5bd496b6ff2c9ae5e26361fac910de44f688de8d Mon Sep 17 00:00:00 2001 From: generatedunixname1899117597419293 Date: Thu, 5 Mar 2026 14:23:03 -0800 Subject: [PATCH 097/595] fbsource//xplat/js/react-native-github/packages/react-native/ReactCommon/react/renderer/css:tests (#55938) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55938 Reviewed By: franklinho Differential Revision: D95366900 fbshipit-source-id: 327ca7f07053837ccc3bfa9f019c6849f517d384 --- .../ReactCommon/react/renderer/css/tests/CSSValueParserTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSValueParserTest.cpp b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSValueParserTest.cpp index bedf04baa6f..4164534ecf9 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSValueParserTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSValueParserTest.cpp @@ -33,7 +33,7 @@ struct CSSDataTypeParser { static_assert(CSSDataType); -TEST(CSSValueParser, consume_multiple_with_delimeter) { +TEST(CSSValueParser, consume_multiple_with_delimiter) { CSSSyntaxParser syntaxParser{"1 2, 3, 4 / 5"}; CSSValueParser parser{syntaxParser}; From 8cbc4dcdc5f899f9bba96a17b9f5f1239c2bb8d8 Mon Sep 17 00:00:00 2001 From: generatedunixname1899117597419293 Date: Thu, 5 Mar 2026 14:55:28 -0800 Subject: [PATCH 098/595] fbsource//xplat/js/react-native-github:RCTAppDelegateApple (#55939) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55939 Reviewed By: cipolleschi, javache Differential Revision: D95365505 fbshipit-source-id: 4ddad008fcca54972d3b03a3a88d85b78d88e4b3 --- .../Libraries/AppDelegate/RCTRootViewFactory.h | 10 +++++----- .../Libraries/AppDelegate/RCTRootViewFactory.mm | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h index 7473c01a8b2..de533570ea6 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h +++ b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.h @@ -148,7 +148,7 @@ typedef void (^RCTLoadSourceForBridgeBlock)(RCTBridge *bridge, RCTSourceLoadBloc @property (nonatomic, nullable) RCTExtraLazyModuleClassesForBridge extraLazyModuleClassesForBridge; /** - * The bridge will call this block when a module been called from JS + * The bridge will call this block when a module has been called from JS * cannot be found among registered modules. * It should return YES if the module with name 'moduleName' was registered * in the implementation, and the system must attempt to look for it again among registered. @@ -173,11 +173,11 @@ typedef void (^RCTLoadSourceForBridgeBlock)(RCTBridge *bridge, RCTSourceLoadBloc #pragma mark - RCTRootViewFactory /** - * The RCTRootViewFactory is an utility class that encapsulates the logic of creating a new RCTRootView based on the + * The RCTRootViewFactory is a utility class that encapsulates the logic of creating a new RCTRootView based on the * current state of the environment. It allows you to initialize your app root view for old architecture, new - * architecture and bridgless mode. + * architecture and bridgeless mode. * - * This class is used to initalize rootView in RCTAppDelegate, but you can also use it separately. + * This class is used to initialize rootView in RCTAppDelegate, but you can also use it separately. * * Create a new instance of this class (make sure to retain it) and call the * `viewWithModuleName:initialProperties:launchOptions` method to create new RCTRootView. @@ -194,7 +194,7 @@ typedef void (^RCTLoadSourceForBridgeBlock)(RCTBridge *bridge, RCTSourceLoadBloc - (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration; - (instancetype)initWithTurboModuleDelegate:(id)turboModuleManagerDelegate - hostDelegate:(id)hostdelegate + hostDelegate:(id)hostDelegate configuration:(RCTRootViewFactoryConfiguration *)configuration; /** diff --git a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm index 55b0a269848..4eaecb0b46e 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm @@ -103,12 +103,12 @@ @implementation RCTRootViewFactory { } - (instancetype)initWithTurboModuleDelegate:(id)turboModuleManagerDelegate - hostDelegate:(id)hostdelegate + hostDelegate:(id)hostDelegate configuration:(RCTRootViewFactoryConfiguration *)configuration { if (self = [super init]) { _configuration = configuration; - _hostDelegate = hostdelegate; + _hostDelegate = hostDelegate; _contextContainer = std::make_shared(); _turboModuleManagerDelegate = turboModuleManagerDelegate; } From 40c9ed18e1c1c1cf1e033669b02586d75b784aea Mon Sep 17 00:00:00 2001 From: generatedunixname3865450666924320 Date: Thu, 5 Mar 2026 17:54:24 -0800 Subject: [PATCH 099/595] fbsource//xplat/js/react-native-github/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric:fabricAndroid (#55951) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55951 Reviewed By: sahiljain Differential Revision: D95033366 fbshipit-source-id: e57bb6684bc60078da68dabfe7fd67340d0333c7 --- .../fabric/mounting/mountitems/PreAllocateViewMountItem.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/PreAllocateViewMountItem.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/PreAllocateViewMountItem.kt index 72af0e279d6..25021f6b7af 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/PreAllocateViewMountItem.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/PreAllocateViewMountItem.kt @@ -59,7 +59,7 @@ internal class PreAllocateViewMountItem( if (FabricUIManager.IS_DEVELOPMENT_ENVIRONMENT) { result .append(" props: ") - .append(props?.toString() ?: "") + .append(props.toString() ?: "") .append(" state: ") .append(stateWrapper?.toString() ?: "") } From 13fefd537c76766efb876b9c85d5d1d9d7358c1e Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 5 Mar 2026 18:12:08 -0800 Subject: [PATCH 100/595] Add Button E2E tests (#55952) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55952 Add name fields to 5 Button examples in ButtonExample.js and create 5 corresponding E2E screenshot tests covering default-styling, color-red, two-buttons-flexbox, three-buttons-flexbox, and disabled variants. Skipped accessibility-only examples (no visual difference). Reviewed By: cortinico Differential Revision: D95311374 fbshipit-source-id: b9765e0f855e90ba3607b8e8c16af3c93ce41346 --- packages/rn-tester/js/examples/Button/ButtonExample.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/rn-tester/js/examples/Button/ButtonExample.js b/packages/rn-tester/js/examples/Button/ButtonExample.js index cbedc3f8f11..55409a8a126 100644 --- a/packages/rn-tester/js/examples/Button/ButtonExample.js +++ b/packages/rn-tester/js/examples/Button/ButtonExample.js @@ -30,6 +30,7 @@ exports.description = 'Simple React Native button component.'; exports.examples = [ { title: 'Button with default styling', + name: 'default-styling', render: function (): React.Node { return (