Purity analysis for JavaScript through abstract interpretation
We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. To this end, the analysis classifies functions as pure functions, observers, or procedures. A function is pure if none of its executions generate or depend upon externally observable si...
Saved in:
| Published in: | Journal of software : evolution and process Vol. 29; no. 12 |
|---|---|
| Main Authors: | , , , |
| Format: | Journal Article |
| Language: | English |
| Published: |
Chichester
Wiley Subscription Services, Inc
01.12.2017
|
| Subjects: | |
| ISSN: | 2047-7473, 2047-7481 |
| Online Access: | Get full text |
| Tags: |
Add Tag
No Tags, Be the first to tag this record!
|
| Abstract | We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. To this end, the analysis classifies functions as pure functions, observers, or procedures. A function is pure if none of its executions generate or depend upon externally observable side effects. A function is an observer as soon as one of its executions depends on an external side effect, but none of its executions generate observable side effects. Otherwise, the function is classified as a procedure. Function executions and associated callers are found by traversing all reachable function execution contexts on the call stack at the point where an effect occurs. Our approach is based on a flow analysis that, in addition to computing traditional control and value flow, keeps track of read and write effects. To increase the precision of our purity analysis, we combine it with an intraprocedural analysis that determines freshness of variables and objects. We formalize the core aspects of our technique and discuss its implementation and results on common JavaScript benchmarks. Results show that our approach is capable of determining function purity in the presence of higher‐order functions, dynamic property expressions, and prototypal inheritance. When compared with existing purity analyses, we find that our approach is as precise or more precise than the existing analyses.
We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. Our approach is based on a flow analysis that, in addition to computing traditional control and value flow, keeps track of read and write effects. When compared to existing purity analyses, we find that our approach is as precise as or more precise than the existing analyses. |
|---|---|
| AbstractList | We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. To this end, the analysis classifies functions as pure functions, observers, or procedures. A function is pure if none of its executions generate or depend upon externally observable side effects. A function is an observer as soon as one of its executions depends on an external side effect, but none of its executions generate observable side effects. Otherwise, the function is classified as a procedure. Function executions and associated callers are found by traversing all reachable function execution contexts on the call stack at the point where an effect occurs. Our approach is based on a flow analysis that, in addition to computing traditional control and value flow, keeps track of read and write effects. To increase the precision of our purity analysis, we combine it with an intraprocedural analysis that determines freshness of variables and objects. We formalize the core aspects of our technique and discuss its implementation and results on common JavaScript benchmarks. Results show that our approach is capable of determining function purity in the presence of higher-order functions, dynamic property expressions, and prototypal inheritance. When compared with existing purity analyses, we find that our approach is as precise or more precise than the existing analyses. We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. To this end, the analysis classifies functions as pure functions, observers, or procedures. A function is pure if none of its executions generate or depend upon externally observable side effects. A function is an observer as soon as one of its executions depends on an external side effect, but none of its executions generate observable side effects. Otherwise, the function is classified as a procedure. Function executions and associated callers are found by traversing all reachable function execution contexts on the call stack at the point where an effect occurs. Our approach is based on a flow analysis that, in addition to computing traditional control and value flow, keeps track of read and write effects. To increase the precision of our purity analysis, we combine it with an intraprocedural analysis that determines freshness of variables and objects. We formalize the core aspects of our technique and discuss its implementation and results on common JavaScript benchmarks. Results show that our approach is capable of determining function purity in the presence of higher‐order functions, dynamic property expressions, and prototypal inheritance. When compared with existing purity analyses, we find that our approach is as precise or more precise than the existing analyses. We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. Our approach is based on a flow analysis that, in addition to computing traditional control and value flow, keeps track of read and write effects. When compared to existing purity analyses, we find that our approach is as precise as or more precise than the existing analyses. |
| Author | Nicolay, Jens De Meuter, Wolfgang Stiévenart, Quentin De Roover, Coen |
| Author_xml | – sequence: 1 givenname: Jens orcidid: 0000-0003-4653-5820 surname: Nicolay fullname: Nicolay, Jens email: jnicolay@vub.ac.be organization: Vrije Universiteit Brussel – sequence: 2 givenname: Quentin surname: Stiévenart fullname: Stiévenart, Quentin organization: Vrije Universiteit Brussel – sequence: 3 givenname: Wolfgang surname: De Meuter fullname: De Meuter, Wolfgang organization: Vrije Universiteit Brussel – sequence: 4 givenname: Coen surname: De Roover fullname: De Roover, Coen organization: Vrije Universiteit Brussel |
| BookMark | eNp1kN1LwzAUxYMoOOfAP6Hgiy-dSdt89EWQ4ScTxelzuIuJy-iamqRK_3s7Kz6I3pd7OfzO5XAO0G7tao3QEcFTgnF2GjZ-SoQod9AowwVPeSHI7s_N8300CWGN-2EZpgUdobOH1tvYJVBD1QUbEuN8cgvvsFDeNjGJK-_a11UCyxA9qJjYOmrfeB0hWlcfoj0DVdCT7z1Gz5cXT7PrdH5_dTM7n6cqK_MyVYJylhHKhFYEA2R0aRgYkoleMoIXrFRcEeC6BM2YEcsXRYEyTQuNtYZ8jI6Hv413b60OUa5d6_vMQZKSs5zyEvOemg6U8i4Er41UdsjZZ7eVJFhua5J9TXJbU284-WVovN2A7_5C0wH9sJXu_uXk4u7xi_8EiBt5DQ |
| CitedBy_id | crossref_primary_10_1016_j_jss_2018_10_001 crossref_primary_10_1007_s13198_025_02823_3 |
| Cites_doi | 10.1145/3088515.3088521 10.1007/978-3-642-24276-2_9 10.1109/SP.2012.10 10.1109/SCAM.2011.13 10.1145/2635868.2635904 10.1145/41625.41654 10.1145/2489804.2489808 10.1109/ASE.2015.9 10.1145/1159803.1159807 10.1145/604131.604133 10.1145/1925844.1926405 10.1145/2837614.2837631 10.1007/978-3-540-30579-8_14 10.1007/BF00277387 10.1007/978-3-642-23702-7_6 10.1007/978-3-642-03237-0_17 10.1007/978-3-642-20398-5_4 10.1007/978-3-642-11957-6_30 10.1145/1321631.1321649 10.1002/(SICI)1096-9128(199711)9:11<1031::AID-CPE354>3.0.CO;2-O 10.1145/512950.512973 10.1145/2384616.2384680 10.1145/1932681.1863553 10.1007/BF01808954 10.1007/978-3-642-19861-8_7 10.1145/1455770.1455793 10.1109/SCAM.2015.7335406 10.1145/966049.777395 10.1145/319838.319848 10.1007/11766155_23 |
| ContentType | Journal Article |
| Copyright | Copyright © 2017 John Wiley & Sons, Ltd. |
| Copyright_xml | – notice: Copyright © 2017 John Wiley & Sons, Ltd. |
| DBID | AAYXX CITATION 7SC 8FD JQ2 L7M L~C L~D |
| DOI | 10.1002/smr.1889 |
| DatabaseName | CrossRef Computer and Information Systems Abstracts Technology Research Database ProQuest Computer Science Collection Advanced Technologies Database with Aerospace Computer and Information Systems Abstracts Academic Computer and Information Systems Abstracts Professional |
| DatabaseTitle | CrossRef Computer and Information Systems Abstracts Technology Research Database Computer and Information Systems Abstracts – Academic Advanced Technologies Database with Aerospace ProQuest Computer Science Collection Computer and Information Systems Abstracts Professional |
| DatabaseTitleList | Computer and Information Systems Abstracts CrossRef |
| DeliveryMethod | fulltext_linktorsrc |
| Discipline | Computer Science |
| EISSN | 2047-7481 |
| EndPage | n/a |
| ExternalDocumentID | 10_1002_smr_1889 SMR1889 |
| Genre | article |
| GrantInformation_xml | – fundername: IWT Vlaanderen – fundername: Fonds Wetenschappelijk Onderzoek – fundername: Innoviris |
| GroupedDBID | .3N .4S .GA .Y3 05W 0R~ 10A 1OC 31~ 33P 3SF 50Z 52O 52U 8-0 8-1 8-3 8-4 8-5 930 A03 AAESR AAEVG AAHHS AAHQN AAMNL AANHP AANLZ AAONW AASGY AAXRX AAYCA AAZKR ABCUV ABPVW ACAHQ ACBWZ ACCFJ ACCZN ACPOU ACRPL ACXBN ACXQS ACYXJ ADBBV ADEOM ADIZJ ADKYN ADMGS ADNMO ADOZA ADXAS ADZMN AEEZP AEIGN AEIMD AEQDE AEUQT AEUYR AFBPY AFFPM AFGKR AFPWT AFWVQ AFZJQ AHBTC AITYG AIURR AIWBW AJBDE AJXKR ALMA_UNASSIGNED_HOLDINGS ALUQN ALVPJ AMBMR AMYDB ARCSS ATUGU AUFTA AZBYB AZFZN BAFTC BDRZF BHBCM BMNLL BMXJE BRXPI BY8 D-E D-F DCZOG DPXWK DR2 DRFUL DRSTM EBS EDO EJD F00 F01 F04 G-S G.N GODZA HGLYW HZ~ I-F LATKE LEEKS LH4 LITHE LOXES LUTES LW6 LYRES MEWTI MRFUL MRSTM MSFUL MSSTM MXFUL MXSTM N04 N05 O66 O9- P2W P2X PQQKQ Q.N Q11 QB0 R.K ROL SUPJJ TUS W8V W99 WBKPD WIH WIK WOHZO WXSBR WYISQ WZISG ~WT AAYXX ADMLS AEYWJ AGHNM AGQPQ AGYGG CITATION O8X 7SC 8FD JQ2 L7M L~C L~D |
| ID | FETCH-LOGICAL-c2939-c857621568ec10aa25bf6af128568f87469c7c1a7e9ae66f8bdc5a56e54e0eea3 |
| IEDL.DBID | DRFUL |
| ISICitedReferencesCount | 7 |
| ISICitedReferencesURI | http://www.webofscience.com/api/gateway?GWVersion=2&SrcApp=Summon&SrcAuth=ProQuest&DestLinkType=CitingArticles&DestApp=WOS_CPL&KeyUT=000418091000003&url=https%3A%2F%2Fcvtisr.summon.serialssolutions.com%2F%23%21%2Fsearch%3Fho%3Df%26include.ft.matches%3Dt%26l%3Dnull%26q%3D |
| ISSN | 2047-7473 |
| IngestDate | Sun Nov 30 04:07:17 EST 2025 Tue Nov 18 19:53:49 EST 2025 Sat Nov 29 03:00:21 EST 2025 Wed Jan 22 16:40:14 EST 2025 |
| IsPeerReviewed | true |
| IsScholarly | true |
| Issue | 12 |
| Language | English |
| License | http://onlinelibrary.wiley.com/termsAndConditions#vor |
| LinkModel | DirectLink |
| MergedId | FETCHMERGED-LOGICAL-c2939-c857621568ec10aa25bf6af128568f87469c7c1a7e9ae66f8bdc5a56e54e0eea3 |
| Notes | ObjectType-Article-1 SourceType-Scholarly Journals-1 ObjectType-Feature-2 content type line 14 |
| ORCID | 0000-0003-4653-5820 |
| PQID | 1976357907 |
| PQPubID | 2034650 |
| PageCount | 34 |
| ParticipantIDs | proquest_journals_1976357907 crossref_citationtrail_10_1002_smr_1889 crossref_primary_10_1002_smr_1889 wiley_primary_10_1002_smr_1889_SMR1889 |
| PublicationCentury | 2000 |
| PublicationDate | December 2017 2017-12-00 20171201 |
| PublicationDateYYYYMMDD | 2017-12-01 |
| PublicationDate_xml | – month: 12 year: 2017 text: December 2017 |
| PublicationDecade | 2010 |
| PublicationPlace | Chichester |
| PublicationPlace_xml | – name: Chichester |
| PublicationTitle | Journal of software : evolution and process |
| PublicationYear | 2017 |
| Publisher | Wiley Subscription Services, Inc |
| Publisher_xml | – name: Wiley Subscription Services, Inc |
| References | 1989; 2 2012 2011 1990; 27 2010 2009 1987 2008 1986 2007 2006 2017 2005 2016 2004 2015 2014 2003 1991 2013 1997; 9 1977 e_1_2_13_25_1 e_1_2_13_24_1 e_1_2_13_27_1 e_1_2_13_26_1 e_1_2_13_21_1 e_1_2_13_20_1 e_1_2_13_23_1 e_1_2_13_22_1 e_1_2_13_9_1 e_1_2_13_8_1 e_1_2_13_7_1 e_1_2_13_6_1 e_1_2_13_17_1 e_1_2_13_18_1 e_1_2_13_19_1 e_1_2_13_13_1 e_1_2_13_36_1 e_1_2_13_14_1 e_1_2_13_35_1 e_1_2_13_15_1 e_1_2_13_38_1 e_1_2_13_16_1 e_1_2_13_37_1 e_1_2_13_32_1 e_1_2_13_10_1 e_1_2_13_31_1 e_1_2_13_11_1 e_1_2_13_34_1 e_1_2_13_12_1 e_1_2_13_33_1 e_1_2_13_30_1 e_1_2_13_5_1 e_1_2_13_4_1 e_1_2_13_3_1 e_1_2_13_2_1 e_1_2_13_29_1 e_1_2_13_28_1 |
| References_xml | – year: 2011 – start-page: 199 year: 2005 end-page: 215 – start-page: 31 year: 2017 end-page: 36 – start-page: 104 year: 2007 end-page: 113 – start-page: 321 year: 2006 end-page: 336 – year: 2009 – start-page: 137 year: 2011 end-page: 152 – start-page: 570 year: 2010 end-page: 589 – year: 1987 – start-page: 3 year: 2012 end-page: 17 – year: 2003 – start-page: 691 year: 2016 end-page: 704 – volume: 27 start-page: 505 issue: 6 year: 1990 end-page: 517 article-title: Referential transparency, definiteness and unfoldability publication-title: Acta Inform – year: 1977 – year: 2014 – year: 2010 – year: 2012 – start-page: 11 year: 2004 end-page: 19 – year: 1986 – start-page: 41 year: 2011 end-page: 55 – start-page: 7 year: 2011 end-page: 24 – year: 2008 – year: 2006 – start-page: 104 year: 2011 end-page: 123 – volume: 9 start-page: 1031 issue: 11 year: 1997 end-page: 1045 article-title: A java bytecode optimizer using side effect analysis publication-title: Concurr Pract Exper – volume: 2 start-page: 179 issue: 3‐4 year: 1989 end-page: 396 article-title: The interprocedural analysis and automatic parallelization of scheme programs publication-title: LISP Symbol Comput – year: 1991 – year: 2017 – start-page: 10 year: 2009 end-page: 22 – year: 2015 – year: 2013 – ident: e_1_2_13_31_1 doi: 10.1145/3088515.3088521 – ident: e_1_2_13_25_1 doi: 10.1007/978-3-642-24276-2_9 – ident: e_1_2_13_2_1 – ident: e_1_2_13_7_1 doi: 10.1109/SP.2012.10 – ident: e_1_2_13_38_1 doi: 10.1109/SCAM.2011.13 – ident: e_1_2_13_28_1 doi: 10.1145/2635868.2635904 – ident: e_1_2_13_17_1 doi: 10.1145/41625.41654 – ident: e_1_2_13_24_1 doi: 10.1145/2489804.2489808 – ident: e_1_2_13_35_1 doi: 10.1109/ASE.2015.9 – ident: e_1_2_13_16_1 – ident: e_1_2_13_30_1 doi: 10.1145/1159803.1159807 – ident: e_1_2_13_37_1 doi: 10.1145/604131.604133 – ident: e_1_2_13_18_1 – ident: e_1_2_13_11_1 doi: 10.1145/1925844.1926405 – ident: e_1_2_13_32_1 doi: 10.1145/2837614.2837631 – ident: e_1_2_13_4_1 doi: 10.1007/978-3-540-30579-8_14 – ident: e_1_2_13_29_1 – ident: e_1_2_13_36_1 doi: 10.1007/BF00277387 – ident: e_1_2_13_20_1 – ident: e_1_2_13_22_1 doi: 10.1007/978-3-642-23702-7_6 – ident: e_1_2_13_27_1 doi: 10.1007/978-3-642-03237-0_17 – ident: e_1_2_13_8_1 – ident: e_1_2_13_9_1 doi: 10.1007/978-3-642-20398-5_4 – ident: e_1_2_13_15_1 doi: 10.1007/978-3-642-11957-6_30 – ident: e_1_2_13_5_1 doi: 10.1145/1321631.1321649 – ident: e_1_2_13_10_1 doi: 10.1002/(SICI)1096-9128(199711)9:11<1031::AID-CPE354>3.0.CO;2-O – ident: e_1_2_13_13_1 doi: 10.1145/512950.512973 – ident: e_1_2_13_23_1 doi: 10.1145/2384616.2384680 – ident: e_1_2_13_19_1 doi: 10.1145/1932681.1863553 – ident: e_1_2_13_12_1 doi: 10.1007/BF01808954 – ident: e_1_2_13_21_1 doi: 10.1007/978-3-642-19861-8_7 – ident: e_1_2_13_33_1 – ident: e_1_2_13_3_1 doi: 10.1145/1455770.1455793 – ident: e_1_2_13_14_1 doi: 10.1109/SCAM.2015.7335406 – ident: e_1_2_13_34_1 doi: 10.1145/966049.777395 – ident: e_1_2_13_26_1 doi: 10.1145/319838.319848 – ident: e_1_2_13_6_1 doi: 10.1007/11766155_23 |
| SSID | ssj0000620545 |
| Score | 2.0804207 |
| Snippet | We present a static analysis for determining whether and to what extent functions in JavaScript programs are pure. To this end, the analysis classifies... |
| SourceID | proquest crossref wiley |
| SourceType | Aggregation Database Enrichment Source Index Database Publisher |
| SubjectTerms | abstract interpretation Freshness freshness analysis Java JavaScript Purity purity analysis side effect analysis Side effects Static code analysis |
| Title | Purity analysis for JavaScript through abstract interpretation |
| URI | https://onlinelibrary.wiley.com/doi/abs/10.1002%2Fsmr.1889 https://www.proquest.com/docview/1976357907 |
| Volume | 29 |
| WOSCitedRecordID | wos000418091000003&url=https%3A%2F%2Fcvtisr.summon.serialssolutions.com%2F%23%21%2Fsearch%3Fho%3Df%26include.ft.matches%3Dt%26l%3Dnull%26q%3D |
| hasFullText | 1 |
| inHoldings | 1 |
| isFullTextHit | |
| isPrint | |
| journalDatabaseRights | – providerCode: PRVWIB databaseName: Wiley Online Library Full Collection 2020 customDbUrl: eissn: 2047-7481 dateEnd: 99991231 omitProxy: false ssIdentifier: ssj0000620545 issn: 2047-7473 databaseCode: DRFUL dateStart: 20120101 isFulltext: true titleUrlDefault: https://onlinelibrary.wiley.com providerName: Wiley-Blackwell |
| link | http://cvtisr.summon.serialssolutions.com/2.0.0/link/0/eLvHCXMwpV3fS8MwED5088EX50-cTokg-lTXZm2avAiiDhEdY3Owt5JmCQx0yjr393tp082BguBToSRpyeXyfRcu3wGcKxNIRCbhySD1vVAFzOPKWCLHJI1a6GIjkxebiDsdPhyKrsuqtHdhCn2IxYGb9Yx8v7YOLtOsuRQNzd6mVwHnYh2qFJdtWIHqXa89eFqcsPiMIh-xOYzUyhEgb26V6rM-bZbdV_FoSTK_U9Uca9q1__zlNmw5hkluiiWxA2t6sgu1snoDcc68B9fdvHAdkU6WhCB9JY9yLvv5RkJcBR-CX5rZq1RkvJKfuA-D9v3L7YPnqil4CiFdeIpjaIEAz7hWgS_REqlh0iA-4SvDY4yTVawCGWshNWOGpyMVyYjpKNS-1rJ1AJXJ-0QfAhGW5ISRkKYlQpGyNMLRtDFxmjIqBa_DZTmniXJS47bixWtSiCTTBKclsdNSh7NFy49CXuOHNo3SLIlzsCwJRK6kh6F9HS5yA_zaP-k_9-zz6K8Nj2GTWvDOk1YaUJlNP_UJbKj5bJxNT90y-wIIfddO |
| linkProvider | Wiley-Blackwell |
| linkToHtml | http://cvtisr.summon.serialssolutions.com/2.0.0/link/0/eLvHCXMwpV3fS8MwED7mJuiL8ydOp0YQfapruzZNEARRx9RtjP2AvZUkS2CgU7a5v98kbTcHCoJPhXIpJZfL992RfAdwIZTHNDJRh3ncdQLhYYcIZYgcZn5Y1SE2VLbZRNRqkcGAtnNwk92FSfQhFgU3Exl2vzYBbgrSlaVq6PRtcu0RQtegEOhVFOah8NCp9RuLEouLfU1IzCFG3-gRaOJczeRnXb-SDV8FpCXL_M5VLdjUiv_6zW3YSjkmuksWxQ7k5HgXiln_BpSG8x7ctm3rOsRSYRKkCSx6ZnPWtVsJSnv4IMZNPUTM0GjlhOI-9GuPvfu6k_ZTcIQGdeoIopMLDfGYSOG5TPuCK8yURij9SpFIZ8oiEh6LJGUSY0X4UIQsxDIMpCslqx5Afvw-loeAqKE5QUiZqtKAcsxD_TWpVMQ59hklJbjKJjUWqdi46XnxGicyyX6spyU201KC84XlRyKw8YNNOfNLnIbYNPao1dLTyX0JLq0Hfh0fd5sd8zz6q-EZbNR7zUbceGq9HMOmb6DcHmEpQ342-ZQnsC7ms9F0cpquuS_uI9s- |
| linkToPdf | http://cvtisr.summon.serialssolutions.com/2.0.0/link/0/eLvHCXMwpV3bSgMxEB1qK-KL9YrVqhFEn9bupZtNEASxLl5qKa0F35ZsmkBBa2lrv9_JXloLCoJPC8tkWWYyOSdhcgbgTGpHIDJxSzixbdWlQy0mtSFyVLi-hynW10mziaDVYq-vvF2Aq_wuTKoPMT9wM5mRrNcmwdWor2sL1dDJ-_jSYYyvQKnuc4pZWWp0wl5zfsRiUxcJiSlidI0eARJnL5eftd1aPnwZkBYs8ztXTcAmLP_rNzdhI-OY5CadFFtQUMNtKOf9G0iWzjtw3U5a1xGRCZMQJLDkUcxEN1lKSNbDh4jYnIfIKRksVSjuQi-8e7m9t7J-CpZEUOeWZLi5QIinTEnHFhiLWFOhEaHwlWYB7pRlIB0RKC4UpZrFfekLnyq_rmylhLcHxeHHUO0D4YbmoNeF9nidxzT28WtK6yCOqSs4q8BF7tRIZmLjpufFW5TKJLsRuiUybqnA6dxylAps_GBTzeMSZSk2iRyeaOnh5r4C50kEfh0fdZ875nnwV8MTWGs3wqj50Ho6hHXXIHlSwVKF4nT8qY5gVc6mg8n4OJtyX7BY2rk |
| openUrl | ctx_ver=Z39.88-2004&ctx_enc=info%3Aofi%2Fenc%3AUTF-8&rfr_id=info%3Asid%2Fsummon.serialssolutions.com&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.atitle=Purity+analysis+for+JavaScript+through+abstract+interpretation&rft.jtitle=Journal+of+software+%3A+evolution+and+process&rft.au=Nicolay%2C+Jens&rft.au=Stievenart%2C+Quentin&rft.au=De+Meuter%2C+Wolfgang&rft.au=De+Roover%2C+Coen&rft.date=2017-12-01&rft.pub=Wiley+Subscription+Services%2C+Inc&rft.eissn=2047-7481&rft.volume=29&rft.issue=12&rft_id=info:doi/10.1002%2Fsmr.1889&rft.externalDBID=NO_FULL_TEXT |
| thumbnail_l | http://covers-cdn.summon.serialssolutions.com/index.aspx?isbn=/lc.gif&issn=2047-7473&client=summon |
| thumbnail_m | http://covers-cdn.summon.serialssolutions.com/index.aspx?isbn=/mc.gif&issn=2047-7473&client=summon |
| thumbnail_s | http://covers-cdn.summon.serialssolutions.com/index.aspx?isbn=/sc.gif&issn=2047-7473&client=summon |