relaton 2.2.0.pre.alpha.1 → 3.0.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. checksums.yaml +4 -4
  2. data/{docs/README.adoc → README.adoc} +109 -38
  3. data/lib/relaton/3gpp/bibdata.rb +9 -0
  4. data/lib/relaton/3gpp/bibitem.rb +9 -0
  5. data/lib/relaton/3gpp/bibliography.rb +48 -0
  6. data/lib/relaton/3gpp/data_fetcher.rb +255 -0
  7. data/lib/relaton/3gpp/doctype.rb +9 -0
  8. data/lib/relaton/3gpp/ext.rb +31 -0
  9. data/lib/relaton/3gpp/item.rb +12 -0
  10. data/lib/relaton/3gpp/item_data.rb +15 -0
  11. data/lib/relaton/3gpp/parser.rb +400 -0
  12. data/lib/relaton/3gpp/processor.rb +68 -0
  13. data/lib/relaton/3gpp/release.rb +34 -0
  14. data/lib/relaton/3gpp/util.rb +8 -0
  15. data/lib/relaton/3gpp.rb +25 -0
  16. data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
  17. data/lib/relaton/bib/converter/asciibib.rb +13 -0
  18. data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
  19. data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
  20. data/lib/relaton/bib/converter/bibtex.rb +23 -0
  21. data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
  22. data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
  23. data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
  24. data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
  25. data/lib/relaton/bib/converter/bibxml.rb +51 -0
  26. data/lib/relaton/bib/hash_parser_v1.rb +767 -0
  27. data/lib/relaton/bib/item_data.rb +229 -0
  28. data/lib/relaton/bib/model/abstract.rb +16 -0
  29. data/lib/relaton/bib/model/address.rb +22 -0
  30. data/lib/relaton/bib/model/affiliation.rb +16 -0
  31. data/lib/relaton/bib/model/bibdata.rb +11 -0
  32. data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
  33. data/lib/relaton/bib/model/bibitem.rb +11 -0
  34. data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
  35. data/lib/relaton/bib/model/contact.rb +18 -0
  36. data/lib/relaton/bib/model/contribution_info.rb +15 -0
  37. data/lib/relaton/bib/model/contributor.rb +29 -0
  38. data/lib/relaton/bib/model/copyright.rb +27 -0
  39. data/lib/relaton/bib/model/date.rb +31 -0
  40. data/lib/relaton/bib/model/depiction.rb +16 -0
  41. data/lib/relaton/bib/model/docidentifier.rb +34 -0
  42. data/lib/relaton/bib/model/doctype.rb +14 -0
  43. data/lib/relaton/bib/model/edition.rb +14 -0
  44. data/lib/relaton/bib/model/ext.rb +39 -0
  45. data/lib/relaton/bib/model/extent.rb +16 -0
  46. data/lib/relaton/bib/model/formattedref.rb +43 -0
  47. data/lib/relaton/bib/model/full_name_type.rb +64 -0
  48. data/lib/relaton/bib/model/fullname.rb +11 -0
  49. data/lib/relaton/bib/model/ics.rb +49 -0
  50. data/lib/relaton/bib/model/image.rb +28 -0
  51. data/lib/relaton/bib/model/item.rb +96 -0
  52. data/lib/relaton/bib/model/item_base.rb +20 -0
  53. data/lib/relaton/bib/model/item_shared.rb +88 -0
  54. data/lib/relaton/bib/model/keyword.rb +30 -0
  55. data/lib/relaton/bib/model/locality.rb +18 -0
  56. data/lib/relaton/bib/model/locality_stack.rb +14 -0
  57. data/lib/relaton/bib/model/localized_string.rb +48 -0
  58. data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
  59. data/lib/relaton/bib/model/logo.rb +14 -0
  60. data/lib/relaton/bib/model/medium.rb +22 -0
  61. data/lib/relaton/bib/model/note.rb +16 -0
  62. data/lib/relaton/bib/model/organization.rb +13 -0
  63. data/lib/relaton/bib/model/organization_type.rb +42 -0
  64. data/lib/relaton/bib/model/person.rb +36 -0
  65. data/lib/relaton/bib/model/phone.rb +14 -0
  66. data/lib/relaton/bib/model/place.rb +33 -0
  67. data/lib/relaton/bib/model/price.rb +14 -0
  68. data/lib/relaton/bib/model/relation.rb +43 -0
  69. data/lib/relaton/bib/model/series.rb +34 -0
  70. data/lib/relaton/bib/model/size.rb +23 -0
  71. data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
  72. data/lib/relaton/bib/model/status.rb +27 -0
  73. data/lib/relaton/bib/model/structured_identifier.rb +48 -0
  74. data/lib/relaton/bib/model/subdivision.rb +16 -0
  75. data/lib/relaton/bib/model/title.rb +56 -0
  76. data/lib/relaton/bib/model/type/plain_date.rb +16 -0
  77. data/lib/relaton/bib/model/type/string_date.rb +48 -0
  78. data/lib/relaton/bib/model/uri.rb +18 -0
  79. data/lib/relaton/bib/model/validity.rb +16 -0
  80. data/lib/relaton/bib/model/version.rb +43 -0
  81. data/lib/relaton/bib/namespace_helper.rb +21 -0
  82. data/lib/relaton/bib/sanitizer.rb +68 -0
  83. data/lib/relaton/bib/util.rb +18 -0
  84. data/lib/relaton/bib/versions.json +35 -0
  85. data/lib/relaton/bib.rb +48 -0
  86. data/lib/relaton/bipm/bibliography.rb +82 -0
  87. data/lib/relaton/bipm/converter/asciibib.rb +64 -0
  88. data/lib/relaton/bipm/data_fetcher.rb +57 -0
  89. data/lib/relaton/bipm/data_outcomes_parser.rb +657 -0
  90. data/lib/relaton/bipm/id_parser.rb +277 -0
  91. data/lib/relaton/bipm/item_data.rb +47 -0
  92. data/lib/relaton/bipm/model/bibdata.rb +9 -0
  93. data/lib/relaton/bipm/model/bibitem.rb +9 -0
  94. data/lib/relaton/bipm/model/comment_period.rb +13 -0
  95. data/lib/relaton/bipm/model/doctype.rb +12 -0
  96. data/lib/relaton/bipm/model/ext.rb +38 -0
  97. data/lib/relaton/bipm/model/item.rb +11 -0
  98. data/lib/relaton/bipm/model/structured_identifier.rb +15 -0
  99. data/lib/relaton/bipm/processor.rb +69 -0
  100. data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
  101. data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +174 -0
  102. data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
  103. data/lib/relaton/bipm/si_brochure_parser.rb +186 -0
  104. data/lib/relaton/bipm/util.rb +8 -0
  105. data/lib/relaton/bipm.rb +32 -0
  106. data/lib/relaton/bsi/bibliography.rb +124 -0
  107. data/lib/relaton/bsi/hit.rb +14 -0
  108. data/lib/relaton/bsi/hit_collection.rb +114 -0
  109. data/lib/relaton/bsi/item_data.rb +13 -0
  110. data/lib/relaton/bsi/model/bibdata.rb +8 -0
  111. data/lib/relaton/bsi/model/bibitem.rb +8 -0
  112. data/lib/relaton/bsi/model/docidentifier.rb +9 -0
  113. data/lib/relaton/bsi/model/doctype.rb +14 -0
  114. data/lib/relaton/bsi/model/ext.rb +17 -0
  115. data/lib/relaton/bsi/model/item.rb +17 -0
  116. data/lib/relaton/bsi/model/item_base.rb +22 -0
  117. data/lib/relaton/bsi/model/relation.rb +9 -0
  118. data/lib/relaton/bsi/processor.rb +42 -0
  119. data/lib/relaton/bsi/schema.json +24882 -0
  120. data/lib/relaton/bsi/scraper.rb +288 -0
  121. data/lib/relaton/bsi/util.rb +8 -0
  122. data/lib/relaton/bsi.rb +25 -0
  123. data/lib/relaton/calconnect/bibliography.rb +95 -0
  124. data/lib/relaton/calconnect/data_fetcher.rb +106 -0
  125. data/lib/relaton/calconnect/hit.rb +14 -0
  126. data/lib/relaton/calconnect/hit_collection.rb +84 -0
  127. data/lib/relaton/calconnect/item_data.rb +12 -0
  128. data/lib/relaton/calconnect/model/bibdata.rb +8 -0
  129. data/lib/relaton/calconnect/model/bibitem.rb +8 -0
  130. data/lib/relaton/calconnect/model/doctype.rb +11 -0
  131. data/lib/relaton/calconnect/model/ext.rb +11 -0
  132. data/lib/relaton/calconnect/model/item.rb +13 -0
  133. data/lib/relaton/calconnect/processor.rb +66 -0
  134. data/lib/relaton/calconnect/scraper.rb +87 -0
  135. data/lib/relaton/calconnect/util.rb +8 -0
  136. data/lib/relaton/calconnect.rb +26 -0
  137. data/lib/relaton/ccsds/bibliography.rb +63 -0
  138. data/lib/relaton/ccsds/data/fetcher.rb +247 -0
  139. data/lib/relaton/ccsds/data/iso_references.rb +30 -0
  140. data/lib/relaton/ccsds/data/parser.rb +194 -0
  141. data/lib/relaton/ccsds/hit.rb +24 -0
  142. data/lib/relaton/ccsds/hit_collection.rb +42 -0
  143. data/lib/relaton/ccsds/item_data.rb +9 -0
  144. data/lib/relaton/ccsds/model/bibdata.rb +8 -0
  145. data/lib/relaton/ccsds/model/bibitem.rb +8 -0
  146. data/lib/relaton/ccsds/model/doctype.rb +9 -0
  147. data/lib/relaton/ccsds/model/ext.rb +19 -0
  148. data/lib/relaton/ccsds/model/item.rb +13 -0
  149. data/lib/relaton/ccsds/processor.rb +68 -0
  150. data/lib/relaton/ccsds/util.rb +10 -0
  151. data/lib/relaton/ccsds.rb +33 -0
  152. data/lib/relaton/cen/bibliography.rb +121 -0
  153. data/lib/relaton/cen/committees.yaml +66 -0
  154. data/lib/relaton/cen/hit.rb +16 -0
  155. data/lib/relaton/cen/hit_collection.rb +68 -0
  156. data/lib/relaton/cen/item_data.rb +7 -0
  157. data/lib/relaton/cen/model/bibdata.rb +8 -0
  158. data/lib/relaton/cen/model/bibitem.rb +8 -0
  159. data/lib/relaton/cen/model/docidentifier.rb +9 -0
  160. data/lib/relaton/cen/model/ext.rb +11 -0
  161. data/lib/relaton/cen/model/item.rb +14 -0
  162. data/lib/relaton/cen/model/structured_identifier.rb +9 -0
  163. data/lib/relaton/cen/processor.rb +40 -0
  164. data/lib/relaton/cen/scraper.rb +210 -0
  165. data/lib/relaton/cen/util.rb +8 -0
  166. data/lib/relaton/cen.rb +29 -0
  167. data/lib/relaton/cie/bibdata.rb +8 -0
  168. data/lib/relaton/cie/bibitem.rb +8 -0
  169. data/lib/relaton/cie/bibliography.rb +31 -0
  170. data/lib/relaton/cie/data_fetcher.rb +355 -0
  171. data/lib/relaton/cie/ext.rb +7 -0
  172. data/lib/relaton/cie/item.rb +11 -0
  173. data/lib/relaton/cie/item_data.rb +6 -0
  174. data/lib/relaton/cie/processor.rb +66 -0
  175. data/lib/relaton/cie/scrapper.rb +39 -0
  176. data/lib/relaton/cie/util.rb +8 -0
  177. data/lib/relaton/cie.rb +28 -0
  178. data/lib/relaton/core/array_wrapper.rb +20 -0
  179. data/lib/relaton/core/data_fetcher.rb +97 -0
  180. data/lib/relaton/core/date_parser.rb +42 -0
  181. data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
  182. data/lib/relaton/core/hit.rb +49 -0
  183. data/lib/relaton/core/hit_collection.rb +118 -0
  184. data/lib/relaton/core/processor.rb +48 -0
  185. data/lib/relaton/core/workers_pool.rb +45 -0
  186. data/lib/relaton/core.rb +9 -0
  187. data/lib/relaton/db/registry.rb +4 -4
  188. data/lib/relaton/db.rb +0 -1
  189. data/lib/relaton/doi/crossref.rb +72 -0
  190. data/lib/relaton/doi/parser.rb +827 -0
  191. data/lib/relaton/doi/processor.rb +65 -0
  192. data/lib/relaton/doi/util.rb +8 -0
  193. data/lib/relaton/doi.rb +20 -0
  194. data/lib/relaton/ecma/bibdata.rb +8 -0
  195. data/lib/relaton/ecma/bibitem.rb +8 -0
  196. data/lib/relaton/ecma/bibliography.rb +81 -0
  197. data/lib/relaton/ecma/data_fetcher.rb +103 -0
  198. data/lib/relaton/ecma/data_parser.rb +49 -0
  199. data/lib/relaton/ecma/edition_parser.rb +80 -0
  200. data/lib/relaton/ecma/ext.rb +7 -0
  201. data/lib/relaton/ecma/item.rb +11 -0
  202. data/lib/relaton/ecma/item_data.rb +6 -0
  203. data/lib/relaton/ecma/memento_parser.rb +60 -0
  204. data/lib/relaton/ecma/page_fetcher.rb +27 -0
  205. data/lib/relaton/ecma/parser_common.rb +33 -0
  206. data/lib/relaton/ecma/processor.rb +66 -0
  207. data/lib/relaton/ecma/standard_parser.rb +134 -0
  208. data/lib/relaton/ecma/util.rb +8 -0
  209. data/lib/relaton/ecma.rb +24 -0
  210. data/lib/relaton/etsi/bibdata.rb +10 -0
  211. data/lib/relaton/etsi/bibitem.rb +10 -0
  212. data/lib/relaton/etsi/bibliography.rb +46 -0
  213. data/lib/relaton/etsi/data_fetcher.rb +128 -0
  214. data/lib/relaton/etsi/data_parser.rb +208 -0
  215. data/lib/relaton/etsi/doctype.rb +30 -0
  216. data/lib/relaton/etsi/ext.rb +31 -0
  217. data/lib/relaton/etsi/item.rb +15 -0
  218. data/lib/relaton/etsi/item_data.rb +6 -0
  219. data/lib/relaton/etsi/processor.rb +69 -0
  220. data/lib/relaton/etsi/pubid.rb +37 -0
  221. data/lib/relaton/etsi/status.rb +13 -0
  222. data/lib/relaton/etsi/util.rb +8 -0
  223. data/lib/relaton/etsi.rb +25 -0
  224. data/lib/relaton/gb/bibdata.rb +8 -0
  225. data/lib/relaton/gb/bibitem.rb +8 -0
  226. data/lib/relaton/gb/bibliography.rb +145 -0
  227. data/lib/relaton/gb/ccs.rb +14 -0
  228. data/lib/relaton/gb/committee.rb +13 -0
  229. data/lib/relaton/gb/docidentifier.rb +23 -0
  230. data/lib/relaton/gb/doctype.rb +9 -0
  231. data/lib/relaton/gb/ext.rb +36 -0
  232. data/lib/relaton/gb/gb_scraper.rb +61 -0
  233. data/lib/relaton/gb/gb_type.rb +20 -0
  234. data/lib/relaton/gb/hit.rb +48 -0
  235. data/lib/relaton/gb/hit_collection.rb +19 -0
  236. data/lib/relaton/gb/item.rb +13 -0
  237. data/lib/relaton/gb/item_data.rb +6 -0
  238. data/lib/relaton/gb/processor.rb +46 -0
  239. data/lib/relaton/gb/project_number.rb +38 -0
  240. data/lib/relaton/gb/scraper.rb +204 -0
  241. data/lib/relaton/gb/sec_scraper.rb +92 -0
  242. data/lib/relaton/gb/stage_name.rb +13 -0
  243. data/lib/relaton/gb/structured_identifier.rb +26 -0
  244. data/lib/relaton/gb/t_scraper.rb +126 -0
  245. data/lib/relaton/gb/util.rb +8 -0
  246. data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
  247. data/lib/relaton/gb.rb +33 -0
  248. data/lib/relaton/iana/bibdata.rb +8 -0
  249. data/lib/relaton/iana/bibitem.rb +8 -0
  250. data/lib/relaton/iana/bibliography.rb +47 -0
  251. data/lib/relaton/iana/data_fetcher.rb +71 -0
  252. data/lib/relaton/iana/item.rb +7 -0
  253. data/lib/relaton/iana/item_data.rb +6 -0
  254. data/lib/relaton/iana/parser.rb +146 -0
  255. data/lib/relaton/iana/processor.rb +68 -0
  256. data/lib/relaton/iana/util.rb +8 -0
  257. data/lib/relaton/iana.rb +29 -0
  258. data/lib/relaton/iec/bibliography.rb +283 -0
  259. data/lib/relaton/iec/data_fetcher.rb +216 -0
  260. data/lib/relaton/iec/data_parser.rb +391 -0
  261. data/lib/relaton/iec/hit.rb +26 -0
  262. data/lib/relaton/iec/hit_collection.rb +138 -0
  263. data/lib/relaton/iec/item_data.rb +7 -0
  264. data/lib/relaton/iec/model/bibdata.rb +8 -0
  265. data/lib/relaton/iec/model/bibitem.rb +8 -0
  266. data/lib/relaton/iec/model/docidentifier.rb +131 -0
  267. data/lib/relaton/iec/model/doctype.rb +12 -0
  268. data/lib/relaton/iec/model/ext.rb +53 -0
  269. data/lib/relaton/iec/model/item.rb +20 -0
  270. data/lib/relaton/iec/model/item_base.rb +12 -0
  271. data/lib/relaton/iec/model/relation.rb +7 -0
  272. data/lib/relaton/iec/model/stage_name.rb +13 -0
  273. data/lib/relaton/iec/processor.rb +73 -0
  274. data/lib/relaton/iec/statuses.yml +199 -0
  275. data/lib/relaton/iec/util.rb +8 -0
  276. data/lib/relaton/iec.rb +98 -0
  277. data/lib/relaton/ieee/balloting_group.rb +13 -0
  278. data/lib/relaton/ieee/bibdata.rb +8 -0
  279. data/lib/relaton/ieee/bibitem.rb +8 -0
  280. data/lib/relaton/ieee/bibliography.rb +51 -0
  281. data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
  282. data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
  283. data/lib/relaton/ieee/converter/bibxml.rb +20 -0
  284. data/lib/relaton/ieee/data_fetcher.rb +630 -0
  285. data/lib/relaton/ieee/doctype.rb +9 -0
  286. data/lib/relaton/ieee/editorial_group.rb +19 -0
  287. data/lib/relaton/ieee/ext.rb +36 -0
  288. data/lib/relaton/ieee/idams_parser.rb +323 -0
  289. data/lib/relaton/ieee/item.rb +11 -0
  290. data/lib/relaton/ieee/item_data.rb +7 -0
  291. data/lib/relaton/ieee/processor.rb +68 -0
  292. data/lib/relaton/ieee/pub_id.rb +161 -0
  293. data/lib/relaton/ieee/rawbib_id_parser.rb +548 -0
  294. data/lib/relaton/ieee/util.rb +8 -0
  295. data/lib/relaton/ieee.rb +29 -0
  296. data/lib/relaton/ietf/bibdata.rb +8 -0
  297. data/lib/relaton/ietf/bibitem.rb +8 -0
  298. data/lib/relaton/ietf/bibliography.rb +35 -0
  299. data/lib/relaton/ietf/bibxml_parser.rb +232 -0
  300. data/lib/relaton/ietf/data_fetcher.rb +278 -0
  301. data/lib/relaton/ietf/doctype.rb +9 -0
  302. data/lib/relaton/ietf/ext.rb +63 -0
  303. data/lib/relaton/ietf/item.rb +16 -0
  304. data/lib/relaton/ietf/item_base.rb +18 -0
  305. data/lib/relaton/ietf/item_data.rb +6 -0
  306. data/lib/relaton/ietf/processing_instructions.rb +79 -0
  307. data/lib/relaton/ietf/processor.rb +68 -0
  308. data/lib/relaton/ietf/relation.rb +9 -0
  309. data/lib/relaton/ietf/rfc/abstract.rb +19 -0
  310. data/lib/relaton/ietf/rfc/author.rb +21 -0
  311. data/lib/relaton/ietf/rfc/entry.rb +410 -0
  312. data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
  313. data/lib/relaton/ietf/rfc/format.rb +19 -0
  314. data/lib/relaton/ietf/rfc/index.rb +46 -0
  315. data/lib/relaton/ietf/rfc/is_also.rb +21 -0
  316. data/lib/relaton/ietf/rfc/keywords.rb +19 -0
  317. data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
  318. data/lib/relaton/ietf/scraper.rb +68 -0
  319. data/lib/relaton/ietf/util.rb +8 -0
  320. data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
  321. data/lib/relaton/ietf.rb +27 -0
  322. data/lib/relaton/iho/bibdata.rb +8 -0
  323. data/lib/relaton/iho/bibitem.rb +8 -0
  324. data/lib/relaton/iho/bibliography.rb +114 -0
  325. data/lib/relaton/iho/comment_period.rb +13 -0
  326. data/lib/relaton/iho/docidentifier.rb +31 -0
  327. data/lib/relaton/iho/doctype.rb +10 -0
  328. data/lib/relaton/iho/ext.rb +20 -0
  329. data/lib/relaton/iho/hash_parser_v1.rb +144 -0
  330. data/lib/relaton/iho/item.rb +20 -0
  331. data/lib/relaton/iho/item_base.rb +18 -0
  332. data/lib/relaton/iho/item_data.rb +6 -0
  333. data/lib/relaton/iho/processor.rb +54 -0
  334. data/lib/relaton/iho/relation.rb +9 -0
  335. data/lib/relaton/iho/structured_identifier.rb +20 -0
  336. data/lib/relaton/iho/util.rb +8 -0
  337. data/lib/relaton/iho.rb +27 -0
  338. data/lib/relaton/index/config.rb +52 -0
  339. data/lib/relaton/index/file_io.rb +305 -0
  340. data/lib/relaton/index/file_storage.rb +61 -0
  341. data/lib/relaton/index/id_number.rb +30 -0
  342. data/lib/relaton/index/pool.rb +41 -0
  343. data/lib/relaton/index/type.rb +159 -0
  344. data/lib/relaton/index/util.rb +18 -0
  345. data/lib/relaton/index.rb +60 -0
  346. data/lib/relaton/isbn/isbn.rb +61 -0
  347. data/lib/relaton/isbn/open_library.rb +43 -0
  348. data/lib/relaton/isbn/parser.rb +88 -0
  349. data/lib/relaton/isbn/processor.rb +48 -0
  350. data/lib/relaton/isbn/util.rb +8 -0
  351. data/lib/relaton/isbn.rb +19 -0
  352. data/lib/relaton/iso/bibliography.rb +407 -0
  353. data/lib/relaton/iso/data_fetcher.rb +338 -0
  354. data/lib/relaton/iso/data_parser.rb +444 -0
  355. data/lib/relaton/iso/hash_parser_v1.rb +177 -0
  356. data/lib/relaton/iso/hit.rb +57 -0
  357. data/lib/relaton/iso/hit_collection.rb +184 -0
  358. data/lib/relaton/iso/item_data.rb +28 -0
  359. data/lib/relaton/iso/model/bibdata.rb +10 -0
  360. data/lib/relaton/iso/model/bibitem.rb +8 -0
  361. data/lib/relaton/iso/model/contributor.rb +6 -0
  362. data/lib/relaton/iso/model/contributor_info.rb +9 -0
  363. data/lib/relaton/iso/model/docidentifier.rb +134 -0
  364. data/lib/relaton/iso/model/doctype.rb +13 -0
  365. data/lib/relaton/iso/model/ext.rb +35 -0
  366. data/lib/relaton/iso/model/item.rb +17 -0
  367. data/lib/relaton/iso/model/item_base.rb +22 -0
  368. data/lib/relaton/iso/model/organization.rb +9 -0
  369. data/lib/relaton/iso/model/project_number.rb +22 -0
  370. data/lib/relaton/iso/model/relation.rb +9 -0
  371. data/lib/relaton/iso/model/stagename.rb +14 -0
  372. data/lib/relaton/iso/model/structured_identifier.rb +31 -0
  373. data/lib/relaton/iso/processor.rb +84 -0
  374. data/lib/relaton/iso/scraper.rb +619 -0
  375. data/lib/relaton/iso/type/pubid.rb +50 -0
  376. data/lib/relaton/iso/util.rb +8 -0
  377. data/lib/relaton/iso.rb +30 -0
  378. data/lib/relaton/itu/bibliography.rb +90 -0
  379. data/lib/relaton/itu/data_fetcher.rb +104 -0
  380. data/lib/relaton/itu/data_parser_r.rb +140 -0
  381. data/lib/relaton/itu/hit.rb +22 -0
  382. data/lib/relaton/itu/hit_collection.rb +127 -0
  383. data/lib/relaton/itu/item_data.rb +6 -0
  384. data/lib/relaton/itu/model/approval_stage.rb +13 -0
  385. data/lib/relaton/itu/model/bibdata.rb +8 -0
  386. data/lib/relaton/itu/model/bibitem.rb +8 -0
  387. data/lib/relaton/itu/model/docidentifier.rb +9 -0
  388. data/lib/relaton/itu/model/doctype.rb +13 -0
  389. data/lib/relaton/itu/model/ext.rb +47 -0
  390. data/lib/relaton/itu/model/item.rb +13 -0
  391. data/lib/relaton/itu/model/meeting.rb +13 -0
  392. data/lib/relaton/itu/model/meeting_date.rb +15 -0
  393. data/lib/relaton/itu/model/question.rb +13 -0
  394. data/lib/relaton/itu/model/recommendation_status.rb +11 -0
  395. data/lib/relaton/itu/model/structured_identifier.rb +19 -0
  396. data/lib/relaton/itu/processor.rb +66 -0
  397. data/lib/relaton/itu/pubid.rb +177 -0
  398. data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
  399. data/lib/relaton/itu/recommendation_parser.rb +161 -0
  400. data/lib/relaton/itu/scraper.rb +193 -0
  401. data/lib/relaton/itu/util.rb +8 -0
  402. data/lib/relaton/itu.rb +33 -0
  403. data/lib/relaton/jis/bibdata.rb +8 -0
  404. data/lib/relaton/jis/bibitem.rb +8 -0
  405. data/lib/relaton/jis/bibliography.rb +75 -0
  406. data/lib/relaton/jis/data_fetcher.rb +181 -0
  407. data/lib/relaton/jis/docidentifier.rb +21 -0
  408. data/lib/relaton/jis/doctype.rb +9 -0
  409. data/lib/relaton/jis/ext.rb +13 -0
  410. data/lib/relaton/jis/hit.rb +93 -0
  411. data/lib/relaton/jis/hit_collection.rb +127 -0
  412. data/lib/relaton/jis/item.rb +22 -0
  413. data/lib/relaton/jis/item_base.rb +26 -0
  414. data/lib/relaton/jis/item_data.rb +8 -0
  415. data/lib/relaton/jis/processor.rb +55 -0
  416. data/lib/relaton/jis/relation.rb +11 -0
  417. data/lib/relaton/jis/scraper.rb +232 -0
  418. data/lib/relaton/jis/structured_identifier.rb +13 -0
  419. data/lib/relaton/jis/util.rb +8 -0
  420. data/lib/relaton/jis.rb +33 -0
  421. data/lib/relaton/logger/channels/gh_issue.rb +78 -0
  422. data/lib/relaton/logger/config.rb +34 -0
  423. data/lib/relaton/logger/formatter_json.rb +8 -0
  424. data/lib/relaton/logger/formatter_string.rb +12 -0
  425. data/lib/relaton/logger/log.rb +64 -0
  426. data/lib/relaton/logger/log_device.rb +27 -0
  427. data/lib/relaton/logger/pool.rb +24 -0
  428. data/lib/relaton/logger.rb +18 -0
  429. data/lib/relaton/nist/bibdata.rb +8 -0
  430. data/lib/relaton/nist/bibitem.rb +8 -0
  431. data/lib/relaton/nist/bibliography.rb +191 -0
  432. data/lib/relaton/nist/comment_period.rb +15 -0
  433. data/lib/relaton/nist/data_fetcher.rb +84 -0
  434. data/lib/relaton/nist/date.rb +7 -0
  435. data/lib/relaton/nist/doctype.rb +7 -0
  436. data/lib/relaton/nist/ext.rb +16 -0
  437. data/lib/relaton/nist/hit.rb +18 -0
  438. data/lib/relaton/nist/hit_collection.rb +362 -0
  439. data/lib/relaton/nist/item.rb +17 -0
  440. data/lib/relaton/nist/item_data.rb +6 -0
  441. data/lib/relaton/nist/mods_parser.rb +276 -0
  442. data/lib/relaton/nist/processor.rb +68 -0
  443. data/lib/relaton/nist/pubs_export.rb +69 -0
  444. data/lib/relaton/nist/relation.rb +7 -0
  445. data/lib/relaton/nist/scraper.rb +290 -0
  446. data/lib/relaton/nist/series.yaml +49 -0
  447. data/lib/relaton/nist/util.rb +8 -0
  448. data/lib/relaton/nist.rb +34 -0
  449. data/lib/relaton/oasis/bibdata.rb +8 -0
  450. data/lib/relaton/oasis/bibitem.rb +8 -0
  451. data/lib/relaton/oasis/bibliography.rb +60 -0
  452. data/lib/relaton/oasis/browser_agent.rb +71 -0
  453. data/lib/relaton/oasis/data_fetcher.rb +94 -0
  454. data/lib/relaton/oasis/data_parser.rb +305 -0
  455. data/lib/relaton/oasis/data_parser_utils.rb +296 -0
  456. data/lib/relaton/oasis/data_part_parser.rb +239 -0
  457. data/lib/relaton/oasis/doctype.rb +7 -0
  458. data/lib/relaton/oasis/ext.rb +19 -0
  459. data/lib/relaton/oasis/item.rb +11 -0
  460. data/lib/relaton/oasis/item_data.rb +6 -0
  461. data/lib/relaton/oasis/processor.rb +68 -0
  462. data/lib/relaton/oasis/util.rb +8 -0
  463. data/lib/relaton/oasis.rb +28 -0
  464. data/lib/relaton/ogc/bibdata.rb +8 -0
  465. data/lib/relaton/ogc/bibitem.rb +8 -0
  466. data/lib/relaton/ogc/bibliography.rb +64 -0
  467. data/lib/relaton/ogc/data_fetcher.rb +110 -0
  468. data/lib/relaton/ogc/docidentifier.rb +6 -0
  469. data/lib/relaton/ogc/doctype.rb +12 -0
  470. data/lib/relaton/ogc/ext.rb +15 -0
  471. data/lib/relaton/ogc/hit.rb +18 -0
  472. data/lib/relaton/ogc/hit_collection.rb +36 -0
  473. data/lib/relaton/ogc/item.rb +13 -0
  474. data/lib/relaton/ogc/item_data.rb +6 -0
  475. data/lib/relaton/ogc/processor.rb +58 -0
  476. data/lib/relaton/ogc/scraper.rb +225 -0
  477. data/lib/relaton/ogc/util.rb +8 -0
  478. data/lib/relaton/ogc.rb +26 -0
  479. data/lib/relaton/oiml/bibdata.rb +8 -0
  480. data/lib/relaton/oiml/bibitem.rb +8 -0
  481. data/lib/relaton/oiml/bibliography.rb +94 -0
  482. data/lib/relaton/oiml/docidentifier.rb +33 -0
  483. data/lib/relaton/oiml/doctype.rb +13 -0
  484. data/lib/relaton/oiml/ext.rb +42 -0
  485. data/lib/relaton/oiml/item.rb +20 -0
  486. data/lib/relaton/oiml/item_base.rb +18 -0
  487. data/lib/relaton/oiml/item_data.rb +6 -0
  488. data/lib/relaton/oiml/processor.rb +54 -0
  489. data/lib/relaton/oiml/relation.rb +9 -0
  490. data/lib/relaton/oiml/util.rb +8 -0
  491. data/lib/relaton/oiml.rb +24 -0
  492. data/lib/relaton/omg/bibdata.rb +8 -0
  493. data/lib/relaton/omg/bibitem.rb +8 -0
  494. data/lib/relaton/omg/bibliography.rb +31 -0
  495. data/lib/relaton/omg/ext.rb +7 -0
  496. data/lib/relaton/omg/item.rb +8 -0
  497. data/lib/relaton/omg/item_data.rb +6 -0
  498. data/lib/relaton/omg/processor.rb +34 -0
  499. data/lib/relaton/omg/scraper.rb +141 -0
  500. data/lib/relaton/omg/util.rb +8 -0
  501. data/lib/relaton/omg.rb +24 -0
  502. data/lib/relaton/plateau/bibdata.rb +8 -0
  503. data/lib/relaton/plateau/bibitem.rb +8 -0
  504. data/lib/relaton/plateau/bibliography.rb +24 -0
  505. data/lib/relaton/plateau/data_fetcher.rb +153 -0
  506. data/lib/relaton/plateau/doctype.rb +7 -0
  507. data/lib/relaton/plateau/ext.rb +23 -0
  508. data/lib/relaton/plateau/handbook_parser.rb +95 -0
  509. data/lib/relaton/plateau/hit.rb +13 -0
  510. data/lib/relaton/plateau/hit_collection.rb +59 -0
  511. data/lib/relaton/plateau/item.rb +12 -0
  512. data/lib/relaton/plateau/item_data.rb +6 -0
  513. data/lib/relaton/plateau/parser.rb +101 -0
  514. data/lib/relaton/plateau/processor.rb +49 -0
  515. data/lib/relaton/plateau/technical_report_parser.rb +91 -0
  516. data/lib/relaton/plateau/util.rb +8 -0
  517. data/lib/relaton/plateau.rb +28 -0
  518. data/lib/relaton/un/bibdata.rb +8 -0
  519. data/lib/relaton/un/bibitem.rb +8 -0
  520. data/lib/relaton/un/bibliography.rb +48 -0
  521. data/lib/relaton/un/doctype.rb +10 -0
  522. data/lib/relaton/un/ext.rb +30 -0
  523. data/lib/relaton/un/hit.rb +56 -0
  524. data/lib/relaton/un/hit_collection.rb +61 -0
  525. data/lib/relaton/un/item.rb +11 -0
  526. data/lib/relaton/un/item_data.rb +6 -0
  527. data/lib/relaton/un/parser.rb +108 -0
  528. data/lib/relaton/un/processor.rb +38 -0
  529. data/lib/relaton/un/session.rb +25 -0
  530. data/lib/relaton/un/token_generator.rb +105 -0
  531. data/lib/relaton/un/util.rb +8 -0
  532. data/lib/relaton/un/wasm/decoder.rb +434 -0
  533. data/lib/relaton/un/wasm/instance.rb +101 -0
  534. data/lib/relaton/un/wasm/interpreter.rb +613 -0
  535. data/lib/relaton/un/wasm/memory.rb +112 -0
  536. data/lib/relaton/un/wasm/module.rb +47 -0
  537. data/lib/relaton/un/wasm.rb +17 -0
  538. data/lib/relaton/un/wasm_v_bg.wasm +0 -0
  539. data/lib/relaton/un.rb +28 -0
  540. data/lib/relaton/version.rb +1 -1
  541. data/lib/relaton/w3c/bibdata.rb +8 -0
  542. data/lib/relaton/w3c/bibitem.rb +8 -0
  543. data/lib/relaton/w3c/bibliography.rb +54 -0
  544. data/lib/relaton/w3c/data_fetcher.rb +309 -0
  545. data/lib/relaton/w3c/data_parser.rb +379 -0
  546. data/lib/relaton/w3c/doctype.rb +7 -0
  547. data/lib/relaton/w3c/ext.rb +11 -0
  548. data/lib/relaton/w3c/item.rb +12 -0
  549. data/lib/relaton/w3c/item_data.rb +6 -0
  550. data/lib/relaton/w3c/processor.rb +49 -0
  551. data/lib/relaton/w3c/pubid.rb +73 -0
  552. data/lib/relaton/w3c/safe_realize.rb +59 -0
  553. data/lib/relaton/w3c/util.rb +8 -0
  554. data/lib/relaton/w3c.rb +25 -0
  555. data/lib/relaton/xsf/bibdata.rb +8 -0
  556. data/lib/relaton/xsf/bibitem.rb +8 -0
  557. data/lib/relaton/xsf/bibliography.rb +24 -0
  558. data/lib/relaton/xsf/data_fetcher.rb +56 -0
  559. data/lib/relaton/xsf/hit.rb +17 -0
  560. data/lib/relaton/xsf/hit_collection.rb +24 -0
  561. data/lib/relaton/xsf/item.rb +7 -0
  562. data/lib/relaton/xsf/item_data.rb +6 -0
  563. data/lib/relaton/xsf/processor.rb +50 -0
  564. data/lib/relaton/xsf/util.rb +9 -0
  565. data/lib/relaton/xsf.rb +30 -0
  566. data/lib/relaton-core.rb +1 -0
  567. data/lib/relaton.rb +43 -0
  568. metadata +673 -170
  569. data/.github/workflows/rake.yml +0 -14
  570. data/.github/workflows/release.yml +0 -24
  571. data/.github/workflows/rubocop.yml +0 -48
  572. data/.gitignore +0 -12
  573. data/.rspec +0 -3
  574. data/CLAUDE.md +0 -78
  575. data/Gemfile +0 -29
  576. data/Rakefile +0 -6
  577. data/docs/CHANGELOG.adoc +0 -16
  578. data/docs/VERSIONING_POLICY.adoc +0 -38
  579. data/docs/navigation.adoc +0 -6
  580. data/lib/relaton/db/version.rb +0 -5
  581. data/relaton.gemspec +0 -72
  582. data/spec/relaton/config_spec.rb +0 -10
  583. data/spec/relaton/db_cache_spec.rb +0 -51
  584. data/spec/relaton/db_spec.rb +0 -567
  585. data/spec/relaton/registry_spec.rb +0 -178
  586. data/spec/relaton/util_spec.rb +0 -3
  587. data/spec/relaton_meta_spec.rb +0 -25
  588. data/spec/relaton_spec.rb +0 -800
  589. data/spec/spec_helper.rb +0 -45
  590. data/spec/support/gb_t_20223_2006.xml +0 -33
  591. data/spec/support/iso_111111119115_1.xml +0 -0
  592. data/spec/support/iso_19115_1.xml +0 -115
  593. data/spec/support/iso_19115_2.xml +0 -95
  594. data/spec/support/rfc_8341.xml +0 -46
  595. data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
  596. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
  597. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
  598. data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
  599. data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
  600. data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
  601. data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
  602. data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
  603. data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
  604. data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
  605. data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
  606. data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
  607. data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
  608. data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
  609. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
  610. data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
@@ -0,0 +1,613 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Un
5
+ module Wasm
6
+ I32_MASK = 0xFFFF_FFFF
7
+ I64_MASK = 0xFFFF_FFFF_FFFF_FFFF
8
+ I32_SIGN = 0x8000_0000
9
+ I64_SIGN = 0x8000_0000_0000_0000
10
+ I32_RANGE = 0x1_0000_0000
11
+ I64_RANGE = 0x1_0000_0000_0000_0000
12
+
13
+ # Convert unsigned i32/i64 to signed.
14
+ def self.to_s32(x); x >= I32_SIGN ? x - I32_RANGE : x; end
15
+ def self.to_s64(x); x >= I64_SIGN ? x - I64_RANGE : x; end
16
+
17
+ # A wasm function — module-defined or imported.
18
+ FuncRef = Struct.new(:type, :kind, :code, :proc) do
19
+ def imported?; kind == :import; end
20
+ end
21
+
22
+ # The `caller` object passed to imported procs. Mirrors the shape the
23
+ # existing token_generator.rb expects: `caller.export("memory").to_memory`
24
+ # and `caller.export("__wbindgen_malloc").to_func`.
25
+ class Caller
26
+ def initialize(instance)
27
+ @instance = instance
28
+ end
29
+
30
+ def export(name)
31
+ ExportRef.new(@instance, name)
32
+ end
33
+ end
34
+
35
+ ExportRef = Struct.new(:instance, :name) do
36
+ def to_memory; MemoryAdapter.new(instance.memory); end
37
+
38
+ def to_func
39
+ func_idx = instance.export_index(name, :func)
40
+ ->(*args) { instance.invoke_by_index(func_idx, args) }
41
+ end
42
+ end
43
+
44
+ # Thin shim presenting the wasmtime Memory API the existing import
45
+ # bodies expect: #read(addr, len) returning bytes, #write(addr, bytes).
46
+ MemoryAdapter = Struct.new(:memory) do
47
+ def read(addr, len); memory.read(addr, len); end
48
+ def write(addr, bytes); memory.write(addr, bytes); end
49
+ end
50
+
51
+ class Interpreter
52
+ def initialize(instance)
53
+ @instance = instance
54
+ end
55
+
56
+ def invoke(func_idx, args)
57
+ func = @instance.funcs[func_idx]
58
+ if func.imported?
59
+ return func.proc.call(Caller.new(@instance), *args)
60
+ end
61
+
62
+ run_function(func, args)
63
+ end
64
+
65
+ private
66
+
67
+ def run_function(func, args) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/PerceivedComplexity,Metrics/CyclomaticComplexity
68
+ ftype = func.type
69
+ # locals = function args + declared locals (zero-initialized)
70
+ locals = Array.new(ftype.params.size + func.code.locals.size, 0)
71
+ ftype.params.each_with_index { |_t, i| locals[i] = args[i] }
72
+
73
+ body = func.code.body
74
+ vstack = []
75
+ # Each label: [target_pc, arity, value_stack_height_at_entry, is_loop]
76
+ # Function-level implicit label: target_pc past end, arity = result arity.
77
+ label_stack = [[body.size, ftype.results.size, 0, false]]
78
+ pc = 0
79
+
80
+ while pc < body.size
81
+ instr = body[pc]
82
+ op = instr[0]
83
+
84
+ case op
85
+ when :local_get
86
+ vstack << locals[instr[1]]
87
+ pc += 1
88
+ when :i32_const, :i64_const
89
+ vstack << instr[1]
90
+ pc += 1
91
+ when :i32_add
92
+ b = vstack.pop; a = vstack.pop
93
+ vstack << ((a + b) & I32_MASK)
94
+ pc += 1
95
+ when :i32_xor
96
+ b = vstack.pop; a = vstack.pop
97
+ vstack << ((a ^ b) & I32_MASK)
98
+ pc += 1
99
+ when :i32_and
100
+ b = vstack.pop; a = vstack.pop
101
+ vstack << ((a & b) & I32_MASK)
102
+ pc += 1
103
+ when :i32_or
104
+ b = vstack.pop; a = vstack.pop
105
+ vstack << ((a | b) & I32_MASK)
106
+ pc += 1
107
+ when :i32_sub
108
+ b = vstack.pop; a = vstack.pop
109
+ vstack << ((a - b) & I32_MASK)
110
+ pc += 1
111
+ when :i32_mul
112
+ b = vstack.pop; a = vstack.pop
113
+ vstack << ((a * b) & I32_MASK)
114
+ pc += 1
115
+ when :i32_shl
116
+ b = vstack.pop; a = vstack.pop
117
+ vstack << ((a << (b & 31)) & I32_MASK)
118
+ pc += 1
119
+ when :i32_shr_u
120
+ b = vstack.pop; a = vstack.pop
121
+ vstack << ((a & I32_MASK) >> (b & 31))
122
+ pc += 1
123
+ when :i32_shr_s
124
+ b = vstack.pop; a = Wasm.to_s32(vstack.pop)
125
+ shift = b & 31
126
+ vstack << ((a >> shift) & I32_MASK)
127
+ pc += 1
128
+ when :i32_rotl
129
+ b = vstack.pop; a = vstack.pop & I32_MASK
130
+ n = b & 31
131
+ vstack << (((a << n) | (a >> (32 - n))) & I32_MASK)
132
+ pc += 1
133
+ when :i32_rotr
134
+ b = vstack.pop; a = vstack.pop & I32_MASK
135
+ n = b & 31
136
+ vstack << (((a >> n) | (a << (32 - n))) & I32_MASK)
137
+ pc += 1
138
+ when :i32_load
139
+ addr = vstack.pop + instr[2]
140
+ vstack << @instance.memory.load_u32(addr)
141
+ pc += 1
142
+ when :i32_store
143
+ v = vstack.pop; addr = vstack.pop + instr[2]
144
+ @instance.memory.store_u32(addr, v)
145
+ pc += 1
146
+ when :i32_load8_u
147
+ addr = vstack.pop + instr[2]
148
+ vstack << @instance.memory.load_u8(addr)
149
+ pc += 1
150
+ when :i32_load8_s
151
+ addr = vstack.pop + instr[2]
152
+ vstack << (@instance.memory.load_i8(addr) & I32_MASK)
153
+ pc += 1
154
+ when :i32_load16_u
155
+ addr = vstack.pop + instr[2]
156
+ vstack << @instance.memory.load_u16(addr)
157
+ pc += 1
158
+ when :i32_load16_s
159
+ addr = vstack.pop + instr[2]
160
+ vstack << (@instance.memory.load_i16(addr) & I32_MASK)
161
+ pc += 1
162
+ when :i32_store8
163
+ v = vstack.pop; addr = vstack.pop + instr[2]
164
+ @instance.memory.store_u8(addr, v)
165
+ pc += 1
166
+ when :i32_store16
167
+ v = vstack.pop; addr = vstack.pop + instr[2]
168
+ @instance.memory.store_u16(addr, v)
169
+ pc += 1
170
+ when :i64_load
171
+ addr = vstack.pop + instr[2]
172
+ vstack << @instance.memory.load_u64(addr)
173
+ pc += 1
174
+ when :i64_store
175
+ v = vstack.pop; addr = vstack.pop + instr[2]
176
+ @instance.memory.store_u64(addr, v)
177
+ pc += 1
178
+ when :i64_load8_u
179
+ addr = vstack.pop + instr[2]
180
+ vstack << @instance.memory.load_u8(addr)
181
+ pc += 1
182
+ when :i64_load8_s
183
+ addr = vstack.pop + instr[2]
184
+ vstack << (@instance.memory.load_i8(addr) & I64_MASK)
185
+ pc += 1
186
+ when :i64_load16_u
187
+ addr = vstack.pop + instr[2]
188
+ vstack << @instance.memory.load_u16(addr)
189
+ pc += 1
190
+ when :i64_load16_s
191
+ addr = vstack.pop + instr[2]
192
+ vstack << (@instance.memory.load_i16(addr) & I64_MASK)
193
+ pc += 1
194
+ when :i64_load32_u
195
+ addr = vstack.pop + instr[2]
196
+ vstack << @instance.memory.load_u32(addr)
197
+ pc += 1
198
+ when :i64_load32_s
199
+ addr = vstack.pop + instr[2]
200
+ vstack << (@instance.memory.load_i32(addr) & I64_MASK)
201
+ pc += 1
202
+ when :i64_store8
203
+ v = vstack.pop; addr = vstack.pop + instr[2]
204
+ @instance.memory.store_u8(addr, v)
205
+ pc += 1
206
+ when :i64_store16
207
+ v = vstack.pop; addr = vstack.pop + instr[2]
208
+ @instance.memory.store_u16(addr, v)
209
+ pc += 1
210
+ when :i64_store32
211
+ v = vstack.pop; addr = vstack.pop + instr[2]
212
+ @instance.memory.store_u32(addr, v)
213
+ pc += 1
214
+ when :br_if
215
+ cond = vstack.pop
216
+ if cond.zero?
217
+ pc += 1
218
+ else
219
+ pc = do_branch(label_stack, vstack, instr[1])
220
+ return finish(vstack, ftype) if label_stack.empty?
221
+ end
222
+ when :br
223
+ pc = do_branch(label_stack, vstack, instr[1])
224
+ return finish(vstack, ftype) if label_stack.empty?
225
+ when :block
226
+ # [:block, blocktype, end_pc]
227
+ arity = block_result_arity(instr[1])
228
+ label_stack << [instr[2] + 1, arity, vstack.size - block_param_arity(instr[1]), false]
229
+ pc += 1
230
+ when :loop
231
+ # [:loop, blocktype, end_pc]; br to a loop re-executes the loop
232
+ # op (which freshly pushes a label), so target_pc = the loop op
233
+ # itself.
234
+ arity = block_param_arity(instr[1])
235
+ label_stack << [pc, arity, vstack.size - arity, true]
236
+ pc += 1
237
+ when :if
238
+ # [:if, blocktype, else_pc, end_pc]
239
+ cond = vstack.pop
240
+ arity = block_result_arity(instr[1])
241
+ label_stack << [instr[3] + 1, arity, vstack.size - block_param_arity(instr[1]), false]
242
+ if cond.zero?
243
+ else_pc = instr[2]
244
+ end_pc = instr[3]
245
+ pc = (else_pc == end_pc ? end_pc : else_pc + 1)
246
+ else
247
+ pc += 1
248
+ end
249
+ when :else
250
+ # Reached at end of the then-branch: skip the else body to end+1.
251
+ pc = instr[1] + 1
252
+ when :end
253
+ label_stack.pop
254
+ return finish(vstack, ftype) if label_stack.empty?
255
+
256
+ pc += 1
257
+ when :local_set
258
+ locals[instr[1]] = vstack.pop
259
+ pc += 1
260
+ when :local_tee
261
+ locals[instr[1]] = vstack.last
262
+ pc += 1
263
+ when :global_get
264
+ vstack << @instance.globals[instr[1]]
265
+ pc += 1
266
+ when :global_set
267
+ @instance.globals[instr[1]] = vstack.pop
268
+ pc += 1
269
+ when :i32_eqz
270
+ vstack << (vstack.pop.zero? ? 1 : 0)
271
+ pc += 1
272
+ when :i32_eq
273
+ b = vstack.pop; a = vstack.pop
274
+ vstack << (a == b ? 1 : 0)
275
+ pc += 1
276
+ when :i32_ne
277
+ b = vstack.pop; a = vstack.pop
278
+ vstack << (a == b ? 0 : 1)
279
+ pc += 1
280
+ when :i32_lt_u
281
+ b = vstack.pop; a = vstack.pop
282
+ vstack << (a < b ? 1 : 0)
283
+ pc += 1
284
+ when :i32_lt_s
285
+ b = Wasm.to_s32(vstack.pop); a = Wasm.to_s32(vstack.pop)
286
+ vstack << (a < b ? 1 : 0)
287
+ pc += 1
288
+ when :i32_gt_u
289
+ b = vstack.pop; a = vstack.pop
290
+ vstack << (a > b ? 1 : 0)
291
+ pc += 1
292
+ when :i32_gt_s
293
+ b = Wasm.to_s32(vstack.pop); a = Wasm.to_s32(vstack.pop)
294
+ vstack << (a > b ? 1 : 0)
295
+ pc += 1
296
+ when :i32_le_u
297
+ b = vstack.pop; a = vstack.pop
298
+ vstack << (a <= b ? 1 : 0)
299
+ pc += 1
300
+ when :i32_le_s
301
+ b = Wasm.to_s32(vstack.pop); a = Wasm.to_s32(vstack.pop)
302
+ vstack << (a <= b ? 1 : 0)
303
+ pc += 1
304
+ when :i32_ge_u
305
+ b = vstack.pop; a = vstack.pop
306
+ vstack << (a >= b ? 1 : 0)
307
+ pc += 1
308
+ when :i32_ge_s
309
+ b = Wasm.to_s32(vstack.pop); a = Wasm.to_s32(vstack.pop)
310
+ vstack << (a >= b ? 1 : 0)
311
+ pc += 1
312
+ when :i32_clz
313
+ v = vstack.pop & I32_MASK
314
+ vstack << (v.zero? ? 32 : 32 - v.bit_length)
315
+ pc += 1
316
+ when :i32_ctz
317
+ v = vstack.pop & I32_MASK
318
+ if v.zero?
319
+ vstack << 32
320
+ else
321
+ n = 0
322
+ n += 1 while ((v >> n) & 1).zero?
323
+ vstack << n
324
+ end
325
+ pc += 1
326
+ when :i32_popcnt
327
+ vstack << (vstack.pop & I32_MASK).to_s(2).count("1")
328
+ pc += 1
329
+ when :i32_div_u
330
+ b = vstack.pop; a = vstack.pop
331
+ raise Trap, "integer divide by zero" if b.zero?
332
+
333
+ vstack << (a / b)
334
+ pc += 1
335
+ when :i32_div_s
336
+ b = Wasm.to_s32(vstack.pop); a = Wasm.to_s32(vstack.pop)
337
+ raise Trap, "integer divide by zero" if b.zero?
338
+ raise Trap, "integer overflow" if a == -0x8000_0000 && b == -1
339
+
340
+ # Truncate toward zero
341
+ q = a.abs / b.abs
342
+ q = -q if (a < 0) ^ (b < 0)
343
+ vstack << (q & I32_MASK)
344
+ pc += 1
345
+ when :i32_rem_u
346
+ b = vstack.pop; a = vstack.pop
347
+ raise Trap, "integer divide by zero" if b.zero?
348
+
349
+ vstack << (a % b)
350
+ pc += 1
351
+ when :i32_rem_s
352
+ b = Wasm.to_s32(vstack.pop); a = Wasm.to_s32(vstack.pop)
353
+ raise Trap, "integer divide by zero" if b.zero?
354
+
355
+ r = a.abs % b.abs
356
+ r = -r if a < 0
357
+ vstack << (r & I32_MASK)
358
+ pc += 1
359
+ when :i64_add
360
+ b = vstack.pop; a = vstack.pop
361
+ vstack << ((a + b) & I64_MASK)
362
+ pc += 1
363
+ when :i64_sub
364
+ b = vstack.pop; a = vstack.pop
365
+ vstack << ((a - b) & I64_MASK)
366
+ pc += 1
367
+ when :i64_mul
368
+ b = vstack.pop; a = vstack.pop
369
+ vstack << ((a * b) & I64_MASK)
370
+ pc += 1
371
+ when :i64_and
372
+ b = vstack.pop; a = vstack.pop
373
+ vstack << ((a & b) & I64_MASK)
374
+ pc += 1
375
+ when :i64_or
376
+ b = vstack.pop; a = vstack.pop
377
+ vstack << ((a | b) & I64_MASK)
378
+ pc += 1
379
+ when :i64_xor
380
+ b = vstack.pop; a = vstack.pop
381
+ vstack << ((a ^ b) & I64_MASK)
382
+ pc += 1
383
+ when :i64_shl
384
+ b = vstack.pop; a = vstack.pop
385
+ vstack << ((a << (b & 63)) & I64_MASK)
386
+ pc += 1
387
+ when :i64_shr_u
388
+ b = vstack.pop; a = vstack.pop
389
+ vstack << ((a & I64_MASK) >> (b & 63))
390
+ pc += 1
391
+ when :i64_shr_s
392
+ b = vstack.pop; a = Wasm.to_s64(vstack.pop)
393
+ shift = b & 63
394
+ vstack << ((a >> shift) & I64_MASK)
395
+ pc += 1
396
+ when :i64_rotl
397
+ b = vstack.pop; a = vstack.pop & I64_MASK
398
+ n = b & 63
399
+ vstack << (((a << n) | (a >> (64 - n))) & I64_MASK)
400
+ pc += 1
401
+ when :i64_rotr
402
+ b = vstack.pop; a = vstack.pop & I64_MASK
403
+ n = b & 63
404
+ vstack << (((a >> n) | (a << (64 - n))) & I64_MASK)
405
+ pc += 1
406
+ when :i64_eqz
407
+ vstack << (vstack.pop.zero? ? 1 : 0)
408
+ pc += 1
409
+ when :i64_eq
410
+ b = vstack.pop; a = vstack.pop
411
+ vstack << (a == b ? 1 : 0)
412
+ pc += 1
413
+ when :i64_ne
414
+ b = vstack.pop; a = vstack.pop
415
+ vstack << (a == b ? 0 : 1)
416
+ pc += 1
417
+ when :i64_lt_u
418
+ b = vstack.pop; a = vstack.pop
419
+ vstack << (a < b ? 1 : 0)
420
+ pc += 1
421
+ when :i64_lt_s
422
+ b = Wasm.to_s64(vstack.pop); a = Wasm.to_s64(vstack.pop)
423
+ vstack << (a < b ? 1 : 0)
424
+ pc += 1
425
+ when :i64_gt_u
426
+ b = vstack.pop; a = vstack.pop
427
+ vstack << (a > b ? 1 : 0)
428
+ pc += 1
429
+ when :i64_gt_s
430
+ b = Wasm.to_s64(vstack.pop); a = Wasm.to_s64(vstack.pop)
431
+ vstack << (a > b ? 1 : 0)
432
+ pc += 1
433
+ when :i64_le_u
434
+ b = vstack.pop; a = vstack.pop
435
+ vstack << (a <= b ? 1 : 0)
436
+ pc += 1
437
+ when :i64_le_s
438
+ b = Wasm.to_s64(vstack.pop); a = Wasm.to_s64(vstack.pop)
439
+ vstack << (a <= b ? 1 : 0)
440
+ pc += 1
441
+ when :i64_ge_u
442
+ b = vstack.pop; a = vstack.pop
443
+ vstack << (a >= b ? 1 : 0)
444
+ pc += 1
445
+ when :i64_ge_s
446
+ b = Wasm.to_s64(vstack.pop); a = Wasm.to_s64(vstack.pop)
447
+ vstack << (a >= b ? 1 : 0)
448
+ pc += 1
449
+ when :i64_div_u
450
+ b = vstack.pop; a = vstack.pop
451
+ raise Trap, "integer divide by zero" if b.zero?
452
+
453
+ vstack << (a / b)
454
+ pc += 1
455
+ when :i64_clz
456
+ v = vstack.pop & I64_MASK
457
+ vstack << (v.zero? ? 64 : 64 - v.bit_length)
458
+ pc += 1
459
+ when :i64_ctz
460
+ v = vstack.pop & I64_MASK
461
+ if v.zero?
462
+ vstack << 64
463
+ else
464
+ n = 0
465
+ n += 1 while ((v >> n) & 1).zero?
466
+ vstack << n
467
+ end
468
+ pc += 1
469
+ when :i32_wrap_i64
470
+ vstack << (vstack.pop & I32_MASK)
471
+ pc += 1
472
+ when :i64_extend_i32_u
473
+ vstack << (vstack.pop & I32_MASK)
474
+ pc += 1
475
+ when :i64_extend_i32_s
476
+ vstack << (Wasm.to_s32(vstack.pop) & I64_MASK)
477
+ pc += 1
478
+ when :i32_extend8_s
479
+ v = vstack.pop & 0xFF
480
+ v -= 0x100 if v >= 0x80
481
+ vstack << (v & I32_MASK)
482
+ pc += 1
483
+ when :i32_extend16_s
484
+ v = vstack.pop & 0xFFFF
485
+ v -= 0x10000 if v >= 0x8000
486
+ vstack << (v & I32_MASK)
487
+ pc += 1
488
+ when :i64_extend8_s
489
+ v = vstack.pop & 0xFF
490
+ v -= 0x100 if v >= 0x80
491
+ vstack << (v & I64_MASK)
492
+ pc += 1
493
+ when :i64_extend16_s
494
+ v = vstack.pop & 0xFFFF
495
+ v -= 0x10000 if v >= 0x8000
496
+ vstack << (v & I64_MASK)
497
+ pc += 1
498
+ when :i64_extend32_s
499
+ v = vstack.pop & I32_MASK
500
+ v -= I32_RANGE if v >= I32_SIGN
501
+ vstack << (v & I64_MASK)
502
+ pc += 1
503
+ when :drop
504
+ vstack.pop
505
+ pc += 1
506
+ when :select
507
+ cond = vstack.pop
508
+ v2 = vstack.pop
509
+ v1 = vstack.pop
510
+ vstack << (cond.zero? ? v2 : v1)
511
+ pc += 1
512
+ when :call
513
+ callee_idx = instr[1]
514
+ callee = @instance.funcs[callee_idx]
515
+ n = callee.type.params.size
516
+ args2 = vstack.pop(n)
517
+ result = invoke(callee_idx, args2)
518
+ push_results(vstack, result, callee.type.results.size)
519
+ pc += 1
520
+ when :call_indirect
521
+ type_idx = instr[1]
522
+ table_entry = vstack.pop
523
+ callee_idx = @instance.table[table_entry]
524
+ raise Trap, "null funcref" if callee_idx.nil?
525
+
526
+ callee = @instance.funcs[callee_idx]
527
+ expected = @instance.types[type_idx]
528
+ if callee.type.params != expected.params || callee.type.results != expected.results
529
+ raise Trap, "indirect call type mismatch"
530
+ end
531
+
532
+ n = callee.type.params.size
533
+ args2 = vstack.pop(n)
534
+ result = invoke(callee_idx, args2)
535
+ push_results(vstack, result, callee.type.results.size)
536
+ pc += 1
537
+ when :return_
538
+ return finish(vstack, ftype)
539
+ when :br_table
540
+ idx = vstack.pop
541
+ depth = idx < instr[1].size ? instr[1][idx] : instr[2]
542
+ pc = do_branch(label_stack, vstack, depth)
543
+ return finish(vstack, ftype) if label_stack.empty?
544
+ when :memory_size
545
+ vstack << @instance.memory.size_pages
546
+ pc += 1
547
+ when :memory_grow
548
+ vstack << @instance.memory.grow(vstack.pop)
549
+ pc += 1
550
+ when :unreachable
551
+ raise Trap, "unreachable executed"
552
+ when :nop
553
+ pc += 1
554
+ else
555
+ raise Trap, "unimplemented op #{op.inspect} at pc=#{pc}"
556
+ end
557
+ end
558
+
559
+ finish(vstack, ftype)
560
+ end
561
+
562
+ # Branch to label depth N: pop arity vals, drop N+1 labels, restore
563
+ # value stack to that label's base height, re-push the saved vals,
564
+ # return the target pc. For loops, target points back at the loop op
565
+ # which will re-push a fresh label on re-execution.
566
+ def do_branch(label_stack, vstack, depth)
567
+ label = label_stack[label_stack.size - 1 - depth]
568
+ target_pc, arity, base_height, _is_loop = label
569
+ saved = arity.positive? ? vstack.last(arity) : []
570
+ (depth + 1).times { label_stack.pop }
571
+ vstack.slice!(base_height..)
572
+ saved.each { |v| vstack << v }
573
+ target_pc
574
+ end
575
+
576
+ def block_result_arity(blocktype)
577
+ case blocktype[0]
578
+ when :empty then 0
579
+ when :value then 1
580
+ when :typeidx
581
+ @instance.types[blocktype[1]].results.size
582
+ end
583
+ end
584
+
585
+ def block_param_arity(blocktype)
586
+ case blocktype[0]
587
+ when :empty, :value then 0
588
+ when :typeidx
589
+ @instance.types[blocktype[1]].params.size
590
+ end
591
+ end
592
+
593
+ def push_results(vstack, result, expected)
594
+ case expected
595
+ when 0 then nil
596
+ when 1
597
+ vstack << result
598
+ else
599
+ result.each { |v| vstack << v }
600
+ end
601
+ end
602
+
603
+ def finish(vstack, ftype)
604
+ case ftype.results.size
605
+ when 0 then nil
606
+ when 1 then vstack.last
607
+ else vstack.last(ftype.results.size)
608
+ end
609
+ end
610
+ end
611
+ end
612
+ end
613
+ end