mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Compare commits
1419 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1a9bdfcde5 | |||
| 112120969d | |||
| 63956036e1 | |||
| cdf45438f0 | |||
| b6b9c57f24 | |||
| aa578c346d | |||
| ac8360003e | |||
| 233cb49903 | |||
| 9cdf439db5 | |||
| 95360a17f2 | |||
| 9dfe50f1d9 | |||
| c07f24cd18 | |||
| 03c2b8656b | |||
| ea6e1b003c | |||
| c2b37e76b3 | |||
| d40b922c98 | |||
| 28e793496a | |||
| 33c8d6af1e | |||
| 49ae2a69f2 | |||
| 2ffb77586a | |||
| dad99afae8 | |||
| f93dffb5ee | |||
| 742117e7a3 | |||
| 15ceb35e05 | |||
| f0bad600e0 | |||
| a8aeba89ef | |||
| 7f593893e8 | |||
| 5d5b1d1f3c | |||
| bb6846468a | |||
| 960c82e396 | |||
| 5be33b82c7 | |||
| 4cd858f93d | |||
| 2098acee7d | |||
| 3157efa57c | |||
| 613e0bee5e | |||
| 78c9c71bdf | |||
| aa30b13b36 | |||
| 6ba542cd53 | |||
| 106f4c4e9d | |||
| f1523d2404 | |||
| 00f6271e3b | |||
| b0e49ef79e | |||
| 81d340e042 | |||
| 4e40169ed6 | |||
| 49f1c0e94d | |||
| dcfebc6eed | |||
| f9d113f764 | |||
| 3d2d9f8a9b | |||
| 07129c76d9 | |||
| 6fe03f3b39 | |||
| 41f3456a28 | |||
| 7a420d4bba | |||
| d2b9c90f28 | |||
| ce12ef7e5c | |||
| 8bca11a64e | |||
| 14e325e45d | |||
| f85906b679 | |||
| 1fc9345b45 | |||
| 0a5983dd5e | |||
| aec40d10b8 | |||
| 89ceb3e7ba | |||
| fc80e4b651 | |||
| 52ab095ccf | |||
| d5cca2bdb2 | |||
| ebbb4fd7fb | |||
| b717cc7830 | |||
| a476c83caf | |||
| 15c63688e3 | |||
| 69c62415c0 | |||
| 690b2aa761 | |||
| 69311fa4c9 | |||
| ab9be1b48a | |||
| 5a682bfc7b | |||
| 53ea8abea6 | |||
| 6445e4683f | |||
| 6d49ec25a9 | |||
| a3ec6ede76 | |||
| 6803ddb8e2 | |||
| 4ce3997ca4 | |||
| 93e78fcde1 | |||
| 6f4c585bd7 | |||
| 47ea60814b | |||
| 86223b6eca | |||
| d79147fe5d | |||
| ac68c90800 | |||
| 82194c01ca | |||
| 69bc477b43 | |||
| 3655d4e0f4 | |||
| bc929656fb | |||
| 4aba93c969 | |||
| 49d97d6051 | |||
| 484577670f | |||
| d64c4d64e6 | |||
| 846af371c0 | |||
| 38b4483f9d | |||
| bb2512641f | |||
| bd60ad98eb | |||
| 7826af38ac | |||
| 84d842ea5c | |||
| f6c2662632 | |||
| e2aecacaeb | |||
| 8cdf6a87ed | |||
| 181f7b97d6 | |||
| 3491372a1d | |||
| 03b0741994 | |||
| a87f0b158d | |||
| 5e01674b72 | |||
| b652a4ff14 | |||
| 7dc0fe66c7 | |||
| 1cdcd00cc0 | |||
| 9f4b5227fe | |||
| d464fe5003 | |||
| 6b839b2319 | |||
| 45bd372755 | |||
| f5ee7df7f3 | |||
| e82b8b7bf8 | |||
| 91368c117c | |||
| 87576b819e | |||
| 48c473a0c4 | |||
| 87d77c13f5 | |||
| 4188219620 | |||
| fa8668c77d | |||
| 47f5f887e8 | |||
| c143d87e7c | |||
| 2fcdd3f8eb | |||
| 8c0dc55af8 | |||
| 8c04379a4c | |||
| a5bfe548d7 | |||
| e77e6e9d12 | |||
| a2b87c033a | |||
| b3c5d94bd1 | |||
| d029549c2f | |||
| 6e13467ce8 | |||
| 508ac2030e | |||
| 4b81bce48d | |||
| 3486675e00 | |||
| 84aad39940 | |||
| c89ca5ebb8 | |||
| 1a4b86233f | |||
| 69a487c407 | |||
| f32c73ad1f | |||
| a343439973 | |||
| aeb86d953e | |||
| 49bba6c997 | |||
| 49b2e8c3a9 | |||
| 9c1220e14d | |||
| e2ac2a82a5 | |||
| bb6290a5d5 | |||
| 312411dea0 | |||
| 7277682cfb | |||
| 0f229bfbbf | |||
| 28b23b44ec | |||
| 8627157298 | |||
| b87268f130 | |||
| a395f8e2c8 | |||
| 3ce459f23a | |||
| e51923778f | |||
| 468578113a | |||
| 2c32154115 | |||
| 47d99457d9 | |||
| 88b756b39f | |||
| 462ff4cc84 | |||
| 18274e717a | |||
| 7870f74c21 | |||
| 8dee2e3984 | |||
| 8e86e64d78 | |||
| e79e972255 | |||
| 682a31f92b | |||
| 17974aa285 | |||
| 0a7fd86d59 | |||
| d95d46dee6 | |||
| 81c8352179 | |||
| 6d80c9505d | |||
| 1b0cf6a91b | |||
| 954ce5379c | |||
| 8b5c19218d | |||
| f6408c7b11 | |||
| 095aae5e2c | |||
| 26eb29547b | |||
| d3a02a297f | |||
| ab508e1e7f | |||
| 87d1bbe947 | |||
| 2e661e82d1 | |||
| 61c6832b48 | |||
| ed0038fdf2 | |||
| c181d89c9d | |||
| c91c9e2429 | |||
| 7add524041 | |||
| 72928f201c | |||
| 81a9210091 | |||
| e9877bc72a | |||
| ea632ab8a4 | |||
| d0501c69b0 | |||
| 3c03385e2e | |||
| 191ccbf660 | |||
| d983269908 | |||
| 2ceab2d270 | |||
| 8ce3664305 | |||
| ccd8485111 | |||
| 70caf4ed6d | |||
| b7c8bf7781 | |||
| 3d46f1b620 | |||
| 63c7ff341a | |||
| a8ab74a6dc | |||
| 7ab5353f80 | |||
| d7df30bdd8 | |||
| d317ee144b | |||
| 3cef380b20 | |||
| 707933aa8e | |||
| 068b16a352 | |||
| c7ab4cf616 | |||
| e3875ae8c5 | |||
| 226fcb4f2a | |||
| d22b72a7cc | |||
| 15dec83832 | |||
| 5acd802d2b | |||
| 9b15860ddb | |||
| 0dacc9a62a | |||
| 67606170e3 | |||
| cc1db2d117 | |||
| b3d4ab0cd8 | |||
| 5bf5a2cc6e | |||
| e15e6e761e | |||
| 1cc270f0cc | |||
| 55f3202650 | |||
| a8d508c567 | |||
| 7c85a1ff07 | |||
| dd6f5e4607 | |||
| ab1465d9d5 | |||
| 66c44b8568 | |||
| 6ee24fe1bc | |||
| 4398bae56a | |||
| 20f9128f73 | |||
| 6901752723 | |||
| 886355007c | |||
| f45549edbf | |||
| 5a4b9fd877 | |||
| f319c5fb26 | |||
| 4687f8790c | |||
| 30eaee30fa | |||
| 8df49ea955 | |||
| 7905431fe9 | |||
| 96d727177e | |||
| be86bd3c49 | |||
| 260dc6d741 | |||
| 3ba32e80af | |||
| ac5ec1a153 | |||
| 34be5acc99 | |||
| 4713502083 | |||
| 2f6afb52a9 | |||
| 20597b6d36 | |||
| 0301d8a89b | |||
| 736ea1f5c7 | |||
| ffb55e51f1 | |||
| 6d9109bf70 | |||
| 4c6d524c47 | |||
| 3c67d9b1c0 | |||
| 8020374d6b | |||
| db64bd42d3 | |||
| 724c90f369 | |||
| c0a6439a69 | |||
| 10c2b7ee1c | |||
| f34623fb03 | |||
| c8f4d72302 | |||
| 7771c215e4 | |||
| ff5d1914ab | |||
| e7e999414c | |||
| 36efc33650 | |||
| 364c47610f | |||
| 59464f3528 | |||
| 7d9a49efab | |||
| e24b4a1e19 | |||
| f7abda1437 | |||
| ff57c0278f | |||
| 2742ded32f | |||
| 70e5746896 | |||
| fc8fb41451 | |||
| dc86e35cac | |||
| 2124b9b4c9 | |||
| dbba0ca517 | |||
| afad939173 | |||
| 3e4e10ffb6 | |||
| c60bccaa94 | |||
| 59756aef14 | |||
| 874797f36f | |||
| b545f62aeb | |||
| ca71eb7eef | |||
| ccf28775b8 | |||
| 2532e625ed | |||
| 111045ecad | |||
| 282f907f1b | |||
| 541185ef14 | |||
| d82e91898d | |||
| 00f5c92149 | |||
| 9174b18f34 | |||
| b9c78c3fcc | |||
| 021f228f9d | |||
| 40b8490fa4 | |||
| 7247e4cf1b | |||
| b49bc17f48 | |||
| 7ed26ead9b | |||
| 20d3882469 | |||
| fd1cff7735 | |||
| 943fbb2bea | |||
| 28c8e29c4d | |||
| b493229a23 | |||
| 83e502b847 | |||
| 93d0e5d9fb | |||
| 5e519cdbb5 | |||
| b96fa664b0 | |||
| 4327f36940 | |||
| b97ebf2aeb | |||
| e9de5a7a5c | |||
| bb98fd78c3 | |||
| d2f34a8455 | |||
| 26e6e75ba6 | |||
| 03244b52a0 | |||
| d15e56dab0 | |||
| ff16331754 | |||
| d8a5163b24 | |||
| ed8491cde6 | |||
| 7e6355975e | |||
| 716102fff3 | |||
| ef6805f599 | |||
| d6b898685f | |||
| 0b2d54f4f1 | |||
| d4cbe6271c | |||
| f92867a59e | |||
| d062528653 | |||
| b63f1912df | |||
| 18248cfd00 | |||
| 0f89a91607 | |||
| bb0aec1d94 | |||
| 10e9f193ca | |||
| 38fdca82c6 | |||
| 49301ed785 | |||
| 212d12f269 | |||
| a562a9aa93 | |||
| f08d9b288d | |||
| dc15c2838f | |||
| 0bd3a67dea | |||
| 572958ece3 | |||
| fa90bcb9ab | |||
| 5974d53ab0 | |||
| 66349bcef1 | |||
| 9f1167f7c9 | |||
| 089bb6acad | |||
| 06e09fc7a9 | |||
| 2fe78a0c7c | |||
| de17f63b45 | |||
| fee3c1c242 | |||
| 74f564b0bb | |||
| acef52c35e | |||
| 5cc595cb2a | |||
| ef8621cb61 | |||
| e8299a89da | |||
| 19fa77ddbb | |||
| adf358363c | |||
| 64e9f278b3 | |||
| 9cde967321 | |||
| 87809742f5 | |||
| fcde80a4d0 | |||
| 868ba8464e | |||
| 429f6defdd | |||
| 7f0e1fc90b | |||
| 6df6bd4ac7 | |||
| f0b8c9ec06 | |||
| 815e0c400a | |||
| 4c1667a5f6 | |||
| f507ff4842 | |||
| 29ecc3840a | |||
| 8bc9a79e65 | |||
| 6a22fa7f47 | |||
| 854c61c3ab | |||
| 85b4ed623e | |||
| fc5a9c2be2 | |||
| cc6d17423b | |||
| 4bdb1eb5aa | |||
| d2f2f9db51 | |||
| cc52fa66e8 | |||
| 184ad732df | |||
| 69619aeeb1 | |||
| 6d9ac89f92 | |||
| 5b30f789e5 | |||
| c18a8c53e8 | |||
| ec1ef925a9 | |||
| 6c5ee8f79e | |||
| e18aa4d893 | |||
| 6af555b394 | |||
| 81de1f159c | |||
| 9c4c82ed1c | |||
| 7192429e83 | |||
| 994da0fd73 | |||
| bf431e77b8 | |||
| 543a9f84d1 | |||
| 56de911b7a | |||
| 0893ee492c | |||
| 694089fafe | |||
| fb9e92e828 | |||
| f7a0f11c36 | |||
| 0011652a28 | |||
| 72d57ad094 | |||
| 8267993988 | |||
| ef644120e4 | |||
| cf6ae0de6a | |||
| 2456d3abc0 | |||
| 1ca4fdc4c7 | |||
| d908a73b04 | |||
| 6e5c861fff | |||
| e6033e00fe | |||
| 52318b3359 | |||
| a030446a94 | |||
| bc22991ac3 | |||
| ea1911d23f | |||
| 54f2ed6afd | |||
| 6973539005 | |||
| 3c67872805 | |||
| a53f28275e | |||
| ef95a9fa93 | |||
| 25b5b79cc3 | |||
| 49653b81ea | |||
| 5eb08a0d1a | |||
| df437eebcc | |||
| 75e96c6927 | |||
| 1680f2c95e | |||
| 17ec885270 | |||
| f4b528e07a | |||
| 190649e591 | |||
| ec957ec5ee | |||
| ff15a586a0 | |||
| f9bd414350 | |||
| a89d15cdde | |||
| 1d1c81258e | |||
| ce553fa834 | |||
| b3e6a993a9 | |||
| 375c1ebc41 | |||
| 6cf99d12ac | |||
| 56f9106d94 | |||
| 8bcf44669c | |||
| d81e4d71c1 | |||
| a2df247063 | |||
| 8596edba09 | |||
| 1bb1df19d8 | |||
| 125c660974 | |||
| 351c9c80e7 | |||
| 57a56ddaa2 | |||
| 79e73dd86a | |||
| 3241a7e5a8 | |||
| bd87799673 | |||
| 9de7130a9a | |||
| 74310f41d7 | |||
| a367373fe3 | |||
| 04baaab311 | |||
| c9f156ef0c | |||
| 455930fbc4 | |||
| db43738397 | |||
| 079aff1779 | |||
| 29133b2fe2 | |||
| 37c8cbe76b | |||
| ac917983c5 | |||
| 1259564c01 | |||
| edbc6d8ab5 | |||
| c268e36e44 | |||
| 067c11f65d | |||
| b5946822af | |||
| cc54257de5 | |||
| a72917541f | |||
| e50344b5da | |||
| 1a0c799898 | |||
| ac213907d7 | |||
| 7750c61e29 | |||
| 8ff001ef30 | |||
| 962776fe25 | |||
| 0f64cb421e | |||
| 45aa5081e4 | |||
| c10e191ac7 | |||
| ea2424d36d | |||
| 1cc0180a81 | |||
| b5bb981959 | |||
| ee86721ef9 | |||
| 4841754aba | |||
| 2166cc2e80 | |||
| bf0b591b2f | |||
| 5812d05b71 | |||
| 7a06e49008 | |||
| 8cbee9695b | |||
| 7e03f47370 | |||
| ad6c58972c | |||
| ad7f9b3542 | |||
| e4d078b520 | |||
| 1dc0da8218 | |||
| a9e27933a9 | |||
| fdc0219db5 | |||
| ecdc6c6507 | |||
| f68212cc7a | |||
| e23840a3fc | |||
| 34f68d0104 | |||
| 23cb78a0ff | |||
| 552bd9daff | |||
| 799ad0e1c7 | |||
| 8710a22c31 | |||
| db0a4d9045 | |||
| 9c99451607 | |||
| 4b14c4633a | |||
| 39a0a25f20 | |||
| 85e34f1ca4 | |||
| b4262972dc | |||
| 06bd4ffdaf | |||
| 4eb8fca140 | |||
| fa85f91e0e | |||
| 9540a8309c | |||
| 11184e9186 | |||
| 2f0bf1e110 | |||
| 41c43234a7 | |||
| 1aacde20fa | |||
| 941b99955a | |||
| 0701cc493c | |||
| 7047c52d7b | |||
| fddefeb7ee | |||
| 347729a7c0 | |||
| 7957f75bd8 | |||
| 4877dbf2a9 | |||
| 4c91adc4b2 | |||
| b654683545 | |||
| 20d01f118d | |||
| e5d767b149 | |||
| e5f7b1d262 | |||
| d29178a9cd | |||
| bc4799361e | |||
| 14870a290d | |||
| 84db8edade | |||
| 3827c4deb2 | |||
| b7af9c47b3 | |||
| b0507e7678 | |||
| dc474b625b | |||
| ac29638a8a | |||
| bdacdfaea9 | |||
| 682406a384 | |||
| 67ea80b2bd | |||
| 265034134a | |||
| 6377c9bce5 | |||
| d128e2d09e | |||
| 9f3b6ebbde | |||
| 7594983671 | |||
| cdd36c979d | |||
| c310c8dc24 | |||
| 20ceee794b | |||
| a7ae0d5b9e | |||
| 529a336966 | |||
| 78e54904b5 | |||
| 8fe6a1904c | |||
| 7ce5d33947 | |||
| 20aab8a10b | |||
| 7f6e8e8ddc | |||
| 7624e23426 | |||
| 3e9b501ff8 | |||
| f7616c4287 | |||
| b68818a8a0 | |||
| e348326fa7 | |||
| 97c62408fb | |||
| fb103c1319 | |||
| b7a8d538c1 | |||
| ff1ac49a72 | |||
| 5f929d6940 | |||
| ffaa2968ed | |||
| 028ab5a143 | |||
| ea14df2e3a | |||
| 0cdc984b1c | |||
| c613813364 | |||
| 1d8456fe7d | |||
| 1f5a7f2f49 | |||
| 08eafe21d3 | |||
| 264239f78f | |||
| d4e9de84c5 | |||
| edd412966e | |||
| 4695542f37 | |||
| fab062f7b5 | |||
| de176d37e0 | |||
| 882bc80dd0 | |||
| 3d2781311e | |||
| 63496a6730 | |||
| b4bf7a2282 | |||
| ec6c8b2a3c | |||
| 47cdda370e | |||
| 306f02117b | |||
| a406a35cf8 | |||
| 855d996847 | |||
| c33100c4f0 | |||
| 97433c0263 | |||
| 8df2763b56 | |||
| 42c7f2d6b0 | |||
| 732ef6b10e | |||
| cdb35a12fc | |||
| 482d0626b8 | |||
| 16745261e3 | |||
| 9ddde3be39 | |||
| 40e8a90e89 | |||
| 4621907fca | |||
| a5d140ae42 | |||
| e55f881bc2 | |||
| d8f1099419 | |||
| ccf7a8248f | |||
| a1886942eb | |||
| c5d500d51e | |||
| 39855a3304 | |||
| 704c40bfa2 | |||
| bbfd64d01b | |||
| e48207cdb3 | |||
| acbea6affe | |||
| f6d3d675ab | |||
| e2f54ff594 | |||
| ae530d89c4 | |||
| 19e4f56c67 | |||
| 2de757eef0 | |||
| 198683e914 | |||
| 5cd6ed4511 | |||
| d4be545d54 | |||
| feaf80d899 | |||
| 60cc46a92c | |||
| 184aeb0694 | |||
| 0d661bcca6 | |||
| 9bf193b49a | |||
| 5c381032b0 | |||
| b5fa2dadfc | |||
| a365f9a67d | |||
| 84d9296c05 | |||
| 9f6ba4bfa1 | |||
| 5ce1bec1bc | |||
| eb2f34719d | |||
| 27e8ea4ea2 | |||
| 3c1a2612e7 | |||
| 07856a7e8f | |||
| 4f0f712b51 | |||
| 549317a36b | |||
| a4f2e1276c | |||
| 5dda4f5da3 | |||
| 046b116c18 | |||
| 7f044341f9 | |||
| 8db7dfb5c4 | |||
| f252ab0770 | |||
| 15701a32f5 | |||
| 683baec4f0 | |||
| 01ce5824f0 | |||
| 1fb4e73981 | |||
| 21c0c78d2e | |||
| e61095426b | |||
| 77f00d5006 | |||
| c7c344dbc2 | |||
| c20dda4f4c | |||
| 0bedd900b9 | |||
| ca2d47c20f | |||
| 47add060cc | |||
| 2f7175442f | |||
| 88cd1d6593 | |||
| cc636f334f | |||
| d45c94fe1c | |||
| 099a4f3969 | |||
| 62499c6250 | |||
| f312638ecd | |||
| 2f9b1fdb0c | |||
| b3b55132a9 | |||
| 2256bb07b0 | |||
| 30f3787248 | |||
| 2764fdf9f0 | |||
| 0eb9355acd | |||
| 743d480fba | |||
| a57b6f8ed0 | |||
| d380c7d26f | |||
| 57a0132b41 | |||
| f4117d81d2 | |||
| 3daa53ce63 | |||
| a016d1d0ff | |||
| 6de1c64a9c | |||
| 992ba476a9 | |||
| 7cc8c7d2ff | |||
| 52a0ad4108 | |||
| 77368ce762 | |||
| 0734d9f314 | |||
| e790fb5128 | |||
| 7fcda585bc | |||
| 76355dee68 | |||
| 28bbd3e7d9 | |||
| 57d7fe94a9 | |||
| 6f1c08f7d8 | |||
| dcc2d44d93 | |||
| 2f74a97d04 | |||
| 6620b1cdcb | |||
| f7c9f1f796 | |||
| 76f1aa7de5 | |||
| fcd3f8450d | |||
| 34cdff5ee4 | |||
| 5890c7d516 | |||
| 2fa4a55e80 | |||
| 5489fae8f2 | |||
| 895ab2342e | |||
| 1e82b1958b | |||
| be76cec342 | |||
| ad4bdda074 | |||
| f5542b9927 | |||
| d4af765651 | |||
| 5a0204bb45 | |||
| 915bb4e206 | |||
| 07c6b7f0ab | |||
| 231a1d68b0 | |||
| 6bbdb97e75 | |||
| b98bf36a15 | |||
| 9383e9d469 | |||
| 13c3802073 | |||
| 04b098d000 | |||
| 8c90b5fc6a | |||
| ec3aeede20 | |||
| 08d4e7c0c4 | |||
| fab781cf8b | |||
| 896f3fe703 | |||
| 1c1ebb1833 | |||
| 080f7baeaf | |||
| 3f70e3a81f | |||
| 9d9cb0ab6a | |||
| a1a838d966 | |||
| 6b157397ba | |||
| e28451585d | |||
| b156aa2cf6 | |||
| 715afd6fdb | |||
| 801343b56b | |||
| 311d867deb | |||
| d47bd0a2cd | |||
| 9d08025b8b | |||
| 8f04d6561f | |||
| 17c53040ab | |||
| bb7eccc9c4 | |||
| 19e2cc187b | |||
| c3b16c26a6 | |||
| 968547d79b | |||
| 6c4278144a | |||
| 6cfcff6f10 | |||
| be8bb2be61 | |||
| 489f655d18 | |||
| 2df419e324 | |||
| 74e7c4aa0b | |||
| 148fffa21a | |||
| 66211394e1 | |||
| aea5880c10 | |||
| 5cd52d2d69 | |||
| e8de7c6819 | |||
| fe6cf851bf | |||
| 1a4ea94bc7 | |||
| d48a2190bf | |||
| 49967097ed | |||
| 49896abe2b | |||
| b2c3d88fbf | |||
| 55ef4e4bdd | |||
| 28d1f6cdc4 | |||
| 0ce1878aba | |||
| d9614549bb | |||
| aa97b8a4fe | |||
| 7993b87235 | |||
| c1cd2007b8 | |||
| 7178a5e7d3 | |||
| 4aabf91ee2 | |||
| cd96998372 | |||
| b9350f908f | |||
| 2d09fd2135 | |||
| 6375639917 | |||
| e1e96c0cf4 | |||
| a4870a579f | |||
| 3110d84ed8 | |||
| e3f7429173 | |||
| ee0806ad4b | |||
| 17623fd0d3 | |||
| ce89974679 | |||
| 13f58f9bc2 | |||
| c9c27e9d69 | |||
| e7b49e3f09 | |||
| 6ad2442fb9 | |||
| 71242c0f2e | |||
| be78b5d8f7 | |||
| 14d5a86b29 | |||
| e312842a18 | |||
| 246179518d | |||
| 07b2d33347 | |||
| 3ad58f4dae | |||
| ef46fb4840 | |||
| 2aa22206be | |||
| 8e7a3a4df1 | |||
| a86f8f26a2 | |||
| 90bffaa2a6 | |||
| 4c8e6daab7 | |||
| a84ab12735 | |||
| def7925873 | |||
| 55ac140c25 | |||
| 392f8f840d | |||
| f563cc227b | |||
| fd4db7e6dd | |||
| 2e172fd932 | |||
| c138b9ea30 | |||
| 3256fae147 | |||
| 4c001673b6 | |||
| 183fb961b3 | |||
| 942c076938 | |||
| 8157672a29 | |||
| b836fd05dd | |||
| 507dbf984e | |||
| 1961059330 | |||
| b5662c87c8 | |||
| 3fbd5f0029 | |||
| f263088b0d | |||
| b5e2d208b9 | |||
| fe8428b33b | |||
| 1b9801a04b | |||
| feecb3321a | |||
| 6f61b35bcf | |||
| 734a7f52a7 | |||
| b5299b1c58 | |||
| d2d201cc82 | |||
| aaa509dd07 | |||
| 74395d7577 | |||
| 05a873c25c | |||
| 279c21b816 | |||
| 2c86895468 | |||
| 8d70a9b1b5 | |||
| 83dab1ee0d | |||
| 5345731b1d | |||
| caba5fef27 | |||
| 277c91e94c | |||
| b55e72b2d6 | |||
| 5b1f25a4e0 | |||
| 13eaff4f9f | |||
| bc27273087 | |||
| e76c5aad36 | |||
| 414ab682f3 | |||
| cf5f290fa0 | |||
| 0286a7f709 | |||
| 99715a2e62 | |||
| c1a0a99309 | |||
| 0923ff6313 | |||
| 61763129db | |||
| 9832e91304 | |||
| 06c7ff0666 | |||
| fa8515bc2c | |||
| 8fa9a7b965 | |||
| 59844ddde0 | |||
| 0c5ebd75a3 | |||
| af6724c2f6 | |||
| d986b9ff7b | |||
| 603005ba65 | |||
| 8ed15fd92e | |||
| 9f6328d499 | |||
| e2ab8cca82 | |||
| 7af0ee099d | |||
| 8a3457c330 | |||
| dfb297e3c4 | |||
| f113fa2a4f | |||
| ad0b546088 | |||
| 285ce9d8aa | |||
| 472dba19ea | |||
| 0376383354 | |||
| 70b53f91c2 | |||
| 450684ab33 | |||
| ce7fd7e1a3 | |||
| 469dbeb42e | |||
| 9f18aced9f | |||
| 496a2c3264 | |||
| 1cd0ff0d42 | |||
| c181d1e7fa | |||
| 1868fd453d | |||
| 438638b42e | |||
| 7e42b6ad3f | |||
| b377b7d580 | |||
| 98fc887cb3 | |||
| b8a87bd111 | |||
| 2e73fe5ea1 | |||
| eceaa80de7 | |||
| 97672b22e6 | |||
| 6e2edd8ed2 | |||
| 2ba8399ac8 | |||
| 3dc8d9d7b3 | |||
| 151d0c14ed | |||
| 334afb167c | |||
| 96ce4563bd | |||
| 0e2e8b79d3 | |||
| dc11e7f027 | |||
| d599e35aa4 | |||
| eb86340139 | |||
| 1e9cb74cc6 | |||
| f6c41c1862 | |||
| d5695a84df | |||
| a4243360a2 | |||
| 07308a2fc9 | |||
| c883f4e332 | |||
| d1817e7791 | |||
| 3bacc302a3 | |||
| eea42e06af | |||
| 3d3a6da2ca | |||
| 5116789aa0 | |||
| 96ac49b75b | |||
| c31e1ea798 | |||
| 28405d26b0 | |||
| 8175d92b4b | |||
| 5900b29fb4 | |||
| 7dae0ec74c | |||
| 44381f0a0c | |||
| 428e34abba | |||
| 5091d047c0 | |||
| a8001d693a | |||
| effae4ae55 | |||
| ff43b2b97c | |||
| 2ebc6d5b6f | |||
| cd8fc9bcb8 | |||
| 3ac98009d3 | |||
| 34741d513f | |||
| 7f80a5f73c | |||
| 27e3d92a30 | |||
| 04a422e499 | |||
| a70107d725 | |||
| fa798f17ff | |||
| 8c6cd2da76 | |||
| fda5c0c073 | |||
| fe9a58c193 | |||
| 2f0a95768b | |||
| b58f769c96 | |||
| 1467c14adc | |||
| 42fb251d0a | |||
| 3103da8570 | |||
| 778310260c | |||
| 381a6ddddb | |||
| 87cc58ba3d | |||
| 2d520eaf6f | |||
| 5779464ec3 | |||
| 866a9e6481 | |||
| a57a9bce79 | |||
| e968bdf629 | |||
| e86aa61f20 | |||
| 5166e316ef | |||
| d2dd2d0e48 | |||
| 477be45244 | |||
| d74355061b | |||
| 87d1b2a910 | |||
| 949f6f5324 | |||
| fe8b463c4e | |||
| f99e9963b2 | |||
| 277be410f3 | |||
| 6f67fddb87 | |||
| c980fe2792 | |||
| 7675fcb5d3 | |||
| cf4cddf7a1 | |||
| 8ab846b5b9 | |||
| 7e229c470a | |||
| 317fba47a6 | |||
| 9873d5e0b9 | |||
| 94a1f488a6 | |||
| 2a410c0e1b | |||
| 0b5e155016 | |||
| 626c21466f | |||
| cdf5e3963d | |||
| 7172231b8f | |||
| 47ac318920 | |||
| 9d2272ec2c | |||
| e38ba3d58c | |||
| 1b7516a4ae | |||
| 8cb37804c1 | |||
| d5939879cc | |||
| b22bde6596 | |||
| 2add864164 | |||
| 5eef75b678 | |||
| d605b72c1d | |||
| 9af3b7c625 | |||
| 31492a177c | |||
| d9a656756b | |||
| 8e10a026e6 | |||
| d7f9d71ea5 | |||
| acad9567c1 | |||
| 9093f3403f | |||
| df293c7be1 | |||
| 380805ece2 | |||
| 38624074e9 | |||
| 7b260d9c2d | |||
| fd89948164 | |||
| 4861be1171 | |||
| 109d926e9c | |||
| c96b517ea2 | |||
| c417c16788 | |||
| a7be9f1cab | |||
| e8a84d663f | |||
| b4cdced22f | |||
| a9fd2e6464 | |||
| 9741df100b | |||
| 6b1cc6e2fe | |||
| c902e30494 | |||
| 1556371370 | |||
| bde2f35a9f | |||
| 54712c0624 | |||
| 16e4657acd | |||
| 66909dfe86 | |||
| c5f0a0256b | |||
| e4249b1b9e | |||
| 8c0d9ba1a3 | |||
| 5420895bcb | |||
| 80f78ca196 | |||
| bc7c5d376a | |||
| 23fc3339ee | |||
| 59a76d48f8 | |||
| 3b77b5fd39 | |||
| 56929362f5 | |||
| 0ad5ba7a0f | |||
| eab07daf92 | |||
| d9c5303793 | |||
| 9add4a66c0 | |||
| 4085709ae1 | |||
| 469c6261c6 | |||
| f7d59dfe23 | |||
| c8a7d0ab95 | |||
| 0484bf133b | |||
| 0a79486380 | |||
| fd4e37404b | |||
| 32c2aa10c7 | |||
| 519f396365 | |||
| df1f1002d9 | |||
| 280a83f029 | |||
| f9bf2d9d8e | |||
| 8294ce9fd4 | |||
| 991bdd4ed7 | |||
| f4f3ced955 | |||
| 2bb30481b6 | |||
| 93b3b83cc4 | |||
| d915261590 | |||
| 8c29b5998f | |||
| 0d54dbb264 | |||
| 38a10e8a98 | |||
| 7e3a8b7a75 | |||
| 8f19d516f9 | |||
| 97c9e6b000 | |||
| cf69724083 | |||
| ff5ec824fd | |||
| 0ad1cacff3 | |||
| 0d452073f4 | |||
| 40030a5dbc | |||
| a215292b6a | |||
| 1b9f949f36 | |||
| 5f9034e428 | |||
| 4f4e240024 | |||
| cf7a2292f3 | |||
| c9a3867ff2 | |||
| bc3176da63 | |||
| dc03bea854 | |||
| 051cb9ca37 | |||
| 5727d3a30c | |||
| ad8473bd66 | |||
| 23783a4430 | |||
| 9bc7edd673 | |||
| 28c510cf41 | |||
| 014f928229 | |||
| 84779f0170 | |||
| a5b005b57c | |||
| 45c99155d8 | |||
| 75df13a973 | |||
| f268ecaf0d | |||
| a4124a3113 | |||
| e59a80c787 | |||
| d4c9eff67b | |||
| 63d8b5e1e3 | |||
| 6724416d5c | |||
| dc21024ec7 | |||
| ace0c76a69 | |||
| 46c972f746 | |||
| f71270df77 | |||
| 1fd08aee15 | |||
| 6b92acf361 | |||
| 8ea45b862a | |||
| cb3ee2d050 | |||
| af9637e545 | |||
| 36f1c26d9d | |||
| 11e09dc5db | |||
| ec03e3f54a | |||
| 567075aab9 | |||
| 5af8a9777b | |||
| bd2c93c2df | |||
| 7c6d6effae | |||
| a932b8c96a | |||
| 0f516bbe1d | |||
| 28de6b0da1 | |||
| 7583539029 | |||
| f94551ad40 | |||
| a76da32567 | |||
| f13c5969eb | |||
| c43ff6fa40 | |||
| 77996e6adc | |||
| 4d9d6faf0d | |||
| c53b7cedcc | |||
| 791391cf5b | |||
| 81828f8b08 | |||
| b630bf59ef | |||
| eeb7d3a04f | |||
| faec8331b7 | |||
| 1685c459dd | |||
| e514264b53 | |||
| 0fba500826 | |||
| 4296c77e29 | |||
| 4124047cce | |||
| d895c5fe5a | |||
| c1901539a8 | |||
| 030dd6655e | |||
| 9e378b451f | |||
| ab5ffb308b | |||
| 6084048b28 | |||
| 27109d1ae0 | |||
| 9bd692bc67 | |||
| 1a98b94100 | |||
| e2e312dbfc | |||
| db3e6f6ac6 | |||
| ee955b58f7 | |||
| b8d8f8fdae | |||
| 3b9b326d3c | |||
| 313059d08c | |||
| 38f1da6f26 | |||
| 04999e969f | |||
| 7cfa4d6011 | |||
| a9e94d43b3 | |||
| ffb700dea0 | |||
| a7ae278d1a | |||
| 2e160f53db | |||
| f8f75fc9c6 | |||
| 4b83fe8b04 | |||
| 05493e651d | |||
| 64b3d452ec | |||
| 5e69760d91 | |||
| 82831c6acd | |||
| 97e999c409 | |||
| 2847692d59 | |||
| dc1905e1bd | |||
| 913a148ddc | |||
| d47d561da3 | |||
| 81ea89f10e | |||
| c75402a57b | |||
| 3b061a90fe | |||
| 92f00d3e58 | |||
| 366617dbc1 | |||
| c1e6f324c2 | |||
| 4677918676 | |||
| 05056ddac4 | |||
| 729931a06c | |||
| 53f93158a2 | |||
| 03fce2e206 | |||
| 855f2cdeea | |||
| 2b81ea7ec1 | |||
| a1e1af44d2 | |||
| 4b82fdb637 | |||
| ffc915fdee | |||
| 1727f0b7ff | |||
| 6c5cb109ee | |||
| a97a455c03 | |||
| 902b2ce3c6 | |||
| 534b578da7 | |||
| 8ad777c702 | |||
| 459c439243 | |||
| 879f1586ab | |||
| 779251de64 | |||
| 0bdb185a6f | |||
| 4261ba9443 | |||
| c33ab7c0bb | |||
| d1e1bb0d5b | |||
| ecfca8def7 | |||
| f455cb6c40 | |||
| 56e0e1934d | |||
| c6f30e8f17 | |||
| 240bbc39e1 | |||
| 43a26aa958 | |||
| 48903850e9 | |||
| 5f4eb87735 | |||
| 8513abd404 | |||
| 85a2dfc841 | |||
| 38f8edbdd7 | |||
| c02e63eb77 | |||
| fccec8964a | |||
| e941cf06a3 | |||
| f6e4145ad9 | |||
| b7f85b9df9 | |||
| 5d30309e98 | |||
| eca20a16bd | |||
| 3b46831da8 | |||
| 24525fd1ae | |||
| 5d6c1794ad | |||
| 70e754e6da | |||
| a642f73b44 | |||
| 3db5d7fe3d | |||
| 97600ded8d | |||
| 8b8bf9f3f6 | |||
| 05e7544583 | |||
| e60891e453 | |||
| 3e8b19b00e | |||
| aafaf79fdd | |||
| 8170f6899c | |||
| 8e637bdd83 | |||
| a6eb01837b | |||
| 67fc3428cb | |||
| 9c79c28604 | |||
| 6fb5979d29 | |||
| ef5dd5d31d | |||
| 1cdb3ec93c | |||
| ed70e81264 | |||
| 6c9c189e4b | |||
| 4f71e9eebe | |||
| 89d2926415 | |||
| bd7328f5e6 | |||
| e41f15747e | |||
| ace0d3949b | |||
| d2a2af2481 | |||
| b7bc03aa18 | |||
| 8d37a3575b | |||
| a14ae80102 | |||
| a46da9e44d | |||
| 132c04bcc8 | |||
| 4572d42d07 | |||
| 1f3ece9631 | |||
| eecac4f18b | |||
| 6558d51b50 | |||
| 647569bfe8 | |||
| ed0a5f9e16 | |||
| c5c39f585b | |||
| aa41a5c9af | |||
| eeb95e058a | |||
| d5c8868346 | |||
| b6e9fab649 | |||
| cec92673ae | |||
| 912d23634d | |||
| 237a57bbe8 | |||
| 0d61bcd823 | |||
| 0c91da257b | |||
| 223defd62a | |||
| 3734c53eb8 | |||
| bc18060149 | |||
| 8a9f984eb8 | |||
| 80c789b394 | |||
| 283530b19b | |||
| 4bc48d0b76 | |||
| 83071843da | |||
| f5fb1307b0 | |||
| 9b604abc83 | |||
| 304b52fabe | |||
| 7aff5507dd | |||
| 2f14254142 | |||
| 752edf413f | |||
| 6af0effda1 | |||
| 936f72fdd2 | |||
| 31bfc55866 | |||
| fa45cc4272 | |||
| d67d2ae8e8 | |||
| 79c3335e8d | |||
| 8808219e6d | |||
| 5f664fb6f8 | |||
| 7f1f499b22 | |||
| 780342eddb | |||
| 138845a519 | |||
| fd37bc53de | |||
| edf4b33c61 | |||
| d8eff635fd | |||
| a2616db4dc | |||
| b145ed9de5 | |||
| 2c2584138a | |||
| e28ebed661 | |||
| fa317fabbd | |||
| 4cce39cab7 | |||
| 4601ac7f13 | |||
| 1e2983bd04 | |||
| f2719e903a | |||
| 2e99f34fe3 | |||
| 0d94a2e3a9 | |||
| 9a4f3029d9 | |||
| ecc6eb81b5 | |||
| 1975dedb21 | |||
| f405d35dac | |||
| 35943e7beb | |||
| c778c234b0 | |||
| e2604c1550 | |||
| 31cc8573f0 | |||
| 0ccb058b90 | |||
| 2b1c4e9acd | |||
| 82b04f927e | |||
| a5bda13fb7 | |||
| 181d14668a | |||
| 187b4c819f | |||
| a277a6e47d | |||
| 0692f7916c | |||
| e86e360b36 | |||
| f5d5caaf82 | |||
| 8c8e6e25ad | |||
| 35319bed01 | |||
| f83112cea2 | |||
| 335602e85c | |||
| a7871ce77e | |||
| 95a92d35c8 | |||
| 2a94bf8fbd | |||
| 1a8f6e70b5 | |||
| eeb78a7259 | |||
| 9bd17226d5 | |||
| 0615970877 | |||
| b7ff23d235 | |||
| 4bf6b8c136 | |||
| 8cc2ad3348 | |||
| e4992cdd03 | |||
| 5969ed1afb | |||
| b15293e709 | |||
| 828a998941 | |||
| b57f61ac95 | |||
| 6f779ceac2 | |||
| 270131253f | |||
| 2b0135e869 | |||
| 1fb635ac03 | |||
| 302ad847a3 | |||
| c078758644 | |||
| 8fa3995a1a | |||
| e5799b5d40 | |||
| 8f6f36f654 | |||
| 58d525c9fa | |||
| 4d85019e4c | |||
| 4720648137 | |||
| 163a6d01e0 | |||
| 0c5f26e0ff | |||
| 9ca9af60f2 | |||
| 9f4147f28e | |||
| cc7f9190ba | |||
| e9f3902ab5 | |||
| 7cf1bc39a7 | |||
| 5ab8ca41a5 | |||
| 0debf154ee | |||
| 49cb149033 | |||
| 9985d0aaca | |||
| 0e6a93a9ca | |||
| 0e704d195f | |||
| a025cd2268 | |||
| cdb458ed4e | |||
| b212050026 | |||
| 88c3595db3 | |||
| ff765c814d | |||
| 73bb144ef0 | |||
| 2f9ebc6f32 | |||
| 125c3bef19 | |||
| 6907e97fa1 | |||
| 4a8b88f775 | |||
| 05f65d2d42 | |||
| 916045921e | |||
| 2f6baf60e9 | |||
| 2ae727ac3a | |||
| 8ee516436b | |||
| ef3b539125 | |||
| bcb8e297fc | |||
| 77c42988c8 | |||
| 79a7f18150 | |||
| 4e45e320b0 | |||
| 3760f58d53 | |||
| cdfeb53887 | |||
| 4e3e4260c3 | |||
| d53eb8a377 | |||
| 164985881b | |||
| 6b8d3c7070 | |||
| 7a62efae63 | |||
| 30c880bea9 | |||
| ea6aab20e8 | |||
| 6ad89d30d2 | |||
| e74a8a7360 | |||
| 4a1d29cbb8 | |||
| ec41262e22 | |||
| 716a99b069 | |||
| d328808892 | |||
| d8527d17ea | |||
| d557f97732 | |||
| 3f3e4754d9 | |||
| dac0f3f5e8 | |||
| c2fa935fee | |||
| 0ebbc491a1 | |||
| 4d8ff2fba4 | |||
| f639da0f1c | |||
| 79fd986bcb | |||
| 7f1984a01e | |||
| befdf59e61 | |||
| 00545fc51d | |||
| 6626fbc500 | |||
| 6da10f643a | |||
| 9b9c41d699 | |||
| 57e617620a | |||
| 0c9c3f08ee | |||
| 9c252410cf | |||
| 7b0ebed033 | |||
| 4776ac50ed | |||
| 88ac7549c0 | |||
| d0b30f4ce2 | |||
| b433001a1b | |||
| b351bdb8d5 | |||
| d529501cbf | |||
| 16f86f8ede | |||
| e3beef065c | |||
| f89fe04d54 | |||
| 292bffb32e | |||
| ec1688807e | |||
| 6cec0c9f62 | |||
| 2595d5f6c8 | |||
| f65b35dc9f | |||
| 6865826aff | |||
| 64c2ea3f02 | |||
| 5adef8ba44 | |||
| 271a91c648 | |||
| 293a7b2a6e | |||
| 623e15936a | |||
| f882b6908e | |||
| d26f03b446 | |||
| dd1c100b84 | |||
| ed41bbb199 | |||
| 50a223f21f | |||
| 5e0caefa58 | |||
| abc6c990a6 | |||
| 73feef9766 | |||
| 9b7e9addcd | |||
| c274e1ae5a | |||
| 55cb625808 | |||
| 465fdde52d | |||
| b6850f88a1 | |||
| 05b4eaac4b | |||
| bccf9e4a3f | |||
| 1d1b47044c | |||
| 2af92d0ebc |
@@ -0,0 +1,106 @@
|
|||||||
|
name: Build & Test
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Ubuntu-1604:
|
||||||
|
runs-on: ubuntu-16.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: apt
|
||||||
|
run: sudo apt install ruby gperf
|
||||||
|
- name: build and test
|
||||||
|
run: rake -m -j4 all test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: travis_config.rb
|
||||||
|
|
||||||
|
Ubuntu-1804-gcc:
|
||||||
|
runs-on: ubuntu-18.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: apt
|
||||||
|
run: sudo apt install ruby gperf gcc g++
|
||||||
|
- name: build and test
|
||||||
|
run: rake -m -j4 all test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: travis_config.rb
|
||||||
|
CC: gcc
|
||||||
|
CXX: g++
|
||||||
|
|
||||||
|
Ubuntu-1804-clang:
|
||||||
|
runs-on: ubuntu-18.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: apt
|
||||||
|
run: sudo apt install ruby gperf
|
||||||
|
- name: build and test
|
||||||
|
run: rake -m -j4 all test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: travis_config.rb
|
||||||
|
CC: clang
|
||||||
|
CXX: clang++
|
||||||
|
|
||||||
|
macOS:
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: brew
|
||||||
|
run: brew install ruby gperf
|
||||||
|
- name: build and test
|
||||||
|
run: rake -m -j4 all test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: travis_config.rb
|
||||||
|
|
||||||
|
Windows-MinGW:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: chocolatey
|
||||||
|
run: choco install -y ruby gperf
|
||||||
|
- name: build and test
|
||||||
|
run: rake -E '$stdout.sync=true' -j4 test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: travis_config.rb
|
||||||
|
CFLAGS: -g -O1 -Wall -Wundef
|
||||||
|
|
||||||
|
Windows-Cygwin:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
|
||||||
|
key: ${{ runner.os }}-cygwin-chocolatey-${{ matrix.os }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-cygwin-chocolatey-${{ matrix.os }}-
|
||||||
|
${{ runner.os }}-cygwin-chocolatey-
|
||||||
|
- name: chocolatey
|
||||||
|
run: choco install -y cygwin
|
||||||
|
- name: Install cygwin packages
|
||||||
|
shell: cmd
|
||||||
|
run: C:\tools\cygwin\cygwinsetup.exe -qgnNdO -R C:/tools/cygwin -l C:/tools/cygwin/package -s http://mirrors.kernel.org/sourceware/cygwin/ -P gcc-core,gcc-g++,make,gperf,ruby
|
||||||
|
- name: Set ENV
|
||||||
|
run: |
|
||||||
|
echo '::set-env name=PATH::C:\tools\cygwin\bin;C:\tools\cygwin\usr\bin'
|
||||||
|
- name: build and test
|
||||||
|
shell: cmd
|
||||||
|
run: C:\tools\cygwin\bin\ruby.exe /usr/bin/rake -m -j4 -E 'STDOUT.sync=true' test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: travis_config.rb
|
||||||
|
|
||||||
|
Windows-VC:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: chocolatey
|
||||||
|
run: choco install -y ruby gperf
|
||||||
|
- name: build and test
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||||||
|
rake -E "STDOUT.sync=true" -m -j4 test
|
||||||
|
env:
|
||||||
|
MRUBY_CONFIG: appveyor_config.rb
|
||||||
|
# TODO(take-cheeze): Re-enable /O2
|
||||||
|
CFLAGS: "/c /nologo /W3 /we4013 /Zi /MD /D_CRT_SECURE_NO_WARNINGS"
|
||||||
|
CXXFLAGS: "/c /nologo /W3 /Zi /MD /EHs /D_CRT_SECURE_NO_WARNINGS"
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
name: "Code scanning - action"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 19 * * 4'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
CodeQL-Build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
# We must fetch at least the immediate parents so that if this is
|
||||||
|
# a pull request then we can checkout the head.
|
||||||
|
fetch-depth: 2
|
||||||
|
|
||||||
|
# If this run was triggered by a pull request event, then checkout
|
||||||
|
# the head of the pull request instead of the merge commit.
|
||||||
|
- run: git checkout HEAD^2
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v1
|
||||||
|
# Override language selection by uncommenting this and choosing your languages
|
||||||
|
# with:
|
||||||
|
# languages: go, javascript, csharp, python, cpp, java
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v1
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 https://git.io/JvXDl
|
||||||
|
|
||||||
|
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||||
|
# and modify them (or add more) to build your code if your project
|
||||||
|
# uses a compiled language
|
||||||
|
|
||||||
|
#- run: |
|
||||||
|
# make bootstrap
|
||||||
|
# make release
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v1
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
name: CIFuzz
|
||||||
|
on: [pull_request]
|
||||||
|
jobs:
|
||||||
|
Fuzzing:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Build Fuzzers
|
||||||
|
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
||||||
|
with:
|
||||||
|
oss-fuzz-project-name: 'mruby'
|
||||||
|
dry-run: false
|
||||||
|
- name: Run Fuzzers
|
||||||
|
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
|
||||||
|
with:
|
||||||
|
oss-fuzz-project-name: 'mruby'
|
||||||
|
fuzz-seconds: 600
|
||||||
|
dry-run: false
|
||||||
|
- name: Upload Crash
|
||||||
|
uses: actions/upload-artifact@v1
|
||||||
|
if: failure()
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: ./out/artifacts
|
||||||
|
|
||||||
+5
-2
@@ -1,3 +1,4 @@
|
|||||||
|
*.lock
|
||||||
*.bak
|
*.bak
|
||||||
*.bc
|
*.bc
|
||||||
*.d
|
*.d
|
||||||
@@ -16,6 +17,9 @@
|
|||||||
.svn
|
.svn
|
||||||
.vscode
|
.vscode
|
||||||
.yardoc
|
.yardoc
|
||||||
|
.ccls*
|
||||||
|
compile_flags.txt
|
||||||
|
compile_commands.json
|
||||||
cscope.files
|
cscope.files
|
||||||
cscope.out
|
cscope.out
|
||||||
tags
|
tags
|
||||||
@@ -30,5 +34,4 @@ tags
|
|||||||
/benchmark/*.png
|
/benchmark/*.png
|
||||||
|
|
||||||
/doc/api
|
/doc/api
|
||||||
|
/doc/capi
|
||||||
/src/y.tab.c
|
|
||||||
|
|||||||
+1601
-401
File diff suppressed because it is too large
Load Diff
+6
-14
@@ -1,19 +1,11 @@
|
|||||||
language: c
|
language: c
|
||||||
|
|
||||||
sudo: false
|
jobs:
|
||||||
|
- os: linux
|
||||||
matrix:
|
- os: osx
|
||||||
include:
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
- os: osx
|
|
||||||
osx_image: xcode7.1
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- gperf
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
- MRUBY_CONFIG=travis_config.rb
|
- MRUBY_CONFIG=travis_config.rb
|
||||||
script: "./minirake -j4 all test"
|
|
||||||
|
script:
|
||||||
|
- rake -m && rake test
|
||||||
|
|||||||
@@ -42,3 +42,4 @@ of this list.
|
|||||||
Masahiro Wakame
|
Masahiro Wakame
|
||||||
YAMAMOTO Masaya
|
YAMAMOTO Masaya
|
||||||
KOBAYASHI Shuji
|
KOBAYASHI Shuji
|
||||||
|
RIZAL Reckordp
|
||||||
|
|||||||
+11
-4
@@ -9,7 +9,7 @@ things in mind before submitting your pull request:
|
|||||||
|
|
||||||
* Work on the latest possible state of **mruby/master**
|
* Work on the latest possible state of **mruby/master**
|
||||||
* Create a branch which is dedicated to your change
|
* Create a branch which is dedicated to your change
|
||||||
* Test your changes before creating a pull request (```./minirake test```)
|
* Test your changes before creating a pull request (```rake test```)
|
||||||
* If possible write a test case which confirms your change
|
* If possible write a test case which confirms your change
|
||||||
* Don't mix several features or bug-fixes in one pull request
|
* Don't mix several features or bug-fixes in one pull request
|
||||||
* Create a meaningful commit message
|
* Create a meaningful commit message
|
||||||
@@ -33,9 +33,16 @@ mruby should be highly portable to other systems and compilers. For this it is
|
|||||||
recommended to keep your code as close as possible to the C99 standard
|
recommended to keep your code as close as possible to the C99 standard
|
||||||
(http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf).
|
(http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf).
|
||||||
|
|
||||||
Although we target C99, Visual C++ is also an important target for mruby. For
|
Although we target C99, we've heard some compilers in the embedded environment
|
||||||
this reason a declaration of a local variable has to be at the beginning of a
|
still requires declarations of local variables to be at the beginning of a
|
||||||
scope block.
|
scope. Until we confirm the situation has changed, we use the old-style
|
||||||
|
variable declaration.
|
||||||
|
|
||||||
|
Visual C++ is also an important target for mruby (supported version is 2013 or
|
||||||
|
later). For this reason features that are not supported by Visual C++ may not
|
||||||
|
be used (e.g. `%z` of `strftime()`).
|
||||||
|
|
||||||
|
NOTE: Old GCC requires `-std=gnu99` option to enable C99 support.
|
||||||
|
|
||||||
#### Reduce library dependencies to a minimum
|
#### Reduce library dependencies to a minimum
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2019 mruby developers
|
Copyright (c) 2020 mruby developers
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
# mruby is using Rake (http://rake.rubyforge.org) as a build tool.
|
# mruby is using Rake (http://rake.rubyforge.org) as a build tool.
|
||||||
# We provide a minimalistic version called minirake inside of our
|
|
||||||
# codebase.
|
|
||||||
|
|
||||||
RAKE = ruby ./minirake
|
RAKE = rake
|
||||||
|
|
||||||
all :
|
all :
|
||||||
$(RAKE)
|
$(RAKE)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
## What is mruby
|
## What is mruby
|
||||||
|
|
||||||
mruby is the lightweight implementation of the Ruby language complying to (part
|
mruby is the lightweight implementation of the Ruby language complying to (part
|
||||||
of) the [ISO standard][ISO-standard]. Its syntax is Ruby 1.9 compatible.
|
of) the [ISO standard][ISO-standard]. Its syntax is Ruby 2.x compatible.
|
||||||
|
|
||||||
mruby can be linked and embedded within your application. We provide the
|
mruby can be linked and embedded within your application. We provide the
|
||||||
interpreter program "mruby" and the interactive mruby shell "mirb" as examples.
|
interpreter program "mruby" and the interactive mruby shell "mirb" as examples.
|
||||||
@@ -17,7 +17,7 @@ of the Ministry of Economy, Trade and Industry of Japan.
|
|||||||
|
|
||||||
## How to get mruby
|
## How to get mruby
|
||||||
|
|
||||||
The stable version 2.0.1 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/2.0.1.zip](https://github.com/mruby/mruby/archive/2.0.1.zip)
|
The stable version 2.1.2 of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/archive/2.1.2.zip](https://github.com/mruby/mruby/archive/2.1.2.zip)
|
||||||
|
|
||||||
The latest development version of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/zipball/master](https://github.com/mruby/mruby/zipball/master)
|
The latest development version of mruby can be downloaded via the following URL: [https://github.com/mruby/mruby/zipball/master](https://github.com/mruby/mruby/zipball/master)
|
||||||
|
|
||||||
@@ -30,36 +30,49 @@ You can also install and compile mruby using [ruby-install](https://github.com/p
|
|||||||
|
|
||||||
## mruby home-page
|
## mruby home-page
|
||||||
|
|
||||||
The URL of the mruby home-page is: [http://www.mruby.org](http://www.mruby.org).
|
The URL of the mruby home-page is: https://mruby.org.
|
||||||
|
|
||||||
## Mailing list
|
## Mailing list
|
||||||
|
|
||||||
We don't have a mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby).
|
We don't have a mailing list, but you can use [GitHub issues](https://github.com/mruby/mruby/issues).
|
||||||
|
|
||||||
## How to compile and install (mruby and gems)
|
## How to compile and install (mruby and gems)
|
||||||
|
|
||||||
See the [doc/guides/compile.md](doc/guides/compile.md) file.
|
See the [compile.md](https://github.com/mruby/mruby/blob/master/doc/guides/compile.md) file.
|
||||||
|
|
||||||
## Running Tests
|
## Running Tests
|
||||||
|
|
||||||
To run the tests, execute the following from the project's root directory.
|
To run the tests, execute the following from the project's root directory.
|
||||||
|
|
||||||
$ make test
|
$ rake test
|
||||||
|
|
||||||
Or
|
Note: `bison` bundled with MacOS is too old to compile `mruby`.
|
||||||
|
Try `brew install bison` and follow the instuction shown to update
|
||||||
|
the `$PATH` to compile `mruby`.
|
||||||
|
|
||||||
$ ruby ./minirake test
|
## Building documentation
|
||||||
|
|
||||||
|
There are two sets of documentation in mruby: the mruby API (generated by yard) and C API (Doxygen)
|
||||||
|
|
||||||
|
To build both of them, simply go
|
||||||
|
|
||||||
|
rake doc
|
||||||
|
|
||||||
|
You can also view them in your browser
|
||||||
|
|
||||||
|
rake view_api
|
||||||
|
rake view_capi
|
||||||
|
|
||||||
## How to customize mruby (mrbgems)
|
## How to customize mruby (mrbgems)
|
||||||
|
|
||||||
mruby contains a package manager called *mrbgems*. To create extensions
|
mruby contains a package manager called *mrbgems*. To create extensions
|
||||||
in C and/or Ruby you should create a *GEM*. For a documentation of how to
|
in C and/or Ruby you should create a *GEM*. For a documentation of how to
|
||||||
use mrbgems consult the file [doc/guides/mrbgems.md](doc/guides/mrbgems.md). For example code of
|
use mrbgems consult the file [mrbgems.md](https://github.com/mruby/mruby/blob/master/doc/guides/mrbgems.md).
|
||||||
how to use mrbgems look into the folder *examples/mrbgems/*.
|
For example code of how to use mrbgems look into the folder *examples/mrbgems/*.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
mruby is released under the [MIT License](LICENSE).
|
mruby is released under the [MIT License](https://github.com/mruby/mruby/blob/master/LICENSE).
|
||||||
|
|
||||||
## Note for License
|
## Note for License
|
||||||
|
|
||||||
@@ -88,5 +101,5 @@ file in your pull request.
|
|||||||
|
|
||||||
[ISO-standard]: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579
|
[ISO-standard]: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579
|
||||||
[build-status-img]: https://travis-ci.org/mruby/mruby.svg?branch=master
|
[build-status-img]: https://travis-ci.org/mruby/mruby.svg?branch=master
|
||||||
[contribution-guidelines]: CONTRIBUTING.md
|
[contribution-guidelines]: https://github.com/mruby/mruby/blob/master/CONTRIBUTING.md
|
||||||
[travis-ci]: https://travis-ci.org/mruby/mruby
|
[travis-ci]: https://travis-ci.org/mruby/mruby
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ MRUBY_ROOT = File.dirname(File.expand_path(__FILE__))
|
|||||||
MRUBY_BUILD_HOST_IS_CYGWIN = RUBY_PLATFORM.include?('cygwin')
|
MRUBY_BUILD_HOST_IS_CYGWIN = RUBY_PLATFORM.include?('cygwin')
|
||||||
MRUBY_BUILD_HOST_IS_OPENBSD = RUBY_PLATFORM.include?('openbsd')
|
MRUBY_BUILD_HOST_IS_OPENBSD = RUBY_PLATFORM.include?('openbsd')
|
||||||
|
|
||||||
|
Rake.verbose(false) if Rake.verbose == Rake::DSL::DEFAULT
|
||||||
|
|
||||||
$LOAD_PATH << File.join(MRUBY_ROOT, "lib")
|
$LOAD_PATH << File.join(MRUBY_ROOT, "lib")
|
||||||
|
|
||||||
# load build systems
|
# load build systems
|
||||||
require "mruby-core-ext"
|
require "mruby-core-ext"
|
||||||
require "mruby/build"
|
require "mruby/build"
|
||||||
require "mruby/gem"
|
|
||||||
|
|
||||||
# load configuration file
|
# load configuration file
|
||||||
MRUBY_CONFIG = (ENV['MRUBY_CONFIG'] && ENV['MRUBY_CONFIG'] != '') ? ENV['MRUBY_CONFIG'] : "#{MRUBY_ROOT}/build_config.rb"
|
MRUBY_CONFIG = (ENV['MRUBY_CONFIG'] && ENV['MRUBY_CONFIG'] != '') ? ENV['MRUBY_CONFIG'] : "#{MRUBY_ROOT}/build_config.rb"
|
||||||
@@ -31,12 +32,12 @@ load "#{MRUBY_ROOT}/tasks/libmruby.rake"
|
|||||||
load "#{MRUBY_ROOT}/tasks/benchmark.rake"
|
load "#{MRUBY_ROOT}/tasks/benchmark.rake"
|
||||||
|
|
||||||
load "#{MRUBY_ROOT}/tasks/gitlab.rake"
|
load "#{MRUBY_ROOT}/tasks/gitlab.rake"
|
||||||
|
load "#{MRUBY_ROOT}/tasks/doc.rake"
|
||||||
|
|
||||||
def install_D(src, dst)
|
def install_D(src, dst)
|
||||||
opts = { :verbose => $verbose }
|
rm_f dst
|
||||||
FileUtils.rm_f dst, opts
|
mkdir_p File.dirname(dst)
|
||||||
FileUtils.mkdir_p File.dirname(dst), opts
|
cp src, dst
|
||||||
FileUtils.cp src, dst, opts
|
|
||||||
end
|
end
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
@@ -62,7 +63,7 @@ MRuby.each_target do |target|
|
|||||||
relative_from_root = gem.dir.relative_path_from(MRUBY_ROOT)
|
relative_from_root = gem.dir.relative_path_from(MRUBY_ROOT)
|
||||||
current_build_dir = File.expand_path "#{build_dir}/#{relative_from_root}"
|
current_build_dir = File.expand_path "#{build_dir}/#{relative_from_root}"
|
||||||
|
|
||||||
if current_build_dir !~ /^#{build_dir}/
|
if current_build_dir !~ /^#{Regexp.escape(build_dir)}/
|
||||||
current_build_dir = "#{build_dir}/mrbgems/#{gem.name}"
|
current_build_dir = "#{build_dir}/mrbgems/#{gem.name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -118,6 +119,7 @@ task :all => depfiles do
|
|||||||
MRuby.each_target do
|
MRuby.each_target do
|
||||||
print_build_summary
|
print_build_summary
|
||||||
end
|
end
|
||||||
|
MRuby::Lockfile.write
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "run all mruby tests"
|
desc "run all mruby tests"
|
||||||
@@ -143,26 +145,16 @@ end
|
|||||||
desc "clean all built and in-repo installed artifacts"
|
desc "clean all built and in-repo installed artifacts"
|
||||||
task :clean do
|
task :clean do
|
||||||
MRuby.each_target do |t|
|
MRuby.each_target do |t|
|
||||||
FileUtils.rm_rf t.build_dir, { :verbose => $verbose }
|
rm_rf t.build_dir
|
||||||
end
|
end
|
||||||
FileUtils.rm_f depfiles, { :verbose => $verbose }
|
rm_f depfiles
|
||||||
puts "Cleaned up target build folder"
|
puts "Cleaned up target build folder"
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "clean everything!"
|
desc "clean everything!"
|
||||||
task :deep_clean => ["clean"] do
|
task :deep_clean => ["clean", "clean_doc"] do
|
||||||
MRuby.each_target do |t|
|
MRuby.each_target do |t|
|
||||||
FileUtils.rm_rf t.gem_clone_dir, { :verbose => $verbose }
|
rm_rf t.gem_clone_dir
|
||||||
end
|
end
|
||||||
puts "Cleaned up mrbgems build folder"
|
puts "Cleaned up mrbgems build folder"
|
||||||
end
|
end
|
||||||
|
|
||||||
desc 'generate document'
|
|
||||||
task :doc do
|
|
||||||
begin
|
|
||||||
sh "mrbdoc"
|
|
||||||
rescue
|
|
||||||
puts "ERROR: To generate documents, you should install yard-mruby gem."
|
|
||||||
puts " $ gem install yard-mruby"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|||||||
+9
-12
@@ -4,20 +4,23 @@ os: Visual Studio 2017
|
|||||||
|
|
||||||
shallow_clone: true
|
shallow_clone: true
|
||||||
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- win_flex_bison
|
|
||||||
|
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
# Visual Studio 2017 64bit
|
# Visual Studio 2017 64bit
|
||||||
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
|
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
|
||||||
|
|
||||||
|
# Visual Studio 2017 32bit
|
||||||
|
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat
|
||||||
|
machine: x86
|
||||||
|
|
||||||
# Visual Studio 2015 64bit
|
# Visual Studio 2015 64bit
|
||||||
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
|
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
|
||||||
machine: amd64
|
machine: amd64
|
||||||
|
|
||||||
|
# Visual Studio 2015 32bit
|
||||||
|
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
|
||||||
|
machine: x86
|
||||||
|
|
||||||
# Visual Studio 2013 64bit
|
# Visual Studio 2013 64bit
|
||||||
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat
|
- visualcpp: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat
|
||||||
machine: amd64
|
machine: amd64
|
||||||
@@ -30,13 +33,7 @@ init:
|
|||||||
- ruby --version
|
- ruby --version
|
||||||
|
|
||||||
|
|
||||||
install:
|
|
||||||
- if not exist win_flex_bison (
|
|
||||||
appveyor DownloadFile "https://github.com/lexxmark/winflexbison/releases/download/v.2.5.10/win_flex_bison-2.5.10.zip" &
|
|
||||||
7z x -y -owin_flex_bison win_flex_bison-2.5.10.zip
|
|
||||||
)
|
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- set YACC=.\win_flex_bison\win_bison.exe
|
|
||||||
- set MRUBY_CONFIG=appveyor_config.rb
|
- set MRUBY_CONFIG=appveyor_config.rb
|
||||||
|
- rake -m
|
||||||
- rake -E $stdout.sync=true test
|
- rake -E $stdout.sync=true test
|
||||||
|
|||||||
+8
-12
@@ -1,14 +1,7 @@
|
|||||||
MRuby::Build.new('debug') do |conf|
|
def setup_option(conf)
|
||||||
toolchain :visualcpp
|
conf.cc.flags[0].delete("/Zi") unless ENV['CFLAGS']
|
||||||
enable_debug
|
conf.cxx.flags[0].delete("/Zi") unless ENV['CFLAGS'] || ENV['CXXFLAGS']
|
||||||
|
conf.linker.flags << "/DEBUG:NONE" unless ENV['LDFLAGS']
|
||||||
# include all core GEMs
|
|
||||||
conf.gembox 'full-core'
|
|
||||||
conf.compilers.each do |c|
|
|
||||||
c.defines += %w(MRB_GC_STRESS MRB_GC_FIXED_ARENA MRB_METHOD_CACHE)
|
|
||||||
end
|
|
||||||
|
|
||||||
build_mrbc_exec
|
|
||||||
end
|
end
|
||||||
|
|
||||||
MRuby::Build.new('full-debug') do |conf|
|
MRuby::Build.new('full-debug') do |conf|
|
||||||
@@ -17,7 +10,8 @@ MRuby::Build.new('full-debug') do |conf|
|
|||||||
|
|
||||||
# include all core GEMs
|
# include all core GEMs
|
||||||
conf.gembox 'full-core'
|
conf.gembox 'full-core'
|
||||||
conf.cc.defines = %w(MRB_ENABLE_DEBUG_HOOK)
|
conf.cc.defines += %w(MRB_GC_STRESS MRB_METHOD_CACHE MRB_ENABLE_DEBUG_HOOK)
|
||||||
|
setup_option(conf)
|
||||||
|
|
||||||
conf.enable_test
|
conf.enable_test
|
||||||
end
|
end
|
||||||
@@ -30,6 +24,7 @@ MRuby::Build.new do |conf|
|
|||||||
conf.compilers.each do |c|
|
conf.compilers.each do |c|
|
||||||
c.defines += %w(MRB_GC_FIXED_ARENA)
|
c.defines += %w(MRB_GC_FIXED_ARENA)
|
||||||
end
|
end
|
||||||
|
setup_option(conf)
|
||||||
conf.enable_bintest
|
conf.enable_bintest
|
||||||
conf.enable_test
|
conf.enable_test
|
||||||
end
|
end
|
||||||
@@ -41,6 +36,7 @@ MRuby::Build.new('cxx_abi') do |conf|
|
|||||||
conf.compilers.each do |c|
|
conf.compilers.each do |c|
|
||||||
c.defines += %w(MRB_GC_FIXED_ARENA)
|
c.defines += %w(MRB_GC_FIXED_ARENA)
|
||||||
end
|
end
|
||||||
|
setup_option(conf)
|
||||||
conf.enable_bintest
|
conf.enable_bintest
|
||||||
conf.enable_test
|
conf.enable_test
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -18,9 +18,9 @@ MRuby::Build.new do |conf|
|
|||||||
# end
|
# end
|
||||||
# conf.gem 'examples/mrbgems/c_and_ruby_extension_example'
|
# conf.gem 'examples/mrbgems/c_and_ruby_extension_example'
|
||||||
# conf.gem :core => 'mruby-eval'
|
# conf.gem :core => 'mruby-eval'
|
||||||
# conf.gem :mgem => 'mruby-io'
|
# conf.gem :mgem => 'mruby-onig-regexp'
|
||||||
# conf.gem :github => 'iij/mruby-io'
|
# conf.gem :github => 'mattn/mruby-onig-regexp'
|
||||||
# conf.gem :git => 'git@github.com:iij/mruby-io.git', :branch => 'master', :options => '-v'
|
# conf.gem :git => 'git@github.com:mattn/mruby-onig-regexp.git', :branch => 'master', :options => '-v'
|
||||||
|
|
||||||
# include the default GEMs
|
# include the default GEMs
|
||||||
conf.gembox 'default'
|
conf.gembox 'default'
|
||||||
@@ -30,9 +30,9 @@ MRuby::Build.new do |conf|
|
|||||||
# cc.flags = [ENV['CFLAGS'] || %w()]
|
# cc.flags = [ENV['CFLAGS'] || %w()]
|
||||||
# cc.include_paths = ["#{root}/include"]
|
# cc.include_paths = ["#{root}/include"]
|
||||||
# cc.defines = %w()
|
# cc.defines = %w()
|
||||||
# cc.option_include_path = '-I%s'
|
# cc.option_include_path = %q[-I"%s"]
|
||||||
# cc.option_define = '-D%s'
|
# cc.option_define = '-D%s'
|
||||||
# cc.compile_options = "%{flags} -MMD -o %{outfile} -c %{infile}"
|
# cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# mrbc settings
|
# mrbc settings
|
||||||
@@ -50,25 +50,25 @@ MRuby::Build.new do |conf|
|
|||||||
# linker.library_paths = []
|
# linker.library_paths = []
|
||||||
# linker.option_library = '-l%s'
|
# linker.option_library = '-l%s'
|
||||||
# linker.option_library_path = '-L%s'
|
# linker.option_library_path = '-L%s'
|
||||||
# linker.link_options = "%{flags} -o %{outfile} %{objs} %{libs}"
|
# linker.link_options = "%{flags} -o "%{outfile}" %{objs} %{libs}"
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# Archiver settings
|
# Archiver settings
|
||||||
# conf.archiver do |archiver|
|
# conf.archiver do |archiver|
|
||||||
# archiver.command = ENV['AR'] || 'ar'
|
# archiver.command = ENV['AR'] || 'ar'
|
||||||
# archiver.archive_options = 'rs %{outfile} %{objs}'
|
# archiver.archive_options = 'rs "%{outfile}" %{objs}'
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# Parser generator settings
|
# Parser generator settings
|
||||||
# conf.yacc do |yacc|
|
# conf.yacc do |yacc|
|
||||||
# yacc.command = ENV['YACC'] || 'bison'
|
# yacc.command = ENV['YACC'] || 'bison'
|
||||||
# yacc.compile_options = '-o %{outfile} %{infile}'
|
# yacc.compile_options = %q[-o "%{outfile}" "%{infile}"]
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# gperf settings
|
# gperf settings
|
||||||
# conf.gperf do |gperf|
|
# conf.gperf do |gperf|
|
||||||
# gperf.command = 'gperf'
|
# gperf.command = 'gperf'
|
||||||
# gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'
|
# gperf.compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"]
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# file extensions
|
# file extensions
|
||||||
|
|||||||
+46
-42
@@ -6,11 +6,15 @@ binaries.
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
To compile mruby out of the source code you need the following tools:
|
To compile mruby out of the source code you need the following tools:
|
||||||
* C Compiler (i.e. ```gcc```)
|
* C Compiler (e.g. `gcc` or `clang`)
|
||||||
* Linker (i.e. ```gcc```)
|
* Linker (e.g. `gcc` or `clang`)
|
||||||
* Archive utility (i.e. ```ar```)
|
* Archive utility (e.g. `ar`)
|
||||||
* Parser generator (i.e. ```bison```)
|
* Parser generator (e.g. `bison`)
|
||||||
* Ruby 1.8 or 1.9 (i.e. ```ruby``` or ```jruby```)
|
* Ruby 2.0 or later (e.g. `ruby` or `jruby`)
|
||||||
|
|
||||||
|
Note that `bison` bundled with MacOS is too old to compile `mruby`.
|
||||||
|
Try `brew install bison` and follow the instuction shown to update
|
||||||
|
the `$PATH` to compile `mruby`.
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
* GIT (to update mruby source and integrate mrbgems easier)
|
* GIT (to update mruby source and integrate mrbgems easier)
|
||||||
@@ -32,10 +36,10 @@ All tools necessary to compile mruby can be set or modified here. In case
|
|||||||
you want to maintain an additional *build_config.rb* you can define a
|
you want to maintain an additional *build_config.rb* you can define a
|
||||||
customized path using the *$MRUBY_CONFIG* environment variable.
|
customized path using the *$MRUBY_CONFIG* environment variable.
|
||||||
|
|
||||||
To compile just call ```./minirake``` inside of the mruby source root. To
|
To compile just call `rake` inside of the mruby source root. To
|
||||||
generate and execute the test tools call ```./minirake test```. To clean
|
generate and execute the test tools call `rake test`. To clean
|
||||||
all build files call ```./minirake clean```. To see full command line on
|
all build files call `rake clean`. To see full command line on
|
||||||
build, call ```./minirake -v```.
|
build, call `rake -v`.
|
||||||
|
|
||||||
## Build Configuration
|
## Build Configuration
|
||||||
|
|
||||||
@@ -79,7 +83,7 @@ toolchain :android
|
|||||||
```
|
```
|
||||||
|
|
||||||
Requires the custom standalone Android NDK and the toolchain path
|
Requires the custom standalone Android NDK and the toolchain path
|
||||||
in ```ANDROID_STANDALONE_TOOLCHAIN```.
|
in `ANDROID_STANDALONE_TOOLCHAIN`.
|
||||||
|
|
||||||
### Binaries
|
### Binaries
|
||||||
|
|
||||||
@@ -97,7 +101,7 @@ conf.gem "#{root}/mrbgems/mruby-bin-mirb"
|
|||||||
### File Separator
|
### File Separator
|
||||||
|
|
||||||
Some environments require a different file separator character. It is possible to
|
Some environments require a different file separator character. It is possible to
|
||||||
set the character via ```conf.file_separator```.
|
set the character via `conf.file_separator`.
|
||||||
```ruby
|
```ruby
|
||||||
conf.file_separator = '/'
|
conf.file_separator = '/'
|
||||||
```
|
```
|
||||||
@@ -119,7 +123,7 @@ end
|
|||||||
|
|
||||||
C Compiler has header searcher to detect installed library.
|
C Compiler has header searcher to detect installed library.
|
||||||
|
|
||||||
If you need a include path of header file use ```search_header_path```:
|
If you need a include path of header file use `search_header_path`:
|
||||||
```ruby
|
```ruby
|
||||||
# Searches ```iconv.h```.
|
# Searches ```iconv.h```.
|
||||||
# If found it will return include path of the header file.
|
# If found it will return include path of the header file.
|
||||||
@@ -127,7 +131,7 @@ If you need a include path of header file use ```search_header_path```:
|
|||||||
fail 'iconv.h not found' unless conf.cc.search_header_path 'iconv.h'
|
fail 'iconv.h not found' unless conf.cc.search_header_path 'iconv.h'
|
||||||
```
|
```
|
||||||
|
|
||||||
If you need a full file name of header file use ```search_header```:
|
If you need a full file name of header file use `search_header`:
|
||||||
```ruby
|
```ruby
|
||||||
# Searches ```iconv.h```.
|
# Searches ```iconv.h```.
|
||||||
# If found it will return full path of the header file.
|
# If found it will return full path of the header file.
|
||||||
@@ -136,11 +140,11 @@ iconv_h = conf.cc.search_header 'iconv.h'
|
|||||||
print "iconv.h found: #{iconv_h}\n"
|
print "iconv.h found: #{iconv_h}\n"
|
||||||
```
|
```
|
||||||
|
|
||||||
Header searcher uses compiler's ```include_paths``` by default.
|
Header searcher uses compiler's `include_paths` by default.
|
||||||
When you are using GCC toolchain (including clang toolchain since its base is gcc toolchain)
|
When you are using GCC toolchain (including clang toolchain since its base is gcc toolchain)
|
||||||
it will use compiler specific include paths too. (For example ```/usr/local/include```, ```/usr/include```)
|
it will use compiler specific include paths too. (For example `/usr/local/include`, `/usr/include`)
|
||||||
|
|
||||||
If you need a special header search paths define a singleton method ```header_search_paths``` to C compiler:
|
If you need a special header search paths define a singleton method `header_search_paths` to C compiler:
|
||||||
```ruby
|
```ruby
|
||||||
def conf.cc.header_search_paths
|
def conf.cc.header_search_paths
|
||||||
['/opt/local/include'] + include_paths
|
['/opt/local/include'] + include_paths
|
||||||
@@ -222,7 +226,7 @@ See doc/mrbgems/README.md for more option about mrbgems.
|
|||||||
|
|
||||||
Configuration Mrbtest build process.
|
Configuration Mrbtest build process.
|
||||||
|
|
||||||
If you want mrbtest.a only, You should set ```conf.build_mrbtest_lib_only```
|
If you want mrbtest.a only, You should set `conf.build_mrbtest_lib_only`
|
||||||
```ruby
|
```ruby
|
||||||
conf.build_mrbtest_lib_only
|
conf.build_mrbtest_lib_only
|
||||||
```
|
```
|
||||||
@@ -230,9 +234,9 @@ conf.build_mrbtest_lib_only
|
|||||||
### Bintest
|
### Bintest
|
||||||
|
|
||||||
Tests for mrbgem tools using CRuby.
|
Tests for mrbgem tools using CRuby.
|
||||||
To have bintests place \*.rb scripts to ```bintest/``` directory of mrbgems.
|
To have bintests place \*.rb scripts to `bintest/` directory of mrbgems.
|
||||||
See ```mruby-bin-*/bintest/*.rb``` if you need examples.
|
See `mruby-bin-*/bintest/*.rb` if you need examples.
|
||||||
If you want a temporary files use `tempfile` module of CRuby instead of ```/tmp/```.
|
If you want a temporary files use `tempfile` module of CRuby instead of `/tmp/`.
|
||||||
|
|
||||||
You can enable it with following:
|
You can enable it with following:
|
||||||
```ruby
|
```ruby
|
||||||
@@ -247,8 +251,8 @@ correctly. To support mrbgems written in C++, mruby can be
|
|||||||
configured to use C++ exception.
|
configured to use C++ exception.
|
||||||
|
|
||||||
There are two levels of C++ exception handling. The one is
|
There are two levels of C++ exception handling. The one is
|
||||||
```enable_cxx_exception``` that enables C++ exception, but
|
`enable_cxx_exception` that enables C++ exception, but
|
||||||
uses C ABI. The other is ```enable_cxx_abi``` where all
|
uses C ABI. The other is `enable_cxx_abi` where all
|
||||||
files are compiled by C++ compiler.
|
files are compiled by C++ compiler.
|
||||||
|
|
||||||
When you mix C++ code, C++ exception would be enabled automatically.
|
When you mix C++ code, C++ exception would be enabled automatically.
|
||||||
@@ -266,7 +270,7 @@ C++ exception, add following:
|
|||||||
conf.disable_cxx_exception
|
conf.disable_cxx_exception
|
||||||
```
|
```
|
||||||
and you will get an error when you try to use C++ gem.
|
and you will get an error when you try to use C++ gem.
|
||||||
Note that it must be called before ```enable_cxx_exception``` or ```gem``` method.
|
Note that it must be called before `enable_cxx_exception` or `gem` method.
|
||||||
|
|
||||||
### Debugging mode
|
### Debugging mode
|
||||||
|
|
||||||
@@ -276,17 +280,17 @@ conf.enable_debug
|
|||||||
```
|
```
|
||||||
|
|
||||||
When debugging mode is enabled
|
When debugging mode is enabled
|
||||||
* Macro ```MRB_DEBUG``` would be defined.
|
* Macro `MRB_DEBUG` would be defined.
|
||||||
* Which means ```mrb_assert()``` macro is enabled.
|
* Which means `mrb_assert()` macro is enabled.
|
||||||
* Debug information of irep would be generated by ```mrbc```.
|
* Debug information of irep would be generated by `mrbc`.
|
||||||
* Because ```-g``` flag would be added to ```mrbc``` runner.
|
* Because `-g` flag would be added to `mrbc` runner.
|
||||||
* You can have better backtrace of mruby scripts with this.
|
* You can have better backtrace of mruby scripts with this.
|
||||||
|
|
||||||
## Cross-Compilation
|
## Cross-Compilation
|
||||||
|
|
||||||
mruby can also be cross-compiled from one platform to another. To
|
mruby can also be cross-compiled from one platform to another. To
|
||||||
achieve this the *build_config.rb* needs to contain an instance of
|
achieve this the *build_config.rb* needs to contain an instance of
|
||||||
```MRuby::CrossBuild```. This instance defines the compilation
|
`MRuby::CrossBuild`. This instance defines the compilation
|
||||||
tools and flags for the target platform. An example could look
|
tools and flags for the target platform. An example could look
|
||||||
like this:
|
like this:
|
||||||
```ruby
|
```ruby
|
||||||
@@ -298,12 +302,12 @@ MRuby::CrossBuild.new('32bit') do |conf|
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
All configuration options of ```MRuby::Build``` can also be used
|
All configuration options of `MRuby::Build` can also be used
|
||||||
in ```MRuby::CrossBuild```.
|
in `MRuby::CrossBuild`.
|
||||||
|
|
||||||
### Mrbtest in Cross-Compilation
|
### Mrbtest in Cross-Compilation
|
||||||
|
|
||||||
In cross compilation, you can run ```mrbtest``` on emulator if
|
In cross compilation, you can run `mrbtest` on emulator if
|
||||||
you have it by changing configuration of test runner.
|
you have it by changing configuration of test runner.
|
||||||
```ruby
|
```ruby
|
||||||
conf.test_runner do |t|
|
conf.test_runner do |t|
|
||||||
@@ -350,15 +354,15 @@ in *build/host/src*)
|
|||||||
result will be stored in *build/host/src/y.tab.c*)
|
result will be stored in *build/host/src/y.tab.c*)
|
||||||
* compile *build/host/src/y.tab.c* to *build/host/src/y.tab.o*
|
* compile *build/host/src/y.tab.c* to *build/host/src/y.tab.o*
|
||||||
* create *build/host/lib/libmruby_core.a* out of all object files (C only)
|
* create *build/host/lib/libmruby_core.a* out of all object files (C only)
|
||||||
* create ```build/host/bin/mrbc``` by compiling *tools/mrbc/mrbc.c* and
|
* create `build/host/bin/mrbc` by compiling *tools/mrbc/mrbc.c* and
|
||||||
linking with *build/host/lib/libmruby_core.a*
|
linking with *build/host/lib/libmruby_core.a*
|
||||||
* create *build/host/mrblib/mrblib.c* by compiling all \*.rb files
|
* create *build/host/mrblib/mrblib.c* by compiling all \*.rb files
|
||||||
under *mrblib* with ```build/host/bin/mrbc```
|
under *mrblib* with `build/host/bin/mrbc`
|
||||||
* compile *build/host/mrblib/mrblib.c* to *build/host/mrblib/mrblib.o*
|
* compile *build/host/mrblib/mrblib.c* to *build/host/mrblib/mrblib.o*
|
||||||
* create *build/host/lib/libmruby.a* out of all object files (C and Ruby)
|
* create *build/host/lib/libmruby.a* out of all object files (C and Ruby)
|
||||||
* create ```build/host/bin/mruby``` by compiling *mrbgems/mruby-bin-mruby/tools/mruby/mruby.c* and
|
* create `build/host/bin/mruby` by compiling *mrbgems/mruby-bin-mruby/tools/mruby/mruby.c* and
|
||||||
linking with *build/host/lib/libmruby.a*
|
linking with *build/host/lib/libmruby.a*
|
||||||
* create ```build/host/bin/mirb``` by compiling *mrbgems/mruby-bin-mirb/tools/mirb/mirb.c* and
|
* create `build/host/bin/mirb` by compiling *mrbgems/mruby-bin-mirb/tools/mirb/mirb.c* and
|
||||||
linking with *build/host/lib/libmruby.a*
|
linking with *build/host/lib/libmruby.a*
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -427,15 +431,15 @@ in *build/i386/src*)
|
|||||||
result will be stored in *build/i386/src/y.tab.c*)
|
result will be stored in *build/i386/src/y.tab.c*)
|
||||||
* cross-compile *build/i386/src/y.tab.c* to *build/i386/src/y.tab.o*
|
* cross-compile *build/i386/src/y.tab.c* to *build/i386/src/y.tab.o*
|
||||||
* create *build/i386/mrblib/mrblib.c* by compiling all \*.rb files
|
* create *build/i386/mrblib/mrblib.c* by compiling all \*.rb files
|
||||||
under *mrblib* with the native ```build/host/bin/mrbc```
|
under *mrblib* with the native `build/host/bin/mrbc`
|
||||||
* cross-compile *build/host/mrblib/mrblib.c* to *build/host/mrblib/mrblib.o*
|
* cross-compile *build/host/mrblib/mrblib.c* to *build/host/mrblib/mrblib.o*
|
||||||
* create *build/i386/lib/libmruby.a* out of all object files (C and Ruby)
|
* create *build/i386/lib/libmruby.a* out of all object files (C and Ruby)
|
||||||
* create ```build/i386/bin/mruby``` by cross-compiling *mrbgems/mruby-bin-mruby/tools/mruby/mruby.c* and
|
* create `build/i386/bin/mruby` by cross-compiling *mrbgems/mruby-bin-mruby/tools/mruby/mruby.c* and
|
||||||
linking with *build/i386/lib/libmruby.a*
|
linking with *build/i386/lib/libmruby.a*
|
||||||
* create ```build/i386/bin/mirb``` by cross-compiling *mrbgems/mruby-bin-mirb/tools/mirb/mirb.c* and
|
* create `build/i386/bin/mirb` by cross-compiling *mrbgems/mruby-bin-mirb/tools/mirb/mirb.c* and
|
||||||
linking with *build/i386/lib/libmruby.a*
|
linking with *build/i386/lib/libmruby.a*
|
||||||
* create *build/i386/lib/libmruby_core.a* out of all object files (C only)
|
* create *build/i386/lib/libmruby_core.a* out of all object files (C only)
|
||||||
* create ```build/i386/bin/mrbc``` by cross-compiling *tools/mrbc/mrbc.c* and
|
* create `build/i386/bin/mrbc` by cross-compiling *tools/mrbc/mrbc.c* and
|
||||||
linking with *build/i386/lib/libmruby_core.a*
|
linking with *build/i386/lib/libmruby_core.a*
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -463,7 +467,7 @@ linking with *build/i386/lib/libmruby_core.a*
|
|||||||
### Minimal Library
|
### Minimal Library
|
||||||
|
|
||||||
To build a minimal mruby library you need to use the Cross Compiling
|
To build a minimal mruby library you need to use the Cross Compiling
|
||||||
feature due to the reason that there are functions (i.e. stdio) which
|
feature due to the reason that there are functions (e.g. stdio) which
|
||||||
can't be disabled for the main build.
|
can't be disabled for the main build.
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
@@ -477,12 +481,12 @@ end
|
|||||||
|
|
||||||
This configuration defines a cross compile build called 'Minimal' which
|
This configuration defines a cross compile build called 'Minimal' which
|
||||||
is using the GCC and compiles for the host machine. It also disables
|
is using the GCC and compiles for the host machine. It also disables
|
||||||
all usages of stdio and doesn't compile any binaries (i.e. mrbc).
|
all usages of stdio and doesn't compile any binaries (e.g. mrbc).
|
||||||
|
|
||||||
## Test Environment
|
## Test Environment
|
||||||
|
|
||||||
mruby's build process includes a test environment. In case you start the testing
|
mruby's build process includes a test environment. In case you start the testing
|
||||||
of mruby, a native binary called ```mrbtest``` will be generated and executed.
|
of mruby, a native binary called `mrbtest` will be generated and executed.
|
||||||
This binary contains all test cases which are defined under *test/t*. In case
|
This binary contains all test cases which are defined under *test/t*. In case
|
||||||
of a cross-compilation an additional cross-compiled *mrbtest* binary is
|
of a cross-compilation an additional cross-compiled *mrbtest* binary is
|
||||||
generated. You can copy this binary and run on your target system.
|
generated. You can copy this binary and run on your target system.
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ To confirm mrdb was installed properly, run mrdb with the `--version` option:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ mrdb --version
|
$ mrdb --version
|
||||||
mruby 2.0.1 (2019-4-4)
|
mruby 2.1.2 (2020-08-06)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.2 Basic Operation
|
## 2.2 Basic Operation
|
||||||
|
|||||||
+42
-7
@@ -50,15 +50,17 @@ You can use mrbconfs with following ways:
|
|||||||
* When defined single precision floating point type(C type `float`) is used as `mrb_float`.
|
* When defined single precision floating point type(C type `float`) is used as `mrb_float`.
|
||||||
* Else double precision floating point type(C type `double`) is used as `mrb_float`.
|
* Else double precision floating point type(C type `double`) is used as `mrb_float`.
|
||||||
|
|
||||||
`MRB_INT16`
|
`MRB_WITHOUT_FLOAT`
|
||||||
* When defined `int16_t` will be defined as `mrb_int`.
|
* When defined removes floating point numbers from mruby.
|
||||||
|
* It makes mruby easier to handle in "Microcontroller without FPU" and "Kernel Space".
|
||||||
|
|
||||||
|
`MRB_INT32`
|
||||||
|
* When defined, or `MRB_INT64` are not defined on 32-bit CPU mode, `mrb_int` will be defined as `int32_t`.
|
||||||
* Conflicts with `MRB_INT64`.
|
* Conflicts with `MRB_INT64`.
|
||||||
|
|
||||||
`MRB_INT64`
|
`MRB_INT64`
|
||||||
* When defined `int64_t` will be defined as `mrb_int`.
|
* When defined, or `MRB_INT32` are not defined on 64-bit CPU mode, `mrb_int` will be defined as `int64_t`.
|
||||||
* Conflicts with `MRB_INT16`.
|
* Conflicts with `MRB_INT32`.
|
||||||
* When `MRB_INT16` or `MRB_INT64` isn't defined `int`(most of the times 32-bit integer)
|
|
||||||
will be defined as `mrb_int`.
|
|
||||||
|
|
||||||
## Garbage collector configuration.
|
## Garbage collector configuration.
|
||||||
|
|
||||||
@@ -115,7 +117,7 @@ largest value of required alignment.
|
|||||||
|
|
||||||
`MRB_NAN_BOXING`
|
`MRB_NAN_BOXING`
|
||||||
* If defined represent `mrb_value` in boxed `double`.
|
* If defined represent `mrb_value` in boxed `double`.
|
||||||
* Conflicts with `MRB_USE_FLOAT`.
|
* Conflicts with `MRB_USE_FLOAT` and `MRB_WITHOUT_FLOAT`.
|
||||||
|
|
||||||
`MRB_WORD_BOXING`
|
`MRB_WORD_BOXING`
|
||||||
* If defined represent `mrb_value` as a word.
|
* If defined represent `mrb_value` as a word.
|
||||||
@@ -126,6 +128,22 @@ largest value of required alignment.
|
|||||||
* Default value is `4`.
|
* Default value is `4`.
|
||||||
* Specifies size of each segment in segment list.
|
* Specifies size of each segment in segment list.
|
||||||
|
|
||||||
|
## Reduce heap memory configuration.
|
||||||
|
|
||||||
|
`MRB_USE_LINK_TIME_RO_DATA_P`
|
||||||
|
* Only available on ELF platforms.
|
||||||
|
* If you specify the address of a read-only section when creating a symbol or string, that string will be used as it is.
|
||||||
|
* Heap memory can be saved.
|
||||||
|
* Uses `__ehdr_start` and `__init_array_start`.
|
||||||
|
* It must be `__ehdr_start < data_addr < __init_array_start`.
|
||||||
|
|
||||||
|
`MRB_USE_CUSTOM_RO_DATA_P`
|
||||||
|
* Takes precedence over `MRB_USE_LINK_TIME_RO_DATA_P`.
|
||||||
|
* Please try if `MRB_USE_LINK_TIME_RO_DATA_P` is not available.
|
||||||
|
* The `mrb_ro_data_p()` function is implemented by the user in an arbitrary file.
|
||||||
|
* The prototype declaration is `mrb_bool mrb_ro_data_p(const char *ptr)`.
|
||||||
|
* Return `TRUE` if `ptr` is in read-only section, otherwise return `FALSE`.
|
||||||
|
|
||||||
## Other configuration.
|
## Other configuration.
|
||||||
`MRB_UTF8_STRING`
|
`MRB_UTF8_STRING`
|
||||||
* Adds UTF-8 encoding support to character-oriented String instance methods.
|
* Adds UTF-8 encoding support to character-oriented String instance methods.
|
||||||
@@ -144,3 +162,20 @@ largest value of required alignment.
|
|||||||
`MRB_STR_BUF_MIN_SIZE`
|
`MRB_STR_BUF_MIN_SIZE`
|
||||||
* Default value is `128`.
|
* Default value is `128`.
|
||||||
* Specifies initial capacity of `RString` created by `mrb_str_buf_new` function..
|
* Specifies initial capacity of `RString` created by `mrb_str_buf_new` function..
|
||||||
|
|
||||||
|
`MRB_METHOD_CACHE`
|
||||||
|
* Improve performance for method dispatch.
|
||||||
|
|
||||||
|
`MRB_METHOD_CACHE_SIZE`
|
||||||
|
* Default value is `128`.
|
||||||
|
* Ignored if `MRB_METHOD_CACHE` is not defined.
|
||||||
|
* Need to be the power of 2.
|
||||||
|
|
||||||
|
`MRB_METHOD_T_STRUCT`
|
||||||
|
* Use C struct to represent `mrb_method_t`
|
||||||
|
* No `MRB_METHOD_T_STRUCT` requires highest 2 bits of function pointers to be zero
|
||||||
|
* Define this macro on machines that use higher bits of pointers
|
||||||
|
|
||||||
|
`MRB_ENABLE_ALL_SYMBOLS`
|
||||||
|
* Make it available `Symbols.all_symbols` in `mrbgems/mruby-symbol-ext`
|
||||||
|
* Increase heap memory usage.
|
||||||
|
|||||||
@@ -37,11 +37,16 @@ conf.gem :mgem => 'mruby-yaml'
|
|||||||
conf.gem :mgem => 'yaml' # 'mruby-' prefix could be omitted
|
conf.gem :mgem => 'yaml' # 'mruby-' prefix could be omitted
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For specifying commit hash to checkout use `:checksum_hash` option:
|
||||||
|
```ruby
|
||||||
|
conf.gem mgem: 'mruby-redis', checksum_hash: '3446d19fc4a3f9697b5ddbf2a904f301c42f2f4e'
|
||||||
|
```
|
||||||
|
|
||||||
If there is missing dependencies, mrbgem dependencies solver will reference
|
If there is missing dependencies, mrbgem dependencies solver will reference
|
||||||
mrbgem from core or mgem-list.
|
mrbgem from core or mgem-list.
|
||||||
|
|
||||||
To pull all gems from remote GIT repository on build, call ```./minirake -p```,
|
To pull all gems from remote GIT repository on build, call ```rake -p```,
|
||||||
or ```./minirake --pull-gems```.
|
or ```rake --pull-gems```.
|
||||||
|
|
||||||
NOTE: `:bitbucket` option supports only git. Hg is unsupported in this version.
|
NOTE: `:bitbucket` option supports only git. Hg is unsupported in this version.
|
||||||
|
|
||||||
@@ -230,7 +235,7 @@ So it is recommended not to put GEM's local header files on include/.
|
|||||||
These exports are retroactive.
|
These exports are retroactive.
|
||||||
For example: when B depends to C and A depends to B, A will get include paths exported by C.
|
For example: when B depends to C and A depends to B, A will get include paths exported by C.
|
||||||
|
|
||||||
Exported include_paths are automatically appended to GEM local include_paths by Minirake.
|
Exported include_paths are automatically appended to GEM local include_paths by rake.
|
||||||
You can use `spec.export_include_paths` accessor if you want more complex build.
|
You can use `spec.export_include_paths` accessor if you want more complex build.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+88
-38
@@ -14,17 +14,17 @@ This document does not contain a complete list of limitations.
|
|||||||
Please help to improve it by submitting your findings.
|
Please help to improve it by submitting your findings.
|
||||||
|
|
||||||
|
|
||||||
## ```1/2``` gives ```0.5```
|
## `1/2` gives `0.5`
|
||||||
|
|
||||||
Since mruby does not have ```Bignum```, bigger integers are represented
|
Since mruby does not have `Bignum`, bigger integers are represented
|
||||||
by ```Float``` numbers. To enhance interoperability between ```Fixnum```
|
by `Float` numbers. To enhance interoperability between `Fixnum`
|
||||||
and ```Float```, mruby provides ```Float#upto``` and other iterating
|
and `Float`, mruby provides `Float#upto` and other iterating
|
||||||
methods for the ```Float``` class. As a side effect, ```1/2``` gives ```0.5```
|
methods for the `Float` class. As a side effect, `1/2` gives `0.5`
|
||||||
not ```0```.
|
not `0`.
|
||||||
|
|
||||||
## ```Array``` passed to ```puts```
|
## `Array` passed to `puts`
|
||||||
|
|
||||||
Passing an Array to ```puts``` results in different output.
|
Passing an Array to `puts` results in different output.
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
puts [1,2,3]
|
puts [1,2,3]
|
||||||
@@ -38,15 +38,15 @@ puts [1,2,3]
|
|||||||
3
|
3
|
||||||
```
|
```
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
```
|
```
|
||||||
[1, 2, 3]
|
[1, 2, 3]
|
||||||
```
|
```
|
||||||
|
|
||||||
## ```Kernel.raise``` in rescue clause
|
## `Kernel.raise` in rescue clause
|
||||||
|
|
||||||
```Kernel.raise``` without arguments does not raise the current exception within
|
`Kernel.raise` without arguments does not raise the current exception within
|
||||||
a rescue clause.
|
a rescue clause.
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
@@ -59,21 +59,21 @@ end
|
|||||||
|
|
||||||
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
||||||
|
|
||||||
```ZeroDivisionError``` is raised.
|
`ZeroDivisionError` is raised.
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
No exception is raised.
|
No exception is raised.
|
||||||
|
|
||||||
## Fiber execution can't cross C function boundary
|
## Fiber execution can't cross C function boundary
|
||||||
|
|
||||||
mruby's ```Fiber``` is implemented in a similar way to Lua's co-routine. This
|
mruby's `Fiber` is implemented in a similar way to Lua's co-routine. This
|
||||||
results in the consequence that you can't switch context within C functions.
|
results in the consequence that you can't switch context within C functions.
|
||||||
Only exception is ```mrb_fiber_yield``` at return.
|
Only exception is `mrb_fiber_yield` at return.
|
||||||
|
|
||||||
## ```Array``` does not support instance variables
|
## `Array` does not support instance variables
|
||||||
|
|
||||||
To reduce memory consumption ```Array``` does not support instance variables.
|
To reduce memory consumption `Array` does not support instance variables.
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
class Liste < Array
|
class Liste < Array
|
||||||
@@ -87,16 +87,16 @@ p Liste.new "foobar"
|
|||||||
|
|
||||||
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
||||||
|
|
||||||
``` [] ```
|
` [] `
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
```ArgumentError``` is raised.
|
`ArgumentError` is raised.
|
||||||
|
|
||||||
## Method visibility
|
## Method visibility
|
||||||
|
|
||||||
For simplicity reasons no method visibility (public/private/protected) is
|
For simplicity reasons no method visibility (public/private/protected) is
|
||||||
supported.
|
supported. Those methods are defined but they are dummy methods.
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
class VisibleTest
|
class VisibleTest
|
||||||
@@ -119,17 +119,53 @@ false
|
|||||||
true
|
true
|
||||||
```
|
```
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
```
|
```
|
||||||
true
|
true
|
||||||
true
|
true
|
||||||
```
|
```
|
||||||
|
|
||||||
## defined?
|
### Visibility Declaration
|
||||||
|
|
||||||
The ```defined?``` keyword is considered too complex to be fully
|
The declaration form of following visibility methods are not implemented.
|
||||||
implemented. It is recommended to use ```const_defined?``` and
|
|
||||||
|
* `public`
|
||||||
|
* `private`
|
||||||
|
* `protected`
|
||||||
|
* `module_function`
|
||||||
|
|
||||||
|
Especially, `module_function` method is not dummy, but no declaration form.
|
||||||
|
|
||||||
|
```
|
||||||
|
module TestModule
|
||||||
|
module_function
|
||||||
|
def test_func
|
||||||
|
p 'test_func called'
|
||||||
|
end
|
||||||
|
|
||||||
|
test_func
|
||||||
|
end
|
||||||
|
|
||||||
|
p 'ok'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ruby [ruby 2.5.5p157 (2019-03-15 revision 67260)]
|
||||||
|
|
||||||
|
```
|
||||||
|
ok
|
||||||
|
```
|
||||||
|
|
||||||
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
|
```
|
||||||
|
test.rb:8: undefined method 'test_func' (NoMethodError)
|
||||||
|
```
|
||||||
|
|
||||||
|
## `defined?`
|
||||||
|
|
||||||
|
The `defined?` keyword is considered too complex to be fully
|
||||||
|
implemented. It is recommended to use `const_defined?` and
|
||||||
other reflection methods instead.
|
other reflection methods instead.
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
@@ -142,11 +178,11 @@ defined?(Foo)
|
|||||||
nil
|
nil
|
||||||
```
|
```
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
```NameError``` is raised.
|
`NameError` is raised.
|
||||||
|
|
||||||
## ```alias``` on global variables
|
## `alias` on global variables
|
||||||
|
|
||||||
Aliasing a global variable works in CRuby but is not part
|
Aliasing a global variable works in CRuby but is not part
|
||||||
of the ISO standard.
|
of the ISO standard.
|
||||||
@@ -157,9 +193,9 @@ alias $a $__a__
|
|||||||
|
|
||||||
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
||||||
|
|
||||||
``` nil ```
|
` nil `
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
Syntax error
|
Syntax error
|
||||||
|
|
||||||
@@ -178,15 +214,15 @@ end
|
|||||||
|
|
||||||
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
#### Ruby [ruby 2.0.0p645 (2015-04-13 revision 50299)]
|
||||||
|
|
||||||
```ArgumentError``` is raised.
|
`ArgumentError` is raised.
|
||||||
The re-defined ```+``` operator does not accept any arguments.
|
The re-defined `+` operator does not accept any arguments.
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
``` 'ab' ```
|
` 'ab' `
|
||||||
Behavior of the operator wasn't changed.
|
Behavior of the operator wasn't changed.
|
||||||
|
|
||||||
## Kernel#binding is not supported
|
## `Kernel#binding` is not supported
|
||||||
|
|
||||||
`Kernel#binding` method is not supported.
|
`Kernel#binding` method is not supported.
|
||||||
|
|
||||||
@@ -197,7 +233,7 @@ $ ruby -e 'puts Proc.new {}.binding'
|
|||||||
#<Binding:0x00000e9deabb9950>
|
#<Binding:0x00000e9deabb9950>
|
||||||
```
|
```
|
||||||
|
|
||||||
#### mruby [2.0.1 (2019-4-4)]
|
#### mruby [2.1.2 (2020-08-06)]
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./bin/mruby -e 'puts Proc.new {}.binding'
|
$ ./bin/mruby -e 'puts Proc.new {}.binding'
|
||||||
@@ -219,7 +255,7 @@ $ ruby -e 'def m(*r,**k) p [r,k] end; m("a"=>1,:b=>2)'
|
|||||||
[[{"a"=>1}], {:b=>2}]
|
[[{"a"=>1}], {:b=>2}]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### mruby [mruby 2.0.1]
|
#### mruby [mruby 2.1.2]
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./bin/mruby -e 'def m(*r,**k) p [r,k] end; m("a"=>1,:b=>2)'
|
$ ./bin/mruby -e 'def m(*r,**k) p [r,k] end; m("a"=>1,:b=>2)'
|
||||||
@@ -238,7 +274,7 @@ Destructured arguments (`b` and `c` in above example) cannot be accessed
|
|||||||
from the default expression of optional arguments and keyword arguments,
|
from the default expression of optional arguments and keyword arguments,
|
||||||
since actual assignment is done after the evaluation of those default
|
since actual assignment is done after the evaluation of those default
|
||||||
expressions. Thus:
|
expressions. Thus:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
def f(a,(b,c),d=b)
|
def f(a,(b,c),d=b)
|
||||||
p [a,b,c,d]
|
p [a,b,c,d]
|
||||||
@@ -247,3 +283,17 @@ f(1,[2,3])
|
|||||||
```
|
```
|
||||||
|
|
||||||
CRuby gives `[1,2,3,nil]`. mruby raises `NoMethodError` for `b`.
|
CRuby gives `[1,2,3,nil]`. mruby raises `NoMethodError` for `b`.
|
||||||
|
|
||||||
|
## `nil?` redefinition in conditional expressions
|
||||||
|
|
||||||
|
Redefinition of `nil?` is ignored in conditional expressions.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
a = "a"
|
||||||
|
def a.nil?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
puts(a.nil? ? "truthy" : "falsy")
|
||||||
|
```
|
||||||
|
|
||||||
|
Ruby outputs `falsy`. mruby outputs `truthy`.
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 8.4 KiB |
+108
-95
@@ -16,7 +16,6 @@ In the table.1 below, the second field describes the size (and
|
|||||||
sign) of operands.
|
sign) of operands.
|
||||||
|
|
||||||
* B: 8bit
|
* B: 8bit
|
||||||
* sB: signed 8bit
|
|
||||||
* S: 16bit
|
* S: 16bit
|
||||||
* sS: signed 16bit
|
* sS: signed 16bit
|
||||||
* W: 24bit
|
* W: 24bit
|
||||||
@@ -31,97 +30,111 @@ with `"`, either `OP_EXT1` or `OP_EXT2` or `OP_EXT2` can be prefixed.
|
|||||||
|
|
||||||
## table.1 Instruction Table
|
## table.1 Instruction Table
|
||||||
|
|
||||||
|Instruction Name |Operand type |Semantics
|
| Instruction Name | Operand type | Semantics |
|
||||||
|-----------------|-------------|-----------------
|
|------------------|--------------|--------------------------------------------------------|
|
||||||
|OP_NOP | - |
|
| OP_NOP | - | no operation |
|
||||||
|OP_MOVE" |BB |R(a) = R(b)
|
| OP_MOVE" | BB | R(a) = R(b) |
|
||||||
|OP_LOADL" |BB |R(a) = Pool(b)
|
| OP_LOADL" | BB | R(a) = Pool(b) |
|
||||||
|OP_LOADI" |BsB |R(a) = mrb_int(b)
|
| OP_LOADI" | BB | R(a) = mrb_int(b) |
|
||||||
|OP_LOADI_0' |B |R(a) = 0
|
| OP_LOADINEG" | BB | R(a) = mrb_int(-b) |
|
||||||
|OP_LOADI_1' |B |R(a) = 1
|
| OP_LOADI__1' | B | R(a) = mrb_int(-1) |
|
||||||
|OP_LOADI_2' |B |R(a) = 2
|
| OP_LOADI_0' | B | R(a) = mrb_int(0) |
|
||||||
|OP_LOADI_3' |B |R(a) = 3
|
| OP_LOADI_1' | B | R(a) = mrb_int(1) |
|
||||||
|OP_LOADSYM" |BB |R(a) = Syms(b)
|
| OP_LOADI_2' | B | R(a) = mrb_int(2) |
|
||||||
|OP_LOADNIL' |B |R(a) = nil
|
| OP_LOADI_3' | B | R(a) = mrb_int(3) |
|
||||||
|OP_LOADSELF' |B |R(a) = self
|
| OP_LOADI_4' | B | R(a) = mrb_int(4) |
|
||||||
|OP_LOADT' |B |R(a) = true
|
| OP_LOADI_5' | B | R(a) = mrb_int(5) |
|
||||||
|OP_LOADF' |B |R(a) = false
|
| OP_LOADI_6' | B | R(a) = mrb_int(6) |
|
||||||
|OP_GETGV" |BB |R(a) = getglobal(Syms(b))
|
| OP_LOADI_7' | B | R(a) = mrb_int(7) |
|
||||||
|OP_SETGV" |BB |setglobal(Syms(b), R(a))
|
| OP_LOADI16' | BsS | R(a) = mrb_int(b) |
|
||||||
|OP_GETSV" |BB |R(a) = Special[b]
|
| OP_LOADSYM" | BB | R(a) = Syms(b) |
|
||||||
|OP_SETSV" |BB |Special[b] = R(a)
|
| OP_LOADNIL' | B | R(a) = nil |
|
||||||
|OP_GETIV" |BB |R(a) = ivget(Syms(b))
|
| OP_LOADSELF' | B | R(a) = self |
|
||||||
|OP_SETIV" |BB |ivset(Syms(b),R(a))
|
| OP_LOADT' | B | R(a) = true |
|
||||||
|OP_GETCV" |BB |R(a) = cvget(Syms(b))
|
| OP_LOADF' | B | R(a) = false |
|
||||||
|OP_SETCV" |BB |cvset(Syms(b),R(a))
|
| OP_GETGV" | BB | R(a) = getglobal(Syms(b)) |
|
||||||
|OP_GETCONST" |BB |R(a) = constget(Syms(b))
|
| OP_SETGV" | BB | setglobal(Syms(b), R(a)) |
|
||||||
|OP_SETCONST" |BB |constset(Syms(b),R(a))
|
| OP_GETSV" | BB | R(a) = Special[Syms(b)] |
|
||||||
|OP_GETMCNST" |BB |R(a) = R(a)::Syms(b)
|
| OP_SETSV" | BB | Special[Syms(b)] = R(a) |
|
||||||
|OP_SETMCNST" |BB |R(a+1)::Syms(b) = R(a)
|
| OP_GETIV" | BB | R(a) = ivget(Syms(b)) |
|
||||||
|OP_GETUPVAR' |BBB |R(a) = uvget(b,c)
|
| OP_SETIV" | BB | ivset(Syms(b),R(a)) |
|
||||||
|OP_SETUPVAR' |BBB |uvset(b,c,R(a))
|
| OP_GETCV" | BB | R(a) = cvget(Syms(b)) |
|
||||||
|OP_JMP |S |pc+=a
|
| OP_SETCV" | BB | cvset(Syms(b),R(a)) |
|
||||||
|OP_JMPIF' |SB |if R(b) pc+=a
|
| OP_GETCONST" | BB | R(a) = constget(Syms(b)) |
|
||||||
|OP_JMPNOT' |SB |if !R(b) pc+=a
|
| OP_SETCONST" | BB | constset(Syms(b),R(a)) |
|
||||||
|OP_ONERR |sS |rescue_push(pc+a)
|
| OP_GETMCNST" | BB | R(a) = R(a)::Syms(b) |
|
||||||
|OP_EXCEPT' |B |R(a) = exc
|
| OP_SETMCNST" | BB | R(a+1)::Syms(b) = R(a) |
|
||||||
|OP_RESCUE" |BB |R(b) = R(a).isa?(R(b))
|
| OP_GETUPVAR" | BBB | R(a) = uvget(b,c) |
|
||||||
|OP_POPERR |B |a.times{rescue_pop()}
|
| OP_SETUPVAR" | BBB | uvset(b,c,R(a)) |
|
||||||
|OP_RAISE' |B |raise(R(a))
|
| OP_JMP | S | pc=a |
|
||||||
|OP_EPUSH' |B |ensure_push(SEQ[a])
|
| OP_JMPIF' | BS | if R(a) pc=b |
|
||||||
|OP_EPOP |B |A.times{ensure_pop().call}
|
| OP_JMPNOT' | BS | if !R(a) pc=b |
|
||||||
|OP_SENDV" |BB |R(a) = call(R(a),Syms(b),*R(a+1))
|
| OP_JMPNIL' | BS | if R(a)==nil pc=b |
|
||||||
|OP_SENDVB" |BB |R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2))
|
| OP_ONERR | S | rescue_push(a) |
|
||||||
|OP_SEND" |BBB |R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c))
|
| OP_EXCEPT' | B | R(a) = exc |
|
||||||
|OP_SENDB" |BBB |R(a) = call(R(a),Syms(Bx),R(a+1),...,R(a+c),&R(a+c+1))
|
| OP_RESCUE" | BB | R(b) = R(a).isa?(R(b)) |
|
||||||
|OP_CALL' |B |R(a) = self.call(frame.argc, frame.argv)
|
| OP_POPERR' | B | a.times{rescue_pop()} |
|
||||||
|OP_SUPER' |BB |R(a) = super(R(a+1),... ,R(a+b+1))
|
| OP_RAISE' | B | raise(R(a)) |
|
||||||
|OP_ARGARY' |BS |R(a) = argument array (16=5:1:5:1:4)
|
| OP_EPUSH' | B | ensure_push(SEQ[a]) |
|
||||||
|OP_ENTER |W |arg setup according to flags (23=5:5:1:5:5:1:1)
|
| OP_EPOP' | B | A.times{ensure_pop().call} |
|
||||||
|OP_KARG" |BB |R(a) = kdict[Syms(Bx)] # todo
|
| OP_SENDV" | BB | R(a) = call(R(a),Syms(b),*R(a+1)) |
|
||||||
|OP_KARG2" |BB |R(a) = kdict[Syms(Bx)]; kdict.rm(Syms(b)) # todo
|
| OP_SENDVB" | BB | R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2)) |
|
||||||
|OP_RETURN' |B |return R(a) (normal)
|
| OP_SEND" | BBB | R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c)) |
|
||||||
|OP_RETURN_BLK' |B |return R(a) (in-block return)
|
| OP_SENDB" | BBB | R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c),&R(a+c+1)) |
|
||||||
|OP_BREAK' |B |break R(a)
|
| OP_CALL | - | R(0) = self.call(frame.argc, frame.argv) |
|
||||||
|OP_BLKPUSH' |BS |R(a) = block (16=5:1:5:1:4)
|
| OP_SUPER" | BB | R(a) = super(R(a+1),... ,R(a+b+1)) |
|
||||||
|OP_ADD" |BB |R(a) = R(a)+R(a+1)
|
| OP_ARGARY' | BS | R(a) = argument array (16=5:1:5:1:4) |
|
||||||
|OP_ADDI" |BBB |R(a) = R(a)+mrb_int(c)
|
| OP_ENTER | W | arg setup according to flags (23=5:5:1:5:5:1:1) |
|
||||||
|OP_SUB" |BB |R(a) = R(a)-R(a+1)
|
| OP_KEY_P" | BB | R(a) = kdict.key?(Syms(b)) |
|
||||||
|OP_SUBI" |BB |R(a) = R(a)-C
|
| OP_KEYEND | - | raise unless kdict.empty? |
|
||||||
|OP_MUL" |BB |R(a) = R(a)*R(a+1)
|
| OP_KARG" | BB | R(a) = kdict[Syms(b)]; kdict.delete(Syms(b)) |
|
||||||
|OP_DIV" |BB |R(a) = R(a)/R(a+1)
|
| OP_RETURN' | B | return R(a) (normal) |
|
||||||
|OP_EQ" |BB |R(a) = R(a)==R(a+1)
|
| OP_RETURN_BLK' | B | return R(a) (in-block return) |
|
||||||
|OP_LT" |BB |R(a) = R(a)<R(a+1)
|
| OP_BREAK' | B | break R(a) |
|
||||||
|OP_LE" |BB |R(a) = R(a)<=R(a+1)
|
| OP_BLKPUSH' | BS | R(a) = block (16=5:1:5:1:4) |
|
||||||
|OP_GT" |BB |R(a) = R(a)>R(a+1)
|
| OP_ADD' | B | R(a) = R(a)+R(a+1) |
|
||||||
|OP_GE" |BB |R(a) = R(a)>=R(a+1)
|
| OP_ADDI" | BB | R(a) = R(a)+mrb_int(b) |
|
||||||
|OP_ARRAY' |BB |R(a) = ary_new(R(a),R(a+1)..R(a+b))
|
| OP_SUB' | B | R(a) = R(a)-R(a+1) |
|
||||||
|OP_ARRAY2" |BB |R(a) = ary_new(R(b),R(b+1)..R(b+c))
|
| OP_SUBI" | BB | R(a) = R(a)-mrb_int(b) |
|
||||||
|OP_ARYCAT' |B |ary_cat(R(a),R(a+1))
|
| OP_MUL' | B | R(a) = R(a)*R(a+1) |
|
||||||
|OP_ARYPUSH' |B |ary_push(R(a),R(a+1))
|
| OP_DIV' | B | R(a) = R(a)/R(a+1) |
|
||||||
|OP_AREF' |BB |R(a) = R(a)[b]
|
| OP_EQ' | B | R(a) = R(a)==R(a+1) |
|
||||||
|OP_ASET' |BB |R(a)[b] = R(a+1)
|
| OP_LT' | B | R(a) = R(a)<R(a+1) |
|
||||||
|OP_APOST' |BB |*R(a),R(A+1)..R(A+C) = R(a)[B..]
|
| OP_LE' | B | R(a) = R(a)<=R(a+1) |
|
||||||
|OP_STRING" |BB |R(a) = str_dup(Lit(b))
|
| OP_GT' | B | R(a) = R(a)>R(a+1) |
|
||||||
|OP_STRCAT' |B |str_cat(R(a),R(a+1))
|
| OP_GE' | B | R(a) = R(a)>=R(a+1) |
|
||||||
|OP_HASH' |BB |R(a) = hash_new(R(a),R(a+1)..R(a+b))
|
| OP_ARRAY" | BB | R(a) = ary_new(R(a),R(a+1)..R(a+b)) |
|
||||||
|OP_HASHADD' |BB |R(a) = hash_push(R(a),R(a+1)..R(a+b))
|
| OP_ARRAY2" | BBB | R(a) = ary_new(R(b),R(b+1)..R(b+c)) |
|
||||||
|OP_LAMBDA" |BB |R(a) = lambda(SEQ[b],OP_L_LAMBDA)
|
| OP_ARYCAT' | B | ary_cat(R(a),R(a+1)) |
|
||||||
|OP_BLOCK" |BB |R(a) = lambda(SEQ[b],OP_L_BLOCK)
|
| OP_ARYPUSH' | B | ary_push(R(a),R(a+1)) |
|
||||||
|OP_METHOD" |BB |R(a) = lambda(SEQ[b],OP_L_METHOD)
|
| OP_ARYDUP' | B | R(a) = ary_dup(R(a)) |
|
||||||
|OP_RANGE_INC' |B |R(a) = range_new(R(a),R(a+1),FALSE)
|
| OP_AREF" | BBB | R(a) = R(b)[c] |
|
||||||
|OP_RANGE_EXC' |B |R(a) = range_new(R(a),R(a+1),TRUE)
|
| OP_ASET" | BBB | R(a)[c] = R(b) |
|
||||||
|OP_OCLASS' |B |R(a) = ::Object
|
| OP_APOST" | BBB | *R(a),R(a+1)..R(a+c) = R(a)[b..] |
|
||||||
|OP_CLASS" |BB |R(a) = newclass(R(a),Syms(b),R(a+1))
|
| OP_INTERN' | B | R(a) = intern(R(a)) |
|
||||||
|OP_MODULE" |BB |R(a) = newmodule(R(a),Syms(b))
|
| OP_STRING" | BB | R(a) = str_dup(Lit(b)) |
|
||||||
|OP_EXEC" |BB |R(a) = blockexec(R(a),SEQ[b])
|
| OP_STRCAT' | B | str_cat(R(a),R(a+1)) |
|
||||||
|OP_DEF" |BB |R(a).newmethod(Syms(b),R(a+1))
|
| OP_HASH" | BB | R(a) = hash_new(R(a),R(a+1)..R(a+b)) |
|
||||||
|OP_ALIAS' |B |alias_method(R(a),R(a+1),R(a+2))
|
| OP_HASHADD" | BB | R(a) = hash_push(R(a),R(a+1)..R(a+b)) |
|
||||||
|OP_UNDEF" |BB |undef_method(R(a),Syms(b))
|
| OP_HASHCAT' | B | R(a) = hash_cat(R(a),R(a+1)) |
|
||||||
|OP_SCLASS' |B |R(a) = R(a).singleton_class
|
| OP_LAMBDA" | BB | R(a) = lambda(SEQ[b],OP_L_LAMBDA) |
|
||||||
|OP_TCLASS' |B |R(a) = target_class
|
| OP_BLOCK" | BB | R(a) = lambda(SEQ[b],OP_L_BLOCK) |
|
||||||
|OP_ERR' |B |raise(RuntimeError, Lit(Bx))
|
| OP_METHOD" | BB | R(a) = lambda(SEQ[b],OP_L_METHOD) |
|
||||||
|OP_EXT1 |- |make 1st operand 16bit
|
| OP_RANGE_INC' | B | R(a) = range_new(R(a),R(a+1),FALSE) |
|
||||||
|OP_EXT2 |- |make 2nd operand 16bit
|
| OP_RANGE_EXC' | B | R(a) = range_new(R(a),R(a+1),TRUE) |
|
||||||
|OP_EXT3 |- |make 1st and 2nd operands 16bit
|
| OP_OCLASS' | B | R(a) = ::Object |
|
||||||
|OP_STOP |- |stop VM
|
| OP_CLASS" | BB | R(a) = newclass(R(a),Syms(b),R(a+1)) |
|
||||||
|
| OP_MODULE" | BB | R(a) = newmodule(R(a),Syms(b)) |
|
||||||
|
| OP_EXEC" | BB | R(a) = blockexec(R(a),SEQ[b]) |
|
||||||
|
| OP_DEF" | BB | R(a).newmethod(Syms(b),R(a+1)) |
|
||||||
|
| OP_ALIAS" | BB | alias_method(target_class,Syms(a),Syms(b)) |
|
||||||
|
| OP_UNDEF' | B | undef_method(target_class,Syms(a)) |
|
||||||
|
| OP_SCLASS' | B | R(a) = R(a).singleton_class |
|
||||||
|
| OP_TCLASS' | B | R(a) = target_class |
|
||||||
|
| OP_DEBUG" | BBB | print a,b,c |
|
||||||
|
| OP_ERR' | B | raise(LocalJumpError, Lit(a)) |
|
||||||
|
| OP_EXT1 | - | make 1st operand 16bit |
|
||||||
|
| OP_EXT2 | - | make 2nd operand 16bit |
|
||||||
|
| OP_EXT3 | - | make 1st and 2nd operands 16bit |
|
||||||
|
| OP_STOP | - | stop VM |
|
||||||
|
|------------------|--------------|--------------------------------------------------------|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ MRuby::CrossBuild.new("ArduinoDue") do |conf|
|
|||||||
cc.flags = %w(-g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500
|
cc.flags = %w(-g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500
|
||||||
-Dprintf=iprintf -mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=156 -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM
|
-Dprintf=iprintf -mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=156 -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM
|
||||||
-D__SAM3X8E__ -mthumb -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON -DUSB_MANUFACTURER="Unknown" -DUSB_PRODUCT="Arduino Due")
|
-D__SAM3X8E__ -mthumb -DUSB_PID=0x003e -DUSB_VID=0x2341 -DUSBCON -DUSB_MANUFACTURER="Unknown" -DUSB_PRODUCT="Arduino Due")
|
||||||
cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
|
cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
|
|
||||||
#configuration for low memory environment
|
#configuration for low memory environment
|
||||||
cc.defines << %w(MRB_HEAP_PAGE_SIZE=64)
|
cc.defines << %w(MRB_HEAP_PAGE_SIZE=64)
|
||||||
@@ -64,7 +64,7 @@ MRuby::CrossBuild.new("ArduinoDue") do |conf|
|
|||||||
|
|
||||||
conf.archiver do |archiver|
|
conf.archiver do |archiver|
|
||||||
archiver.command = "#{BIN_PATH}/arm-none-eabi-ar"
|
archiver.command = "#{BIN_PATH}/arm-none-eabi-ar"
|
||||||
archiver.archive_options = 'rcs %{outfile} %{objs}'
|
archiver.archive_options = 'rcs "%{outfile}" %{objs}'
|
||||||
end
|
end
|
||||||
|
|
||||||
#no executables
|
#no executables
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ MRuby::CrossBuild.new('core2-32-poky-linux') do |conf|
|
|||||||
cc.flags = %w(-m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer)
|
cc.flags = %w(-m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -mstackrealign -fno-omit-frame-pointer)
|
||||||
cc.flags << %w(-O2 -pipe -g -feliminate-unused-debug-types)
|
cc.flags << %w(-O2 -pipe -g -feliminate-unused-debug-types)
|
||||||
cc.flags << "--sysroot=#{POKY_EDISON_SYSROOT}"
|
cc.flags << "--sysroot=#{POKY_EDISON_SYSROOT}"
|
||||||
cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
|
cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
cc.defines = %w(ENABLE_READLINE)
|
cc.defines = %w(ENABLE_READLINE)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ MRuby::CrossBuild.new('core2-32-poky-linux') do |conf|
|
|||||||
|
|
||||||
conf.archiver do |archiver|
|
conf.archiver do |archiver|
|
||||||
archiver.command = "#{POKY_EDISON_BIN_PATH}/i586-poky-linux-ar"
|
archiver.command = "#{POKY_EDISON_BIN_PATH}/i586-poky-linux-ar"
|
||||||
archiver.archive_options = 'rcs %{outfile} %{objs}'
|
archiver.archive_options = 'rcs "%{outfile}" %{objs}'
|
||||||
end
|
end
|
||||||
|
|
||||||
conf.linker do |linker|
|
conf.linker do |linker|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ MRuby::CrossBuild.new("Galileo") do |conf|
|
|||||||
cc.flags = %w(-m32 -march=i586 -c -g -Os -w
|
cc.flags = %w(-m32 -march=i586 -c -g -Os -w
|
||||||
-ffunction-sections -fdata-sections -MMD -DARDUINO=153)
|
-ffunction-sections -fdata-sections -MMD -DARDUINO=153)
|
||||||
cc.flags << "--sysroot=#{GALILEO_SYSROOT}"
|
cc.flags << "--sysroot=#{GALILEO_SYSROOT}"
|
||||||
cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
|
cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
end
|
end
|
||||||
|
|
||||||
conf.cxx do |cxx|
|
conf.cxx do |cxx|
|
||||||
@@ -54,7 +54,7 @@ MRuby::CrossBuild.new("Galileo") do |conf|
|
|||||||
|
|
||||||
conf.archiver do |archiver|
|
conf.archiver do |archiver|
|
||||||
archiver.command = "#{GALILEO_BIN_PATH}/i586-poky-linux-uclibc-ar"
|
archiver.command = "#{GALILEO_BIN_PATH}/i586-poky-linux-uclibc-ar"
|
||||||
archiver.archive_options = 'rcs %{outfile} %{objs}'
|
archiver.archive_options = 'rcs "%{outfile}" %{objs}'
|
||||||
end
|
end
|
||||||
|
|
||||||
conf.linker do |linker|
|
conf.linker do |linker|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ MRuby::CrossBuild.new("RX630") do |conf|
|
|||||||
conf.cc do |cc|
|
conf.cc do |cc|
|
||||||
cc.command = "#{BIN_PATH}/rx-elf-gcc"
|
cc.command = "#{BIN_PATH}/rx-elf-gcc"
|
||||||
cc.flags = "-Wall -g -O2 -flto -mcpu=rx600 -m64bit-doubles"
|
cc.flags = "-Wall -g -O2 -flto -mcpu=rx600 -m64bit-doubles"
|
||||||
cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
|
cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
|
|
||||||
#configuration for low memory environment
|
#configuration for low memory environment
|
||||||
cc.defines << %w(MRB_USE_FLOAT)
|
cc.defines << %w(MRB_USE_FLOAT)
|
||||||
@@ -53,7 +53,7 @@ MRuby::CrossBuild.new("RX630") do |conf|
|
|||||||
|
|
||||||
conf.archiver do |archiver|
|
conf.archiver do |archiver|
|
||||||
archiver.command = "#{BIN_PATH}/rx-elf-ar"
|
archiver.command = "#{BIN_PATH}/rx-elf-ar"
|
||||||
archiver.archive_options = 'rcs %{outfile} %{objs}'
|
archiver.archive_options = 'rcs "%{outfile}" %{objs}'
|
||||||
end
|
end
|
||||||
|
|
||||||
#no executables
|
#no executables
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ MRuby::CrossBuild.new("chipKITMax32") do |conf|
|
|||||||
cc.flags = %w(-O2 -mno-smart-io -w -ffunction-sections -fdata-sections -g -mdebugger -Wcast-align
|
cc.flags = %w(-O2 -mno-smart-io -w -ffunction-sections -fdata-sections -g -mdebugger -Wcast-align
|
||||||
-fno-short-double -mprocessor=32MX795F512L -DF_CPU=80000000L -DARDUINO=23 -D_BOARD_MEGA_
|
-fno-short-double -mprocessor=32MX795F512L -DF_CPU=80000000L -DARDUINO=23 -D_BOARD_MEGA_
|
||||||
-DMPIDEVER=0x01000202 -DMPIDE=23)
|
-DMPIDEVER=0x01000202 -DMPIDE=23)
|
||||||
cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
|
cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
|
|
||||||
#configuration for low memory environment
|
#configuration for low memory environment
|
||||||
cc.defines << %w(MRB_HEAP_PAGE_SIZE=64)
|
cc.defines << %w(MRB_HEAP_PAGE_SIZE=64)
|
||||||
@@ -60,7 +60,7 @@ MRuby::CrossBuild.new("chipKITMax32") do |conf|
|
|||||||
|
|
||||||
conf.archiver do |archiver|
|
conf.archiver do |archiver|
|
||||||
archiver.command = "#{PIC32_PATH}/compiler/pic32-tools/bin/pic32-ar"
|
archiver.command = "#{PIC32_PATH}/compiler/pic32-tools/bin/pic32-ar"
|
||||||
archiver.archive_options = 'rcs %{outfile} %{objs}'
|
archiver.archive_options = 'rcs "%{outfile}" %{objs}'
|
||||||
end
|
end
|
||||||
|
|
||||||
#no executables
|
#no executables
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
MRuby::Build.new do |conf|
|
||||||
|
# Gets set by the VS command prompts
|
||||||
|
if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
|
||||||
|
toolchain :visualcpp
|
||||||
|
else
|
||||||
|
toolchain :gcc
|
||||||
|
end
|
||||||
|
|
||||||
|
enable_debug
|
||||||
|
|
||||||
|
# Include the default GEMs
|
||||||
|
conf.gembox 'default'
|
||||||
|
end
|
||||||
|
|
||||||
|
# Cross Compiling configuration for the Sega Dreamcast
|
||||||
|
# This configuration requires KallistiOS (KOS)
|
||||||
|
# https://dreamcast.wiki
|
||||||
|
#
|
||||||
|
# Tested on GNU/Linux, MinGW-w64/MSYS2, Cygwin, macOS and MinGW/MSYS (see below)
|
||||||
|
#
|
||||||
|
MRuby::CrossBuild.new("dreamcast") do |conf|
|
||||||
|
toolchain :gcc
|
||||||
|
|
||||||
|
# Support for DreamSDK (based on MinGW/MSYS)
|
||||||
|
# To compile mruby with DreamSDK, RubyInstaller for Windows should be installed
|
||||||
|
DREAMSDK_HOME = ENV["DREAMSDK_HOME"]
|
||||||
|
MSYS_ROOT = !(DREAMSDK_HOME.nil? || DREAMSDK_HOME.empty?) ? "#{DREAMSDK_HOME}/msys/1.0" : ""
|
||||||
|
|
||||||
|
# Setting paths
|
||||||
|
DREAMCAST_PATH = "#{MSYS_ROOT}/opt/toolchains/dc"
|
||||||
|
KOS_PATH = "#{DREAMCAST_PATH}/kos"
|
||||||
|
BIN_PATH = "#{DREAMCAST_PATH}/sh-elf/bin"
|
||||||
|
|
||||||
|
# C compiler
|
||||||
|
# Flags were extracted from KallistiOS environment files
|
||||||
|
conf.cc do |cc|
|
||||||
|
cc.command = "#{BIN_PATH}/sh-elf-gcc"
|
||||||
|
cc.include_paths << ["#{KOS_PATH}/include", "#{KOS_PATH}/kernel/arch/dreamcast/include", "#{KOS_PATH}/addons/include", "#{KOS_PATH}/../kos-ports/include"]
|
||||||
|
cc.flags << ["-O2", "-fomit-frame-pointer", "-ml", "-m4-single-only", "-ffunction-sections", "-fdata-sections", "-Wall", "-g", "-fno-builtin", "-ml", "-m4-single-only", "-Wl,-Ttext=0x8c010000", "-Wl,--gc-sections", "-T#{KOS_PATH}/utils/ldscripts/shlelf.xc", "-nodefaultlibs"]
|
||||||
|
cc.compile_options = %Q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
|
cc.defines << %w(_arch_dreamcast)
|
||||||
|
cc.defines << %w(_arch_sub_pristine)
|
||||||
|
end
|
||||||
|
|
||||||
|
# C++ compiler
|
||||||
|
conf.cxx do |cxx|
|
||||||
|
cxx.command = conf.cc.command.dup
|
||||||
|
cxx.include_paths = conf.cc.include_paths.dup
|
||||||
|
cxx.flags = conf.cc.flags.dup
|
||||||
|
cxx.flags << %w(-fno-rtti -fno-exceptions)
|
||||||
|
cxx.defines = conf.cc.defines.dup
|
||||||
|
cxx.compile_options = conf.cc.compile_options.dup
|
||||||
|
end
|
||||||
|
|
||||||
|
# Linker
|
||||||
|
# There is an issue when making the mruby library with KallistiOS:
|
||||||
|
# 'newlib_kill.o' and 'newlib_getpid.o' aren't found so they are explicitly
|
||||||
|
# specified here at least for now.
|
||||||
|
conf.linker do |linker|
|
||||||
|
linker.command="#{BIN_PATH}/sh-elf-gcc"
|
||||||
|
linker.flags << ["#{MSYS_ROOT}/opt/toolchains/dc/kos/kernel/build/newlib_kill.o", "#{MSYS_ROOT}/opt/toolchains/dc/kos/kernel/build/newlib_getpid.o", "-Wl,--start-group -lkallisti -lc -lgcc -Wl,--end-group"]
|
||||||
|
linker.library_paths << ["#{KOS_PATH}/lib/dreamcast", "#{KOS_PATH}/addons/lib/dreamcast", "#{KOS_PATH}/../kos-ports/lib"]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Archiver
|
||||||
|
conf.archiver do |archiver|
|
||||||
|
archiver.command = "#{BIN_PATH}/sh-elf-ar"
|
||||||
|
archiver.archive_options = 'rcs "%{outfile}" %{objs}'
|
||||||
|
end
|
||||||
|
|
||||||
|
# No executables
|
||||||
|
conf.bins = []
|
||||||
|
|
||||||
|
# Do not build executable test
|
||||||
|
conf.build_mrbtest_lib_only
|
||||||
|
|
||||||
|
# Disable C++ exception
|
||||||
|
conf.disable_cxx_exception
|
||||||
|
|
||||||
|
# Gems from core
|
||||||
|
# removing mruby-io
|
||||||
|
conf.gem :core => "mruby-metaprog"
|
||||||
|
conf.gem :core => "mruby-pack"
|
||||||
|
conf.gem :core => "mruby-sprintf"
|
||||||
|
conf.gem :core => "mruby-print"
|
||||||
|
conf.gem :core => "mruby-math"
|
||||||
|
conf.gem :core => "mruby-time"
|
||||||
|
conf.gem :core => "mruby-struct"
|
||||||
|
conf.gem :core => "mruby-compar-ext"
|
||||||
|
conf.gem :core => "mruby-enum-ext"
|
||||||
|
conf.gem :core => "mruby-string-ext"
|
||||||
|
conf.gem :core => "mruby-numeric-ext"
|
||||||
|
conf.gem :core => "mruby-array-ext"
|
||||||
|
conf.gem :core => "mruby-hash-ext"
|
||||||
|
conf.gem :core => "mruby-range-ext"
|
||||||
|
conf.gem :core => "mruby-proc-ext"
|
||||||
|
conf.gem :core => "mruby-symbol-ext"
|
||||||
|
conf.gem :core => "mruby-random"
|
||||||
|
conf.gem :core => "mruby-object-ext"
|
||||||
|
conf.gem :core => "mruby-objectspace"
|
||||||
|
conf.gem :core => "mruby-fiber"
|
||||||
|
conf.gem :core => "mruby-enumerator"
|
||||||
|
conf.gem :core => "mruby-enum-lazy"
|
||||||
|
conf.gem :core => "mruby-toplevel-ext"
|
||||||
|
conf.gem :core => "mruby-kernel-ext"
|
||||||
|
conf.gem :core => "mruby-class-ext"
|
||||||
|
conf.gem :core => "mruby-compiler"
|
||||||
|
end
|
||||||
+79
-13
@@ -36,19 +36,26 @@
|
|||||||
/* size of the method cache (need to be the power of 2) */
|
/* size of the method cache (need to be the power of 2) */
|
||||||
//#define MRB_METHOD_CACHE_SIZE (1<<7)
|
//#define MRB_METHOD_CACHE_SIZE (1<<7)
|
||||||
|
|
||||||
/* add -DMRB_METHOD_TABLE_INLINE to reduce the size of method table */
|
/* add -DMRB_METHOD_T_STRUCT on machines that use higher bits of pointers */
|
||||||
/* MRB_METHOD_TABLE_INLINE requires LSB of function pointers to be zero */
|
/* no MRB_METHOD_T_STRUCT requires highest 2 bits of function pointers to be zero */
|
||||||
/* you might need to specify --falign-functions=n (where n>1) */
|
#ifndef MRB_METHOD_T_STRUCT
|
||||||
//#define MRB_METHOD_TABLE_INLINE
|
// can't use highest 2 bits of function pointers at least on 32bit
|
||||||
|
// Windows and 32bit Linux.
|
||||||
|
# ifdef MRB_32BIT
|
||||||
|
# define MRB_METHOD_T_STRUCT
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */
|
/* add -DMRB_INT32 to use 32bit integer for mrb_int; conflict with MRB_INT64;
|
||||||
//#define MRB_INT16
|
Default for 32-bit CPU mode. */
|
||||||
|
//#define MRB_INT32
|
||||||
|
|
||||||
/* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT16 */
|
/* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT32;
|
||||||
|
Default for 64-bit CPU mode. */
|
||||||
//#define MRB_INT64
|
//#define MRB_INT64
|
||||||
|
|
||||||
/* if no specific integer type is chosen */
|
/* if no specific integer type is chosen */
|
||||||
#if !defined(MRB_INT16) && !defined(MRB_INT32) && !defined(MRB_INT64)
|
#if !defined(MRB_INT32) && !defined(MRB_INT64)
|
||||||
# if defined(MRB_64BIT) && !defined(MRB_NAN_BOXING)
|
# if defined(MRB_64BIT) && !defined(MRB_NAN_BOXING)
|
||||||
/* Use 64bit integers on 64bit architecture (without MRB_NAN_BOXING) */
|
/* Use 64bit integers on 64bit architecture (without MRB_NAN_BOXING) */
|
||||||
# define MRB_INT64
|
# define MRB_INT64
|
||||||
@@ -81,12 +88,13 @@
|
|||||||
/* number of object per heap page */
|
/* number of object per heap page */
|
||||||
//#define MRB_HEAP_PAGE_SIZE 1024
|
//#define MRB_HEAP_PAGE_SIZE 1024
|
||||||
|
|
||||||
/* if _etext and _edata available, mruby can reduce memory used by symbols */
|
/* if __ehdr_start is available, mruby can reduce memory used by symbols */
|
||||||
//#define MRB_USE_ETEXT_EDATA
|
//#define MRB_USE_LINK_TIME_RO_DATA_P
|
||||||
|
|
||||||
/* do not use __init_array_start to determine readonly data section;
|
/* if MRB_USE_LINK_TIME_RO_DATA_P does not work,
|
||||||
effective only when MRB_USE_ETEXT_EDATA is defined */
|
you can try mrb_ro_data_p() that you have implemented yourself in any file;
|
||||||
//#define MRB_NO_INIT_ARRAY_START
|
prototype is `mrb_bool mrb_ro_data_p(const char *ptr)` */
|
||||||
|
//#define MRB_USE_CUSTOM_RO_DATA_P
|
||||||
|
|
||||||
/* turn off generational GC by default */
|
/* turn off generational GC by default */
|
||||||
//#define MRB_GC_TURN_OFF_GENERATIONAL
|
//#define MRB_GC_TURN_OFF_GENERATIONAL
|
||||||
@@ -146,4 +154,62 @@
|
|||||||
# define TRUE 1
|
# define TRUE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** mruby tuning profiles
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* A profile for micro controllers */
|
||||||
|
#if defined(MRB_CONSTRAINED_BASELINE_PROFILE)
|
||||||
|
# ifndef KHASH_DEFAULT_SIZE
|
||||||
|
# define KHASH_DEFAULT_SIZE 16
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_STR_BUF_MIN_SIZE
|
||||||
|
# define MRB_STR_BUF_MIN_SIZE 32
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_HEAP_PAGE_SIZE
|
||||||
|
# define MRB_HEAP_PAGE_SIZE 256
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* A profile for default mruby */
|
||||||
|
#elif defined(MRB_BASELINE_PROFILE)
|
||||||
|
|
||||||
|
/* A profile for desktop computers or workstations; rich memory! */
|
||||||
|
#elif defined(MRB_MAIN_PROFILE)
|
||||||
|
# ifndef MRB_METHOD_CACHE
|
||||||
|
# define MRB_METHOD_CACHE
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_METHOD_CACHE_SIZE
|
||||||
|
# define MRB_METHOD_CACHE_SIZE (1<<10)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_IV_SEGMENT_SIZE
|
||||||
|
# define MRB_IV_SEGMENT_SIZE 32
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_HEAP_PAGE_SIZE
|
||||||
|
# define MRB_HEAP_PAGE_SIZE 4096
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* A profile for server; mruby vm is long life */
|
||||||
|
#elif defined(MRB_HIGH_PROFILE)
|
||||||
|
# ifndef MRB_METHOD_CACHE
|
||||||
|
# define MRB_METHOD_CACHE
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_METHOD_CACHE_SIZE
|
||||||
|
# define MRB_METHOD_CACHE_SIZE (1<<12)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_IV_SEGMENT_SIZE
|
||||||
|
# define MRB_IV_SEGMENT_SIZE 64
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef MRB_HEAP_PAGE_SIZE
|
||||||
|
# define MRB_HEAP_PAGE_SIZE 4096
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* MRUBYCONF_H */
|
#endif /* MRUBYCONF_H */
|
||||||
|
|||||||
+265
-153
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
** mruby - An embeddable Ruby implementation
|
** mruby - An embeddable Ruby implementation
|
||||||
**
|
**
|
||||||
** Copyright (c) mruby developers 2010-2019
|
** Copyright (c) mruby developers 2010-2020
|
||||||
**
|
**
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining
|
** Permission is hereby granted, free of charge, to any person obtaining
|
||||||
** a copy of this software and associated documentation files (the
|
** a copy of this software and associated documentation files (the
|
||||||
@@ -25,6 +25,10 @@
|
|||||||
** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
|
** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file mruby.h
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef MRUBY_H
|
#ifndef MRUBY_H
|
||||||
#define MRUBY_H
|
#define MRUBY_H
|
||||||
|
|
||||||
@@ -66,7 +70,13 @@
|
|||||||
|
|
||||||
#include "mrbconf.h"
|
#include "mrbconf.h"
|
||||||
|
|
||||||
|
#include <mruby/common.h>
|
||||||
|
#include <mruby/value.h>
|
||||||
|
#include <mruby/gc.h>
|
||||||
|
#include <mruby/version.h>
|
||||||
|
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
|
#include <float.h>
|
||||||
#ifndef FLT_EPSILON
|
#ifndef FLT_EPSILON
|
||||||
#define FLT_EPSILON (1.19209290e-07f)
|
#define FLT_EPSILON (1.19209290e-07f)
|
||||||
#endif
|
#endif
|
||||||
@@ -84,11 +94,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "mruby/common.h"
|
|
||||||
#include <mruby/value.h>
|
|
||||||
#include <mruby/gc.h>
|
|
||||||
#include <mruby/version.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MRuby C API entry point
|
* MRuby C API entry point
|
||||||
*/
|
*/
|
||||||
@@ -97,11 +102,14 @@ MRB_BEGIN_DECL
|
|||||||
typedef uint8_t mrb_code;
|
typedef uint8_t mrb_code;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required arguments signature type.
|
* \class mrb_aspec
|
||||||
|
*
|
||||||
|
* Specifies the number of arguments a function takes
|
||||||
|
*
|
||||||
|
* Example: `MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1)` for a method that expects 2..3 arguments
|
||||||
*/
|
*/
|
||||||
typedef uint32_t mrb_aspec;
|
typedef uint32_t mrb_aspec;
|
||||||
|
|
||||||
|
|
||||||
struct mrb_irep;
|
struct mrb_irep;
|
||||||
struct mrb_state;
|
struct mrb_state;
|
||||||
|
|
||||||
@@ -127,8 +135,8 @@ typedef struct {
|
|||||||
uint16_t ridx;
|
uint16_t ridx;
|
||||||
uint16_t epos;
|
uint16_t epos;
|
||||||
struct REnv *env;
|
struct REnv *env;
|
||||||
mrb_code *pc; /* return address */
|
const mrb_code *pc; /* return address */
|
||||||
mrb_code *err; /* error position */
|
const mrb_code *err; /* error position */
|
||||||
int argc;
|
int argc;
|
||||||
int acc;
|
int acc;
|
||||||
struct RClass *target_class;
|
struct RClass *target_class;
|
||||||
@@ -157,8 +165,8 @@ struct mrb_context {
|
|||||||
struct RProc **ensure; /* ensure handler stack */
|
struct RProc **ensure; /* ensure handler stack */
|
||||||
uint16_t esize, eidx;
|
uint16_t esize, eidx;
|
||||||
|
|
||||||
enum mrb_fiber_state status;
|
enum mrb_fiber_state status : 4;
|
||||||
mrb_bool vmexec;
|
mrb_bool vmexec : 1;
|
||||||
struct RFiber *fib;
|
struct RFiber *fib;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -170,13 +178,22 @@ struct mrb_context {
|
|||||||
# define MRB_METHOD_CACHE_SIZE (1<<7)
|
# define MRB_METHOD_CACHE_SIZE (1<<7)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef mrb_value (*mrb_func_t)(struct mrb_state *mrb, mrb_value);
|
/**
|
||||||
|
* Function pointer type for a function callable by mruby.
|
||||||
|
*
|
||||||
|
* The arguments to the function are stored on the mrb_state. To get them see mrb_get_args
|
||||||
|
*
|
||||||
|
* @param mrb The mruby state
|
||||||
|
* @param self The self object
|
||||||
|
* @return [mrb_value] The function's return value
|
||||||
|
*/
|
||||||
|
typedef mrb_value (*mrb_func_t)(struct mrb_state *mrb, mrb_value self);
|
||||||
|
|
||||||
#ifdef MRB_METHOD_TABLE_INLINE
|
#ifndef MRB_METHOD_T_STRUCT
|
||||||
typedef uintptr_t mrb_method_t;
|
typedef uintptr_t mrb_method_t;
|
||||||
#else
|
#else
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mrb_bool func_p;
|
uint8_t flags;
|
||||||
union {
|
union {
|
||||||
struct RProc *proc;
|
struct RProc *proc;
|
||||||
mrb_func_t func;
|
mrb_func_t func;
|
||||||
@@ -196,13 +213,9 @@ struct mrb_jmpbuf;
|
|||||||
|
|
||||||
typedef void (*mrb_atexit_func)(struct mrb_state*);
|
typedef void (*mrb_atexit_func)(struct mrb_state*);
|
||||||
|
|
||||||
#define MRB_STATE_NO_REGEXP 1
|
|
||||||
#define MRB_STATE_REGEXP 2
|
|
||||||
|
|
||||||
typedef struct mrb_state {
|
typedef struct mrb_state {
|
||||||
struct mrb_jmpbuf *jmp;
|
struct mrb_jmpbuf *jmp;
|
||||||
|
|
||||||
uint32_t flags;
|
|
||||||
mrb_allocf allocf; /* memory allocation function */
|
mrb_allocf allocf; /* memory allocation function */
|
||||||
void *allocf_ud; /* auxiliary data of allocf */
|
void *allocf_ud; /* auxiliary data of allocf */
|
||||||
|
|
||||||
@@ -232,7 +245,6 @@ typedef struct mrb_state {
|
|||||||
struct RClass *symbol_class;
|
struct RClass *symbol_class;
|
||||||
struct RClass *kernel_module;
|
struct RClass *kernel_module;
|
||||||
|
|
||||||
struct alloca_header *mems;
|
|
||||||
mrb_gc gc;
|
mrb_gc gc;
|
||||||
|
|
||||||
#ifdef MRB_METHOD_CACHE
|
#ifdef MRB_METHOD_CACHE
|
||||||
@@ -248,8 +260,8 @@ typedef struct mrb_state {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MRB_ENABLE_DEBUG_HOOK
|
#ifdef MRB_ENABLE_DEBUG_HOOK
|
||||||
void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
|
void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, const mrb_code *pc, mrb_value *regs);
|
||||||
void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
|
void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, const mrb_code *pc, mrb_value *regs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MRB_BYTECODE_DECODE_OPTION
|
#ifdef MRB_BYTECODE_DECODE_OPTION
|
||||||
@@ -290,9 +302,9 @@ typedef struct mrb_state {
|
|||||||
* //free(TheAnimals);
|
* //free(TheAnimals);
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state *] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char *] name The name of the defined class.
|
* @param name The name of the defined class.
|
||||||
* @param [struct RClass *] super The new class parent.
|
* @param super The new class parent.
|
||||||
* @return [struct RClass *] Reference to the newly defined class.
|
* @return [struct RClass *] Reference to the newly defined class.
|
||||||
* @see mrb_define_class_under
|
* @see mrb_define_class_under
|
||||||
*/
|
*/
|
||||||
@@ -301,12 +313,14 @@ MRB_API struct RClass *mrb_define_class(mrb_state *mrb, const char *name, struct
|
|||||||
/**
|
/**
|
||||||
* Defines a new module.
|
* Defines a new module.
|
||||||
*
|
*
|
||||||
* @param [mrb_state *] mrb_state* The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char *] char* The name of the module.
|
* @param name The name of the module.
|
||||||
* @return [struct RClass *] Reference to the newly defined module.
|
* @return [struct RClass *] Reference to the newly defined module.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass *mrb_define_module(mrb_state *, const char*);
|
MRB_API struct RClass *mrb_define_module(mrb_state *mrb, const char *name);
|
||||||
MRB_API mrb_value mrb_singleton_class(mrb_state*, mrb_value);
|
|
||||||
|
MRB_API mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value val);
|
||||||
|
MRB_API struct RClass *mrb_singleton_class_ptr(mrb_state *mrb, mrb_value val);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Include a module in another class or module.
|
* Include a module in another class or module.
|
||||||
@@ -315,11 +329,11 @@ MRB_API mrb_value mrb_singleton_class(mrb_state*, mrb_value);
|
|||||||
* module B
|
* module B
|
||||||
* include A
|
* include A
|
||||||
* end
|
* end
|
||||||
* @param [mrb_state *] mrb_state* The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] RClass* A reference to module or a class.
|
* @param cla A reference to module or a class.
|
||||||
* @param [struct RClass *] RClass* A reference to the module to be included.
|
* @param included A reference to the module to be included.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_include_module(mrb_state*, struct RClass*, struct RClass*);
|
MRB_API void mrb_include_module(mrb_state *mrb, struct RClass *cla, struct RClass *included);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepends a module in another class or module.
|
* Prepends a module in another class or module.
|
||||||
@@ -328,11 +342,11 @@ MRB_API void mrb_include_module(mrb_state*, struct RClass*, struct RClass*);
|
|||||||
* module B
|
* module B
|
||||||
* prepend A
|
* prepend A
|
||||||
* end
|
* end
|
||||||
* @param [mrb_state *] mrb_state* The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] RClass* A reference to module or a class.
|
* @param cla A reference to module or a class.
|
||||||
* @param [struct RClass *] RClass* A reference to the module to be prepended.
|
* @param prepended A reference to the module to be prepended.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_prepend_module(mrb_state*, struct RClass*, struct RClass*);
|
MRB_API void mrb_prepend_module(mrb_state *mrb, struct RClass *cla, struct RClass *prepended);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a global function in ruby.
|
* Defines a global function in ruby.
|
||||||
@@ -341,7 +355,6 @@ MRB_API void mrb_prepend_module(mrb_state*, struct RClass*, struct RClass*);
|
|||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
*
|
*
|
||||||
* !!!c
|
|
||||||
* mrb_value example_method(mrb_state* mrb, mrb_value self)
|
* mrb_value example_method(mrb_state* mrb, mrb_value self)
|
||||||
* {
|
* {
|
||||||
* puts("Executing example command!");
|
* puts("Executing example command!");
|
||||||
@@ -353,11 +366,11 @@ MRB_API void mrb_prepend_module(mrb_state*, struct RClass*, struct RClass*);
|
|||||||
* mrb_define_method(mrb, mrb->kernel_module, "example_method", example_method, MRB_ARGS_NONE());
|
* mrb_define_method(mrb, mrb->kernel_module, "example_method", example_method, MRB_ARGS_NONE());
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state *] mrb The MRuby state reference.
|
* @param mrb The MRuby state reference.
|
||||||
* @param [struct RClass *] cla The class pointer where the method will be defined.
|
* @param cla The class pointer where the method will be defined.
|
||||||
* @param [const char *] name The name of the method being defined.
|
* @param name The name of the method being defined.
|
||||||
* @param [mrb_func_t] func The function pointer to the method definition.
|
* @param func The function pointer to the method definition.
|
||||||
* @param [mrb_aspec] aspec The method parameters declaration.
|
* @param aspec The method parameters declaration.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec);
|
MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec);
|
||||||
|
|
||||||
@@ -380,14 +393,20 @@ MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *n
|
|||||||
* foo = mrb_define_class(mrb, "Foo", mrb->object_class);
|
* foo = mrb_define_class(mrb, "Foo", mrb->object_class);
|
||||||
* mrb_define_class_method(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
|
* mrb_define_class_method(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state *] mrb_state* The MRuby state reference.
|
* @param mrb The MRuby state reference.
|
||||||
* @param [struct RClass *] RClass* The class where the class method will be defined.
|
* @param cla The class where the class method will be defined.
|
||||||
* @param [const char *] char* The name of the class method being defined.
|
* @param name The name of the class method being defined.
|
||||||
* @param [mrb_func_t] mrb_func_t The function pointer to the class method definition.
|
* @param fun The function pointer to the class method definition.
|
||||||
* @param [mrb_aspec] mrb_aspec The method parameters declaration.
|
* @param aspec The method parameters declaration.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec);
|
MRB_API void mrb_define_class_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec);
|
||||||
MRB_API void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec);
|
|
||||||
|
/**
|
||||||
|
* Defines a singleton method
|
||||||
|
*
|
||||||
|
* @see mrb_define_class_method
|
||||||
|
*/
|
||||||
|
MRB_API void mrb_define_singleton_method(mrb_state *mrb, struct RObject *cla, const char *name, mrb_func_t fun, mrb_aspec aspec);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a module function.
|
* Defines a module function.
|
||||||
@@ -408,13 +427,13 @@ MRB_API void mrb_define_singleton_method(mrb_state*, struct RObject*, const char
|
|||||||
* foo = mrb_define_module(mrb, "Foo");
|
* foo = mrb_define_module(mrb, "Foo");
|
||||||
* mrb_define_module_function(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
|
* mrb_define_module_function(mrb, foo, "bar", bar_method, MRB_ARGS_NONE());
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state *] mrb_state* The MRuby state reference.
|
* @param mrb The MRuby state reference.
|
||||||
* @param [struct RClass *] RClass* The module where the module function will be defined.
|
* @param cla The module where the module function will be defined.
|
||||||
* @param [const char *] char* The name of the module function being defined.
|
* @param name The name of the module function being defined.
|
||||||
* @param [mrb_func_t] mrb_func_t The function pointer to the module function definition.
|
* @param fun The function pointer to the module function definition.
|
||||||
* @param [mrb_aspec] mrb_aspec The method parameters declaration.
|
* @param aspec The method parameters declaration.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
|
MRB_API void mrb_define_module_function(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a constant.
|
* Defines a constant.
|
||||||
@@ -437,12 +456,12 @@ MRB_API void mrb_define_module_function(mrb_state*, struct RClass*, const char*,
|
|||||||
* mrb_value
|
* mrb_value
|
||||||
* mrb_example_gem_final(mrb_state* mrb){
|
* mrb_example_gem_final(mrb_state* mrb){
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state *] mrb_state* The MRuby state reference.
|
* @param mrb The MRuby state reference.
|
||||||
* @param [struct RClass *] RClass* A class or module the constant is defined in.
|
* @param cla A class or module the constant is defined in.
|
||||||
* @param [const char *] name The name of the constant being defined.
|
* @param name The name of the constant being defined.
|
||||||
* @param [mrb_value] mrb_value The value for the constant.
|
* @param val The value for the constant.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value);
|
MRB_API void mrb_define_const(mrb_state* mrb, struct RClass* cla, const char *name, mrb_value val);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undefines a method.
|
* Undefines a method.
|
||||||
@@ -488,11 +507,11 @@ MRB_API void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_
|
|||||||
*
|
*
|
||||||
* mrb_example_gem_final(mrb_state* mrb){
|
* mrb_example_gem_final(mrb_state* mrb){
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state*] mrb_state* The mruby state reference.
|
* @param mrb The mruby state reference.
|
||||||
* @param [struct RClass*] RClass* A class the method will be undefined from.
|
* @param cla The class the method will be undefined from.
|
||||||
* @param [const char*] const char* The name of the method to be undefined.
|
* @param name The name of the method to be undefined.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_undef_method(mrb_state*, struct RClass*, const char*);
|
MRB_API void mrb_undef_method(mrb_state *mrb, struct RClass *cla, const char *name);
|
||||||
MRB_API void mrb_undef_method_id(mrb_state*, struct RClass*, mrb_sym);
|
MRB_API void mrb_undef_method_id(mrb_state*, struct RClass*, mrb_sym);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -528,11 +547,11 @@ MRB_API void mrb_undef_method_id(mrb_state*, struct RClass*, mrb_sym);
|
|||||||
* void
|
* void
|
||||||
* mrb_example_gem_final(mrb_state* mrb){
|
* mrb_example_gem_final(mrb_state* mrb){
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state*] mrb_state* The mruby state reference.
|
* @param mrb The mruby state reference.
|
||||||
* @param [RClass*] RClass* A class the class method will be undefined from.
|
* @param cls A class the class method will be undefined from.
|
||||||
* @param [const char*] const char* The name of the class method to be undefined.
|
* @param name The name of the class method to be undefined.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_undef_class_method(mrb_state*, struct RClass*, const char*);
|
MRB_API void mrb_undef_class_method(mrb_state *mrb, struct RClass *cls, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a new object instance of c class.
|
* Initialize a new object instance of c class.
|
||||||
@@ -556,10 +575,10 @@ MRB_API void mrb_undef_class_method(mrb_state*, struct RClass*, const char*);
|
|||||||
* obj = mrb_obj_new(mrb, example_class, 0, NULL); # => ExampleClass.new
|
* obj = mrb_obj_new(mrb, example_class, 0, NULL); # => ExampleClass.new
|
||||||
* mrb_p(mrb, obj); // => Kernel#p
|
* mrb_p(mrb, obj); // => Kernel#p
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [RClass*] c Reference to the class of the new object.
|
* @param c Reference to the class of the new object.
|
||||||
* @param [mrb_int] argc Number of arguments in argv
|
* @param argc Number of arguments in argv
|
||||||
* @param [const mrb_value *] argv Array of mrb_value to initialize the object
|
* @param argv Array of mrb_value to initialize the object
|
||||||
* @return [mrb_value] The newly initialized object
|
* @return [mrb_value] The newly initialized object
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv);
|
MRB_API mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv);
|
||||||
@@ -570,8 +589,6 @@ MRB_INLINE mrb_value mrb_class_new_instance(mrb_state *mrb, mrb_int argc, const
|
|||||||
return mrb_obj_new(mrb,c,argc,argv);
|
return mrb_obj_new(mrb,c,argc,argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
MRB_API mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance of Class, Class.
|
* Creates a new instance of Class, Class.
|
||||||
*
|
*
|
||||||
@@ -587,8 +604,8 @@ MRB_API mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);
|
|||||||
* mrb_p(mrb, obj); // => Kernel#p
|
* mrb_p(mrb, obj); // => Kernel#p
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] super The super class or parent.
|
* @param super The super class or parent.
|
||||||
* @return [struct RClass *] Reference to the new class.
|
* @return [struct RClass *] Reference to the new class.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
|
MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
|
||||||
@@ -604,7 +621,7 @@ MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
|
|||||||
* example_module = mrb_module_new(mrb);
|
* example_module = mrb_module_new(mrb);
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @return [struct RClass *] Reference to the new module.
|
* @return [struct RClass *] Reference to the new module.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
|
MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
|
||||||
@@ -631,24 +648,24 @@ MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
|
|||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char *] name A string representing the name of the class.
|
* @param name A string representing the name of the class.
|
||||||
* @return [mrb_bool] A boolean value.
|
* @return [mrb_bool] A boolean value.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
|
MRB_API mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a class.
|
* Gets a class.
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char *] name The name of the class.
|
* @param name The name of the class.
|
||||||
* @return [struct RClass *] A reference to the class.
|
* @return [struct RClass *] A reference to the class.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
|
MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a exception class.
|
* Gets a exception class.
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char *] name The name of the class.
|
* @param name The name of the class.
|
||||||
* @return [struct RClass *] A reference to the class.
|
* @return [struct RClass *] A reference to the class.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_exc_get(mrb_state *mrb, const char *name);
|
MRB_API struct RClass * mrb_exc_get(mrb_state *mrb, const char *name);
|
||||||
@@ -677,35 +694,35 @@ MRB_API struct RClass * mrb_exc_get(mrb_state *mrb, const char *name);
|
|||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] outer The name of the outer class.
|
* @param outer The name of the outer class.
|
||||||
* @param [const char *] name A string representing the name of the inner class.
|
* @param name A string representing the name of the inner class.
|
||||||
* @return [mrb_bool] A boolean value.
|
* @return [mrb_bool] A boolean value.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_bool mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
MRB_API mrb_bool mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a child class.
|
* Gets a child class.
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] outer The name of the parent class.
|
* @param outer The name of the parent class.
|
||||||
* @param [const char *] name The name of the class.
|
* @param name The name of the class.
|
||||||
* @return [struct RClass *] A reference to the class.
|
* @return [struct RClass *] A reference to the class.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
MRB_API struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a module.
|
* Gets a module.
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char *] name The name of the module.
|
* @param name The name of the module.
|
||||||
* @return [struct RClass *] A reference to the module.
|
* @return [struct RClass *] A reference to the module.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
|
MRB_API struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a module defined under another module.
|
* Gets a module defined under another module.
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] outer The name of the outer module.
|
* @param outer The name of the outer module.
|
||||||
* @param [const char *] name The name of the module.
|
* @param name The name of the module.
|
||||||
* @return [struct RClass *] A reference to the module.
|
* @return [struct RClass *] A reference to the module.
|
||||||
*/
|
*/
|
||||||
MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
|
||||||
@@ -719,8 +736,8 @@ MRB_API mrb_value mrb_notimplement_m(mrb_state*, mrb_value);
|
|||||||
*
|
*
|
||||||
* Equivalent to:
|
* Equivalent to:
|
||||||
* Object#dup
|
* Object#dup
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] obj Object to be duplicate.
|
* @param obj Object to be duplicate.
|
||||||
* @return [mrb_value] The newly duplicated object.
|
* @return [mrb_value] The newly duplicated object.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
|
MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
|
||||||
@@ -760,9 +777,9 @@ MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
|
|||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] c A reference to a class.
|
* @param c A reference to a class.
|
||||||
* @param [mrb_sym] mid A symbol referencing a method id.
|
* @param mid A symbol referencing a method id.
|
||||||
* @return [mrb_bool] A boolean value.
|
* @return [mrb_bool] A boolean value.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid);
|
MRB_API mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid);
|
||||||
@@ -770,10 +787,10 @@ MRB_API mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mi
|
|||||||
/**
|
/**
|
||||||
* Defines a new class under a given module
|
* Defines a new class under a given module
|
||||||
*
|
*
|
||||||
* @param [mrb_state*] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [struct RClass *] outer Reference to the module under which the new class will be defined
|
* @param outer Reference to the module under which the new class will be defined
|
||||||
* @param [const char *] name The name of the defined class
|
* @param name The name of the defined class
|
||||||
* @param [struct RClass *] super The new class parent
|
* @param super The new class parent
|
||||||
* @return [struct RClass *] Reference to the newly defined class
|
* @return [struct RClass *] Reference to the newly defined class
|
||||||
* @see mrb_define_class
|
* @see mrb_define_class
|
||||||
*/
|
*/
|
||||||
@@ -843,34 +860,93 @@ MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *o
|
|||||||
* | `S` | {String} | {mrb_value} | when `!` follows, the value may be `nil` |
|
* | `S` | {String} | {mrb_value} | when `!` follows, the value may be `nil` |
|
||||||
* | `A` | {Array} | {mrb_value} | when `!` follows, the value may be `nil` |
|
* | `A` | {Array} | {mrb_value} | when `!` follows, the value may be `nil` |
|
||||||
* | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` |
|
* | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` |
|
||||||
* | `s` | {String} | char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` |
|
* | `s` | {String} | char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` |
|
||||||
* | `z` | {String} | char * | `NULL` terminated string; `z!` gives `NULL` for `nil` |
|
* | `z` | {String} | char * | `NULL` terminated string; `z!` gives `NULL` for `nil` |
|
||||||
* | `a` | {Array} | {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` |
|
* | `a` | {Array} | {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` |
|
||||||
* | `f` | {Float} | {mrb_float} | |
|
* | `f` | {Fixnum}/{Float} | {mrb_float} | |
|
||||||
* | `i` | {Integer} | {mrb_int} | |
|
* | `i` | {Fixnum}/{Float} | {mrb_int} | |
|
||||||
* | `b` | boolean | {mrb_bool} | |
|
* | `b` | boolean | {mrb_bool} | |
|
||||||
* | `n` | {Symbol} | {mrb_sym} | |
|
* | `n` | {String}/{Symbol} | {mrb_sym} | |
|
||||||
|
* | `d` | data | void *, {mrb_data_type} const | 2nd argument will be used to check data type so it won't be modified; when `!` follows, the value may be `nil` |
|
||||||
|
* | `I` | inline struct | void * | |
|
||||||
* | `&` | block | {mrb_value} | &! raises exception if no block given. |
|
* | `&` | block | {mrb_value} | &! raises exception if no block given. |
|
||||||
* | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; *! avoid copy of the stack. |
|
* | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. |
|
||||||
* | | | optional | | After this spec following specs would be optional. |
|
* | <code>\|</code> | optional | | After this spec following specs would be optional. |
|
||||||
* | `?` | optional given | {mrb_bool} | `TRUE` if preceding argument is given. Used to check optional argument is given. |
|
* | `?` | optional given | {mrb_bool} | `TRUE` if preceding argument is given. Used to check optional argument is given. |
|
||||||
|
* | `:` | keyword args | {mrb_kwargs} const | Get keyword arguments. @see mrb_kwargs |
|
||||||
*
|
*
|
||||||
* @see mrb_get_args
|
* @see mrb_get_args
|
||||||
*/
|
*/
|
||||||
typedef const char *mrb_args_format;
|
typedef const char *mrb_args_format;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get keyword arguments by `mrb_get_args()` with `:` specifier.
|
||||||
|
*
|
||||||
|
* `mrb_kwargs::num` indicates that the number of keyword values.
|
||||||
|
*
|
||||||
|
* `mrb_kwargs::values` is an object array, and the keyword argument corresponding to the string array is assigned.
|
||||||
|
* Note that `undef` is assigned if there is no keyword argument corresponding to `mrb_kwargs::optional`.
|
||||||
|
*
|
||||||
|
* `mrb_kwargs::table` accepts a string array.
|
||||||
|
*
|
||||||
|
* `mrb_kwargs::required` indicates that the specified number of keywords starting from the beginning of the string array are required.
|
||||||
|
*
|
||||||
|
* `mrb_kwargs::rest` is the remaining keyword argument that can be accepted as `**rest` in Ruby.
|
||||||
|
* If `NULL` is specified, `ArgumentError` is raised when there is an undefined keyword.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* // def method(a: 1, b: 2)
|
||||||
|
*
|
||||||
|
* uint32_t kw_num = 2;
|
||||||
|
* const char *kw_names[kw_num] = { "a", "b" };
|
||||||
|
* uint32_t kw_required = 0;
|
||||||
|
* mrb_value kw_values[kw_num];
|
||||||
|
* const mrb_kwargs kwargs = { kw_num, kw_values, kw_names, kw_required, NULL };
|
||||||
|
*
|
||||||
|
* mrb_get_args(mrb, ":", &kwargs);
|
||||||
|
* if (mrb_undef_p(kw_values[0])) { kw_values[0] = mrb_fixnum_value(1); }
|
||||||
|
* if (mrb_undef_p(kw_values[1])) { kw_values[1] = mrb_fixnum_value(2); }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* // def method(str, x:, y: 2, z: "default string", **opts)
|
||||||
|
*
|
||||||
|
* mrb_value str, kw_rest;
|
||||||
|
* uint32_t kw_num = 3;
|
||||||
|
* const char *kw_names[kw_num] = { "x", "y", "z" };
|
||||||
|
* uint32_t kw_required = 1;
|
||||||
|
* mrb_value kw_values[kw_num];
|
||||||
|
* const mrb_kwargs kwargs = { kw_num, kw_values, kw_names, kw_required, &kw_rest };
|
||||||
|
*
|
||||||
|
* mrb_get_args(mrb, "S:", &str, &kwargs);
|
||||||
|
* // or: mrb_get_args(mrb, ":S", &kwargs, &str);
|
||||||
|
* if (mrb_undef_p(kw_values[1])) { kw_values[1] = mrb_fixnum_value(2); }
|
||||||
|
* if (mrb_undef_p(kw_values[2])) { kw_values[2] = mrb_str_new_cstr(mrb, "default string"); }
|
||||||
|
*/
|
||||||
|
typedef struct mrb_kwargs mrb_kwargs;
|
||||||
|
|
||||||
|
struct mrb_kwargs
|
||||||
|
{
|
||||||
|
uint32_t num;
|
||||||
|
mrb_value *values;
|
||||||
|
const char *const *table;
|
||||||
|
uint32_t required;
|
||||||
|
mrb_value *rest;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve arguments from mrb_state.
|
* Retrieve arguments from mrb_state.
|
||||||
*
|
*
|
||||||
* @param mrb The current MRuby state.
|
* @param mrb The current MRuby state.
|
||||||
* @param format [mrb_args_format] is a list of format specifiers
|
* @param format is a list of format specifiers
|
||||||
* @param ... The passing variadic arguments must be a pointer of retrieving type.
|
* @param ... The passing variadic arguments must be a pointer of retrieving type.
|
||||||
* @return the number of arguments retrieved.
|
* @return the number of arguments retrieved.
|
||||||
* @see mrb_args_format
|
* @see mrb_args_format
|
||||||
|
* @see mrb_kwargs
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format, ...);
|
MRB_API mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format, ...);
|
||||||
|
|
||||||
static inline mrb_sym
|
MRB_INLINE mrb_sym
|
||||||
mrb_get_mid(mrb_state *mrb) /* get method symbol */
|
mrb_get_mid(mrb_state *mrb) /* get method symbol */
|
||||||
{
|
{
|
||||||
return mrb->c->ci->mid;
|
return mrb->c->ci->mid;
|
||||||
@@ -883,8 +959,21 @@ mrb_get_mid(mrb_state *mrb) /* get method symbol */
|
|||||||
*/
|
*/
|
||||||
MRB_API mrb_int mrb_get_argc(mrb_state *mrb);
|
MRB_API mrb_int mrb_get_argc(mrb_state *mrb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve an array of arguments from mrb_state.
|
||||||
|
*
|
||||||
|
* Correctly handles *splat arguments.
|
||||||
|
*/
|
||||||
MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
|
MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the first and only argument from mrb_state.
|
||||||
|
* Raises ArgumentError unless the number of arguments is exactly one.
|
||||||
|
*
|
||||||
|
* Correctly handles *splat arguments.
|
||||||
|
*/
|
||||||
|
MRB_API mrb_value mrb_get_arg1(mrb_state *mrb);
|
||||||
|
|
||||||
/* `strlen` for character string literals (use with caution or `strlen` instead)
|
/* `strlen` for character string literals (use with caution or `strlen` instead)
|
||||||
Adjacent string literals are concatenated in C/C++ in translation phase 6.
|
Adjacent string literals are concatenated in C/C++ in translation phase 6.
|
||||||
If `lit` is not one, the compiler will report a syntax error:
|
If `lit` is not one, the compiler will report a syntax error:
|
||||||
@@ -896,6 +985,8 @@ MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
|
|||||||
/**
|
/**
|
||||||
* Call existing ruby functions.
|
* Call existing ruby functions.
|
||||||
*
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
* #include <stdio.h>
|
* #include <stdio.h>
|
||||||
* #include <mruby.h>
|
* #include <mruby.h>
|
||||||
* #include "mruby/compile.h"
|
* #include "mruby/compile.h"
|
||||||
@@ -912,15 +1003,16 @@ MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
|
|||||||
* mrb_funcall(mrb, obj, "method_name", 1, mrb_fixnum_value(i));
|
* mrb_funcall(mrb, obj, "method_name", 1, mrb_fixnum_value(i));
|
||||||
* fclose(fp);
|
* fclose(fp);
|
||||||
* mrb_close(mrb);
|
* mrb_close(mrb);
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state*] mrb_state* The current mruby state.
|
*
|
||||||
* @param [mrb_value] mrb_value A reference to an mruby value.
|
* @param mrb The current mruby state.
|
||||||
* @param [const char*] const char* The name of the method.
|
* @param val A reference to an mruby value.
|
||||||
* @param [mrb_int] mrb_int The number of arguments the method has.
|
* @param name The name of the method.
|
||||||
* @param [...] ... Variadic values(not type safe!).
|
* @param argc The number of arguments the method has.
|
||||||
* @return [mrb_value] mrb_value mruby function value.
|
* @param ... Variadic values(not type safe!).
|
||||||
|
* @return [mrb_value] mruby function value.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...);
|
MRB_API mrb_value mrb_funcall(mrb_state *mrb, mrb_value val, const char *name, mrb_int argc, ...);
|
||||||
/**
|
/**
|
||||||
* Call existing ruby functions. This is basically the type safe version of mrb_funcall.
|
* Call existing ruby functions. This is basically the type safe version of mrb_funcall.
|
||||||
*
|
*
|
||||||
@@ -942,32 +1034,35 @@ MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...);
|
|||||||
* fclose(fp);
|
* fclose(fp);
|
||||||
* mrb_close(mrb);
|
* mrb_close(mrb);
|
||||||
* }
|
* }
|
||||||
* @param [mrb_state*] mrb_state* The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] mrb_value A reference to an mruby value.
|
* @param val A reference to an mruby value.
|
||||||
* @param [mrb_sym] mrb_sym The symbol representing the method.
|
* @param name_sym The symbol representing the method.
|
||||||
* @param [mrb_int] mrb_int The number of arguments the method has.
|
* @param argc The number of arguments the method has.
|
||||||
* @param [const mrb_value*] mrb_value* Pointer to the object.
|
* @param obj Pointer to the object.
|
||||||
* @return [mrb_value] mrb_value mruby function value.
|
* @return [mrb_value] mrb_value mruby function value.
|
||||||
* @see mrb_funcall
|
* @see mrb_funcall
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*);
|
MRB_API mrb_value mrb_funcall_argv(mrb_state *mrb, mrb_value val, mrb_sym name, mrb_int argc, const mrb_value *argv);
|
||||||
/**
|
/**
|
||||||
* Call existing ruby functions with a block.
|
* Call existing ruby functions with a block.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*, mrb_value);
|
MRB_API mrb_value mrb_funcall_with_block(mrb_state *mrb, mrb_value val, mrb_sym name, mrb_int argc, const mrb_value *argv, mrb_value block);
|
||||||
/**
|
/**
|
||||||
* Create a symbol
|
* Create a symbol
|
||||||
*
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
* # Ruby style:
|
* # Ruby style:
|
||||||
* :pizza # => :pizza
|
* :pizza # => :pizza
|
||||||
*
|
*
|
||||||
* // C style:
|
* // C style:
|
||||||
* mrb_sym m_sym = mrb_intern_lit(mrb, "pizza"); // => :pizza
|
* mrb_sym m_sym = mrb_intern_lit(mrb, "pizza"); // => :pizza
|
||||||
* @param [mrb_state*] mrb_state* The current mruby state.
|
*
|
||||||
* @param [const char*] const char* The name of the method.
|
* @param mrb The current mruby state.
|
||||||
|
* @param str The string to be symbolized
|
||||||
* @return [mrb_sym] mrb_sym A symbol.
|
* @return [mrb_sym] mrb_sym A symbol.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_sym mrb_intern_cstr(mrb_state*,const char*);
|
MRB_API mrb_sym mrb_intern_cstr(mrb_state *mrb, const char* str);
|
||||||
MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
|
MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
|
||||||
MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
|
MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
|
||||||
#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
|
#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
|
||||||
@@ -975,9 +1070,13 @@ MRB_API mrb_sym mrb_intern_str(mrb_state*,mrb_value);
|
|||||||
MRB_API mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
|
MRB_API mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
|
||||||
MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
|
MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
|
||||||
MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value);
|
MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value);
|
||||||
MRB_API const char *mrb_sym2name(mrb_state*,mrb_sym);
|
MRB_API const char *mrb_sym_name(mrb_state*,mrb_sym);
|
||||||
MRB_API const char *mrb_sym2name_len(mrb_state*,mrb_sym,mrb_int*);
|
MRB_API const char *mrb_sym_name_len(mrb_state*,mrb_sym,mrb_int*);
|
||||||
MRB_API mrb_value mrb_sym2str(mrb_state*,mrb_sym);
|
MRB_API const char *mrb_sym_dump(mrb_state*,mrb_sym);
|
||||||
|
MRB_API mrb_value mrb_sym_str(mrb_state*,mrb_sym);
|
||||||
|
#define mrb_sym2name(mrb,sym) mrb_sym_name(mrb,sym)
|
||||||
|
#define mrb_sym2name_len(mrb,sym,len) mrb_sym_name_len(mrb,sym,len)
|
||||||
|
#define mrb_sym2str(mrb,sym) mrb_sym_str(mrb,sym)
|
||||||
|
|
||||||
MRB_API void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
|
MRB_API void *mrb_malloc(mrb_state*, size_t); /* raise RuntimeError if no mem */
|
||||||
MRB_API void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
|
MRB_API void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
|
||||||
@@ -996,6 +1095,12 @@ MRB_API mrb_value mrb_str_new_cstr(mrb_state*, const char*);
|
|||||||
MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
|
MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
|
||||||
#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
|
#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
|
||||||
|
|
||||||
|
MRB_API mrb_value mrb_obj_freeze(mrb_state*, mrb_value);
|
||||||
|
#define mrb_str_new_frozen(mrb,p,len) mrb_obj_freeze(mrb,mrb_str_new(mrb,p,len))
|
||||||
|
#define mrb_str_new_cstr_frozen(mrb,p) mrb_obj_freeze(mrb,mrb_str_new_cstr(mrb,p))
|
||||||
|
#define mrb_str_new_static_frozen(mrb,p,len) mrb_obj_freeze(mrb,mrb_str_new_static(mrb,p,len))
|
||||||
|
#define mrb_str_new_lit_frozen(mrb,lit) mrb_obj_freeze(mrb,mrb_str_new_lit(mrb,lit))
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
MRB_API char* mrb_utf8_from_locale(const char *p, int len);
|
MRB_API char* mrb_utf8_from_locale(const char *p, int len);
|
||||||
MRB_API char* mrb_locale_from_utf8(const char *p, int len);
|
MRB_API char* mrb_locale_from_utf8(const char *p, int len);
|
||||||
@@ -1058,11 +1163,10 @@ MRB_API void mrb_close(mrb_state *mrb);
|
|||||||
*/
|
*/
|
||||||
MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
|
MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
|
||||||
|
|
||||||
MRB_API mrb_value mrb_top_self(mrb_state *);
|
MRB_API mrb_value mrb_top_self(mrb_state *mrb);
|
||||||
MRB_API mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
|
MRB_API mrb_value mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep);
|
||||||
MRB_API mrb_value mrb_top_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
|
MRB_API mrb_value mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep);
|
||||||
MRB_API mrb_value mrb_vm_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
|
MRB_API mrb_value mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *iseq);
|
||||||
MRB_API mrb_value mrb_vm_exec(mrb_state*, struct RProc*, mrb_code*);
|
|
||||||
/* compatibility macros */
|
/* compatibility macros */
|
||||||
#define mrb_toplevel_run_keep(m,p,k) mrb_top_run((m),(p),mrb_top_self(m),(k))
|
#define mrb_toplevel_run_keep(m,p,k) mrb_top_run((m),(p),mrb_top_self(m),(k))
|
||||||
#define mrb_toplevel_run(m,p) mrb_toplevel_run_keep((m),(p),0)
|
#define mrb_toplevel_run(m,p) mrb_toplevel_run_keep((m),(p),0)
|
||||||
@@ -1072,8 +1176,8 @@ MRB_API void mrb_p(mrb_state*, mrb_value);
|
|||||||
MRB_API mrb_int mrb_obj_id(mrb_value obj);
|
MRB_API mrb_int mrb_obj_id(mrb_value obj);
|
||||||
MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
|
MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
|
||||||
|
|
||||||
MRB_API mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value);
|
MRB_API mrb_bool mrb_obj_eq(mrb_state *mrb, mrb_value a, mrb_value b);
|
||||||
MRB_API mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value);
|
MRB_API mrb_bool mrb_obj_equal(mrb_state *mrb, mrb_value a, mrb_value b);
|
||||||
MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
|
MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
|
||||||
MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base);
|
MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base);
|
||||||
MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
|
MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
|
||||||
@@ -1082,17 +1186,16 @@ MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val);
|
|||||||
#endif
|
#endif
|
||||||
MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
|
MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
|
||||||
MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
|
MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
|
||||||
|
/* mrb_cmp(mrb, obj1, obj2): 1:0:-1; -2 for error */
|
||||||
|
MRB_API mrb_int mrb_cmp(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
|
||||||
|
|
||||||
static inline int mrb_gc_arena_save(mrb_state*);
|
MRB_INLINE int
|
||||||
static inline void mrb_gc_arena_restore(mrb_state*,int);
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
mrb_gc_arena_save(mrb_state *mrb)
|
mrb_gc_arena_save(mrb_state *mrb)
|
||||||
{
|
{
|
||||||
return mrb->gc.arena_idx;
|
return mrb->gc.arena_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
MRB_INLINE void
|
||||||
mrb_gc_arena_restore(mrb_state *mrb, int idx)
|
mrb_gc_arena_restore(mrb_state *mrb, int idx)
|
||||||
{
|
{
|
||||||
mrb->gc.arena_idx = idx;
|
mrb->gc.arena_idx = idx;
|
||||||
@@ -1143,6 +1246,8 @@ MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc);
|
|||||||
MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
|
MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
|
||||||
MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
|
MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
|
||||||
MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
|
MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
|
||||||
|
MRB_API mrb_noreturn void mrb_frozen_error(mrb_state *mrb, void *frozen_obj);
|
||||||
|
MRB_API mrb_noreturn void mrb_argnum_error(mrb_state *mrb, mrb_int argc, int min, int max);
|
||||||
MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...);
|
MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...);
|
||||||
MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...);
|
MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...);
|
||||||
MRB_API void mrb_print_backtrace(mrb_state *mrb);
|
MRB_API void mrb_print_backtrace(mrb_state *mrb);
|
||||||
@@ -1193,9 +1298,15 @@ MRB_API void mrb_gc_unregister(mrb_state *mrb, mrb_value obj);
|
|||||||
|
|
||||||
MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
|
MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
|
||||||
#define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val))
|
#define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val))
|
||||||
|
/* string type checking (contrary to the name, it doesn't convert) */
|
||||||
MRB_API mrb_value mrb_to_str(mrb_state *mrb, mrb_value val);
|
MRB_API mrb_value mrb_to_str(mrb_state *mrb, mrb_value val);
|
||||||
MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
|
MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
|
||||||
|
|
||||||
|
MRB_INLINE void mrb_check_frozen(mrb_state *mrb, void *o)
|
||||||
|
{
|
||||||
|
if (mrb_frozen_p((struct RBasic*)o)) mrb_frozen_error(mrb, o);
|
||||||
|
}
|
||||||
|
|
||||||
typedef enum call_type {
|
typedef enum call_type {
|
||||||
CALL_PUBLIC,
|
CALL_PUBLIC,
|
||||||
CALL_FCALL,
|
CALL_FCALL,
|
||||||
@@ -1214,31 +1325,31 @@ MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RC
|
|||||||
MRB_API mrb_bool mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func);
|
MRB_API mrb_bool mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Resume a Fiber
|
* Resume a Fiber
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-fiber
|
* Implemented in mruby-fiber
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc, const mrb_value *argv);
|
MRB_API mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc, const mrb_value *argv);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Yield a Fiber
|
* Yield a Fiber
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-fiber
|
* Implemented in mruby-fiber
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
|
MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Check if a Fiber is alive
|
* Check if a Fiber is alive
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-fiber
|
* Implemented in mruby-fiber
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_fiber_alive_p(mrb_state *mrb, mrb_value fib);
|
MRB_API mrb_value mrb_fiber_alive_p(mrb_state *mrb, mrb_value fib);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* FiberError reference
|
* FiberError reference
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-fiber
|
* Implemented in mruby-fiber
|
||||||
*/
|
*/
|
||||||
#define E_FIBER_ERROR (mrb_exc_get(mrb, "FiberError"))
|
#define E_FIBER_ERROR (mrb_exc_get(mrb, "FiberError"))
|
||||||
MRB_API void mrb_stack_extend(mrb_state*, mrb_int);
|
MRB_API void mrb_stack_extend(mrb_state*, mrb_int);
|
||||||
@@ -1250,6 +1361,7 @@ MRB_API void mrb_pool_close(struct mrb_pool*);
|
|||||||
MRB_API void* mrb_pool_alloc(struct mrb_pool*, size_t);
|
MRB_API void* mrb_pool_alloc(struct mrb_pool*, size_t);
|
||||||
MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
|
MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
|
||||||
MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
|
MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
|
||||||
|
/* temporary memory allocation, only effective while GC arena is kept */
|
||||||
MRB_API void* mrb_alloca(mrb_state *mrb, size_t);
|
MRB_API void* mrb_alloca(mrb_state *mrb, size_t);
|
||||||
|
|
||||||
MRB_API void mrb_state_atexit(mrb_state *mrb, mrb_atexit_func func);
|
MRB_API void mrb_state_atexit(mrb_state *mrb, mrb_atexit_func func);
|
||||||
|
|||||||
+11
-7
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/array.h - Array class
|
** @file mruby/array.h - Array class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -17,7 +17,7 @@ MRB_BEGIN_DECL
|
|||||||
|
|
||||||
typedef struct mrb_shared_array {
|
typedef struct mrb_shared_array {
|
||||||
int refcnt;
|
int refcnt;
|
||||||
mrb_int len;
|
mrb_ssize len;
|
||||||
mrb_value *ptr;
|
mrb_value *ptr;
|
||||||
} mrb_shared_array;
|
} mrb_shared_array;
|
||||||
|
|
||||||
@@ -26,14 +26,14 @@ struct RArray {
|
|||||||
MRB_OBJECT_HEADER;
|
MRB_OBJECT_HEADER;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
mrb_int len;
|
mrb_ssize len;
|
||||||
union {
|
union {
|
||||||
mrb_int capa;
|
mrb_ssize capa;
|
||||||
mrb_shared_array *shared;
|
mrb_shared_array *shared;
|
||||||
} aux;
|
} aux;
|
||||||
mrb_value *ptr;
|
mrb_value *ptr;
|
||||||
} heap;
|
} heap;
|
||||||
mrb_value embed[MRB_ARY_EMBED_LEN_MAX];
|
void *ary[3];
|
||||||
} as;
|
} as;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ struct RArray {
|
|||||||
#define ARY_UNSET_EMBED_FLAG(a) ((a)->flags &= ~(MRB_ARY_EMBED_MASK))
|
#define ARY_UNSET_EMBED_FLAG(a) ((a)->flags &= ~(MRB_ARY_EMBED_MASK))
|
||||||
#define ARY_EMBED_LEN(a) ((mrb_int)(((a)->flags & MRB_ARY_EMBED_MASK) - 1))
|
#define ARY_EMBED_LEN(a) ((mrb_int)(((a)->flags & MRB_ARY_EMBED_MASK) - 1))
|
||||||
#define ARY_SET_EMBED_LEN(a,len) ((a)->flags = ((a)->flags&~MRB_ARY_EMBED_MASK) | ((uint32_t)(len) + 1))
|
#define ARY_SET_EMBED_LEN(a,len) ((a)->flags = ((a)->flags&~MRB_ARY_EMBED_MASK) | ((uint32_t)(len) + 1))
|
||||||
#define ARY_EMBED_PTR(a) (&((a)->as.embed[0]))
|
#define ARY_EMBED_PTR(a) ((mrb_value*)(&(a)->as.ary))
|
||||||
|
|
||||||
#define ARY_LEN(a) (ARY_EMBED_P(a)?ARY_EMBED_LEN(a):(a)->as.heap.len)
|
#define ARY_LEN(a) (ARY_EMBED_P(a)?ARY_EMBED_LEN(a):(a)->as.heap.len)
|
||||||
#define ARY_PTR(a) (ARY_EMBED_P(a)?ARY_EMBED_PTR(a):(a)->as.heap.ptr)
|
#define ARY_PTR(a) (ARY_EMBED_P(a)?ARY_EMBED_PTR(a):(a)->as.heap.ptr)
|
||||||
@@ -239,6 +239,7 @@ MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
|
|||||||
* @param head Beginning position of a replacement subsequence.
|
* @param head Beginning position of a replacement subsequence.
|
||||||
* @param len Length of a replacement subsequence.
|
* @param len Length of a replacement subsequence.
|
||||||
* @param rpl The array of replacement elements.
|
* @param rpl The array of replacement elements.
|
||||||
|
* It is possible to pass `mrb_undef_value()` instead of an empty array.
|
||||||
* @return The receiver array.
|
* @return The receiver array.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_ary_splice(mrb_state *mrb, mrb_value self, mrb_int head, mrb_int len, mrb_value rpl);
|
MRB_API mrb_value mrb_ary_splice(mrb_state *mrb, mrb_value self, mrb_int head, mrb_int len, mrb_value rpl);
|
||||||
@@ -291,6 +292,9 @@ MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
|
|||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len);
|
MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len);
|
||||||
|
|
||||||
|
/* helper functions */
|
||||||
|
mrb_value mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len);
|
||||||
|
|
||||||
MRB_END_DECL
|
MRB_END_DECL
|
||||||
|
|
||||||
#endif /* MRUBY_ARRAY_H */
|
#endif /* MRUBY_ARRAY_H */
|
||||||
|
|||||||
+14
-11
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/boxing_nan.h - nan boxing mrb_value definition
|
** @file mruby/boxing_nan.h - nan boxing mrb_value definition
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -20,13 +20,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MRB_FIXNUM_SHIFT 0
|
#define MRB_FIXNUM_SHIFT 0
|
||||||
#define MRB_TT_HAS_BASIC MRB_TT_OBJECT
|
#define MRB_SYMBOL_SHIFT 0
|
||||||
|
|
||||||
#ifdef MRB_ENDIAN_BIG
|
|
||||||
#define MRB_ENDIAN_LOHI(a,b) a b
|
|
||||||
#else
|
|
||||||
#define MRB_ENDIAN_LOHI(a,b) b a
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* value representation by nan-boxing:
|
/* value representation by nan-boxing:
|
||||||
* float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
|
* float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
|
||||||
@@ -50,6 +44,9 @@ typedef struct mrb_value {
|
|||||||
};
|
};
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
#ifdef MRB_64BIT
|
||||||
|
struct RCptr *vp;
|
||||||
|
#endif
|
||||||
} value;
|
} value;
|
||||||
};
|
};
|
||||||
} mrb_value;
|
} mrb_value;
|
||||||
@@ -60,13 +57,15 @@ typedef struct mrb_value {
|
|||||||
#define mrb_type(o) (enum mrb_vtype)((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
|
#define mrb_type(o) (enum mrb_vtype)((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
|
||||||
#define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2))
|
#define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2))
|
||||||
#define mrb_float(o) (o).f
|
#define mrb_float(o) (o).f
|
||||||
#define mrb_cptr(o) mrb_ptr(o)
|
|
||||||
#define mrb_fixnum(o) (o).value.i
|
#define mrb_fixnum(o) (o).value.i
|
||||||
#define mrb_symbol(o) (o).value.sym
|
#define mrb_symbol(o) (o).value.sym
|
||||||
|
|
||||||
#ifdef MRB_64BIT
|
#ifdef MRB_64BIT
|
||||||
|
MRB_API mrb_value mrb_nan_boxing_cptr_value(struct mrb_state*, void*);
|
||||||
|
#define mrb_cptr(o) (((struct RCptr*)mrb_ptr(o))->p)
|
||||||
#define BOXNAN_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff)
|
#define BOXNAN_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff)
|
||||||
#else
|
#else
|
||||||
|
#define mrb_cptr(o) ((o).value.p)
|
||||||
#define BOXNAN_SHIFT_LONG_POINTER(v) 0
|
#define BOXNAN_SHIFT_LONG_POINTER(v) 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -96,7 +95,11 @@ typedef struct mrb_value {
|
|||||||
#define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
|
#define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
|
||||||
#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
|
#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
|
||||||
#define SET_OBJ_VALUE(r,v) BOXNAN_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v))
|
#define SET_OBJ_VALUE(r,v) BOXNAN_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v))
|
||||||
#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_OBJ_VALUE(r, MRB_TT_CPTR, v)
|
#ifdef MRB_64BIT
|
||||||
|
#define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_nan_boxing_cptr_value(mrb, v))
|
||||||
|
#else
|
||||||
|
#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
|
||||||
|
#endif
|
||||||
#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
|
#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
|
||||||
|
|
||||||
#endif /* MRUBY_BOXING_NAN_H */
|
#endif /* MRUBY_BOXING_NAN_H */
|
||||||
|
|||||||
+13
-11
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/boxing_no.h - unboxed mrb_value definition
|
** @file mruby/boxing_no.h - unboxed mrb_value definition
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -8,17 +8,19 @@
|
|||||||
#define MRUBY_BOXING_NO_H
|
#define MRUBY_BOXING_NO_H
|
||||||
|
|
||||||
#define MRB_FIXNUM_SHIFT 0
|
#define MRB_FIXNUM_SHIFT 0
|
||||||
#define MRB_TT_HAS_BASIC MRB_TT_OBJECT
|
#define MRB_SYMBOL_SHIFT 0
|
||||||
|
|
||||||
|
union mrb_value_union {
|
||||||
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
|
mrb_float f;
|
||||||
|
#endif
|
||||||
|
void *p;
|
||||||
|
mrb_int i;
|
||||||
|
mrb_sym sym;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct mrb_value {
|
typedef struct mrb_value {
|
||||||
union {
|
union mrb_value_union value;
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
|
||||||
mrb_float f;
|
|
||||||
#endif
|
|
||||||
void *p;
|
|
||||||
mrb_int i;
|
|
||||||
mrb_sym sym;
|
|
||||||
} value;
|
|
||||||
enum mrb_vtype tt;
|
enum mrb_vtype tt;
|
||||||
} mrb_value;
|
} mrb_value;
|
||||||
|
|
||||||
|
|||||||
+110
-80
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/boxing_word.h - word boxing mrb_value definition
|
** @file mruby/boxing_word.h - word boxing mrb_value definition
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -7,10 +7,6 @@
|
|||||||
#ifndef MRUBY_BOXING_WORD_H
|
#ifndef MRUBY_BOXING_WORD_H
|
||||||
#define MRUBY_BOXING_WORD_H
|
#define MRUBY_BOXING_WORD_H
|
||||||
|
|
||||||
#if defined(MRB_INT16)
|
|
||||||
# error MRB_INT16 is too small for MRB_WORD_BOXING.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MRB_INT64) && !defined(MRB_64BIT)
|
#if defined(MRB_INT64) && !defined(MRB_64BIT)
|
||||||
#error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode.
|
#error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode.
|
||||||
#endif
|
#endif
|
||||||
@@ -22,48 +18,66 @@ struct RFloat {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct RCptr {
|
|
||||||
MRB_OBJECT_HEADER;
|
|
||||||
void *p;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MRB_FIXNUM_SHIFT 1
|
|
||||||
#ifdef MRB_WITHOUT_FLOAT
|
|
||||||
#define MRB_TT_HAS_BASIC MRB_TT_CPTR
|
|
||||||
#else
|
|
||||||
#define MRB_TT_HAS_BASIC MRB_TT_FLOAT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum mrb_special_consts {
|
enum mrb_special_consts {
|
||||||
MRB_Qnil = 0,
|
MRB_Qnil = 0,
|
||||||
MRB_Qfalse = 2,
|
MRB_Qfalse = 4,
|
||||||
MRB_Qtrue = 4,
|
MRB_Qtrue = 12,
|
||||||
MRB_Qundef = 6,
|
MRB_Qundef = 20,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MRB_FIXNUM_FLAG 0x01
|
#if defined(MRB_64BIT) && defined(MRB_INT32)
|
||||||
#define MRB_SYMBOL_FLAG 0x0e
|
#define MRB_FIXNUM_SHIFT 0
|
||||||
#define MRB_SPECIAL_SHIFT 8
|
|
||||||
|
|
||||||
#if defined(MRB_64BIT)
|
|
||||||
#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
|
|
||||||
#define MRB_SYMBOL_MAX UINT32_MAX
|
|
||||||
#else
|
#else
|
||||||
#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT - MRB_SPECIAL_SHIFT)
|
#define MRB_FIXNUM_SHIFT BOXWORD_FIXNUM_SHIFT
|
||||||
#define MRB_SYMBOL_MAX (UINT32_MAX >> MRB_SPECIAL_SHIFT)
|
|
||||||
#endif
|
#endif
|
||||||
|
#define MRB_SYMBOL_SHIFT BOXWORD_SYMBOL_SHIFT
|
||||||
|
|
||||||
|
#define BOXWORD_FIXNUM_BIT_POS 1
|
||||||
|
#define BOXWORD_SYMBOL_BIT_POS 2
|
||||||
|
#define BOXWORD_FIXNUM_SHIFT BOXWORD_FIXNUM_BIT_POS
|
||||||
|
#ifdef MRB_64BIT
|
||||||
|
#define BOXWORD_SYMBOL_SHIFT 0
|
||||||
|
#else
|
||||||
|
#define BOXWORD_SYMBOL_SHIFT BOXWORD_SYMBOL_BIT_POS
|
||||||
|
#endif
|
||||||
|
#define BOXWORD_FIXNUM_FLAG (1 << (BOXWORD_FIXNUM_BIT_POS - 1))
|
||||||
|
#define BOXWORD_SYMBOL_FLAG (1 << (BOXWORD_SYMBOL_BIT_POS - 1))
|
||||||
|
#define BOXWORD_FIXNUM_MASK ((1 << BOXWORD_FIXNUM_BIT_POS) - 1)
|
||||||
|
#define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1)
|
||||||
|
#define BOXWORD_IMMEDIATE_MASK 0x07
|
||||||
|
|
||||||
|
#define BOXWORD_SHIFT_VALUE(o,n,t) \
|
||||||
|
(t)(((long)(o).w) >> BOXWORD_##n##_SHIFT)
|
||||||
|
#define BOXWORD_SET_SHIFT_VALUE(o,n,v) \
|
||||||
|
((o).w = (((unsigned long)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG)
|
||||||
|
#define BOXWORD_SHIFT_VALUE_P(o,n) \
|
||||||
|
(((o).w & BOXWORD_##n##_MASK) == BOXWORD_##n##_FLAG)
|
||||||
|
#define BOXWORD_OBJ_TYPE_P(o,n) \
|
||||||
|
(!mrb_immediate_p(o) && (o).value.bp->tt == MRB_TT_##n)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mrb_value representation:
|
||||||
|
*
|
||||||
|
* nil : ...0000 0000 (all bits are 0)
|
||||||
|
* false : ...0000 0100 (mrb_fixnum(v) != 0)
|
||||||
|
* true : ...0000 1100
|
||||||
|
* undef : ...0001 0100
|
||||||
|
* fixnum: ...IIII III1
|
||||||
|
* symbol: ...SSSS SS10 (use only upper 32-bit as symbol value on 64-bit CPU)
|
||||||
|
* object: ...PPPP P000 (any bits are 1)
|
||||||
|
*/
|
||||||
typedef union mrb_value {
|
typedef union mrb_value {
|
||||||
union {
|
union {
|
||||||
void *p;
|
void *p;
|
||||||
|
#ifdef MRB_64BIT
|
||||||
|
/* use struct to avoid bit shift. */
|
||||||
struct {
|
struct {
|
||||||
unsigned int i_flag : MRB_FIXNUM_SHIFT;
|
MRB_ENDIAN_LOHI(
|
||||||
mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT);
|
mrb_sym sym;
|
||||||
};
|
,uint32_t sym_flag;
|
||||||
struct {
|
)
|
||||||
unsigned int sym_flag : MRB_SPECIAL_SHIFT;
|
|
||||||
mrb_sym sym : MRB_SYMBOL_BITSIZE;
|
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
struct RBasic *bp;
|
struct RBasic *bp;
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
struct RFloat *fp;
|
struct RFloat *fp;
|
||||||
@@ -88,57 +102,73 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
|
|||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
#define mrb_float(o) (o).value.fp->f
|
#define mrb_float(o) (o).value.fp->f
|
||||||
#endif
|
#endif
|
||||||
#define mrb_fixnum(o) ((mrb_int)(o).value.i)
|
#define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int)
|
||||||
|
#ifdef MRB_64BIT
|
||||||
#define mrb_symbol(o) (o).value.sym
|
#define mrb_symbol(o) (o).value.sym
|
||||||
|
#else
|
||||||
|
#define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym)
|
||||||
|
#endif
|
||||||
|
#define mrb_bool(o) (((o).w & ~(unsigned long)MRB_Qfalse) != 0)
|
||||||
|
|
||||||
static inline enum mrb_vtype
|
#define mrb_immediate_p(o) ((o).w & BOXWORD_IMMEDIATE_MASK || (o).w == MRB_Qnil)
|
||||||
mrb_type(mrb_value o)
|
#define mrb_fixnum_p(o) BOXWORD_SHIFT_VALUE_P(o, FIXNUM)
|
||||||
{
|
#ifdef MRB_64BIT
|
||||||
switch (o.w) {
|
#define mrb_symbol_p(o) ((o).value.sym_flag == BOXWORD_SYMBOL_FLAG)
|
||||||
case MRB_Qfalse:
|
#else
|
||||||
case MRB_Qnil:
|
#define mrb_symbol_p(o) BOXWORD_SHIFT_VALUE_P(o, SYMBOL)
|
||||||
return MRB_TT_FALSE;
|
#endif
|
||||||
case MRB_Qtrue:
|
|
||||||
return MRB_TT_TRUE;
|
|
||||||
case MRB_Qundef:
|
|
||||||
return MRB_TT_UNDEF;
|
|
||||||
}
|
|
||||||
if (o.value.i_flag == MRB_FIXNUM_FLAG) {
|
|
||||||
return MRB_TT_FIXNUM;
|
|
||||||
}
|
|
||||||
if (o.value.sym_flag == MRB_SYMBOL_FLAG) {
|
|
||||||
return MRB_TT_SYMBOL;
|
|
||||||
}
|
|
||||||
return o.value.bp->tt;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
|
|
||||||
#define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)
|
|
||||||
#define mrb_undef_p(o) ((o).w == MRB_Qundef)
|
#define mrb_undef_p(o) ((o).w == MRB_Qundef)
|
||||||
#define mrb_nil_p(o) ((o).w == MRB_Qnil)
|
#define mrb_nil_p(o) ((o).w == MRB_Qnil)
|
||||||
|
#define mrb_false_p(o) ((o).w == MRB_Qfalse)
|
||||||
#define BOXWORD_SET_VALUE(o, ttt, attr, v) do { \
|
#define mrb_true_p(o) ((o).w == MRB_Qtrue)
|
||||||
switch (ttt) {\
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\
|
#define mrb_float_p(o) BOXWORD_OBJ_TYPE_P(o, FLOAT)
|
||||||
case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\
|
#endif
|
||||||
case MRB_TT_UNDEF: (o).w = MRB_Qundef; break;\
|
#define mrb_array_p(o) BOXWORD_OBJ_TYPE_P(o, ARRAY)
|
||||||
case MRB_TT_FIXNUM: (o).w = 0;(o).value.i_flag = MRB_FIXNUM_FLAG; (o).attr = (v); break;\
|
#define mrb_string_p(o) BOXWORD_OBJ_TYPE_P(o, STRING)
|
||||||
case MRB_TT_SYMBOL: (o).w = 0;(o).value.sym_flag = MRB_SYMBOL_FLAG; (o).attr = (v); break;\
|
#define mrb_hash_p(o) BOXWORD_OBJ_TYPE_P(o, HASH)
|
||||||
default: (o).w = 0; (o).attr = (v); if ((o).value.bp) (o).value.bp->tt = ttt; break;\
|
#define mrb_cptr_p(o) BOXWORD_OBJ_TYPE_P(o, CPTR)
|
||||||
}\
|
#define mrb_exception_p(o) BOXWORD_OBJ_TYPE_P(o, EXCEPTION)
|
||||||
} while (0)
|
#define mrb_free_p(o) BOXWORD_OBJ_TYPE_P(o, FREE)
|
||||||
|
#define mrb_object_p(o) BOXWORD_OBJ_TYPE_P(o, OBJECT)
|
||||||
|
#define mrb_class_p(o) BOXWORD_OBJ_TYPE_P(o, CLASS)
|
||||||
|
#define mrb_module_p(o) BOXWORD_OBJ_TYPE_P(o, MODULE)
|
||||||
|
#define mrb_iclass_p(o) BOXWORD_OBJ_TYPE_P(o, ICLASS)
|
||||||
|
#define mrb_sclass_p(o) BOXWORD_OBJ_TYPE_P(o, SCLASS)
|
||||||
|
#define mrb_proc_p(o) BOXWORD_OBJ_TYPE_P(o, PROC)
|
||||||
|
#define mrb_range_p(o) BOXWORD_OBJ_TYPE_P(o, RANGE)
|
||||||
|
#define mrb_env_p(o) BOXWORD_OBJ_TYPE_P(o, ENV)
|
||||||
|
#define mrb_data_p(o) BOXWORD_OBJ_TYPE_P(o, DATA)
|
||||||
|
#define mrb_fiber_p(o) BOXWORD_OBJ_TYPE_P(o, FIBER)
|
||||||
|
#define mrb_istruct_p(o) BOXWORD_OBJ_TYPE_P(o, ISTRUCT)
|
||||||
|
#define mrb_break_p(o) BOXWORD_OBJ_TYPE_P(o, BREAK)
|
||||||
|
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
#define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v))
|
#define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v))
|
||||||
#endif
|
#endif
|
||||||
#define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_word_boxing_cptr_value(mrb, v))
|
#define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_word_boxing_cptr_value(mrb, v))
|
||||||
#define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
|
#define SET_UNDEF_VALUE(r) ((r).w = MRB_Qundef)
|
||||||
#define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
|
#define SET_NIL_VALUE(r) ((r).w = MRB_Qnil)
|
||||||
#define SET_TRUE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
|
#define SET_FALSE_VALUE(r) ((r).w = MRB_Qfalse)
|
||||||
#define SET_BOOL_VALUE(r,b) BOXWORD_SET_VALUE(r, (b) ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
|
#define SET_TRUE_VALUE(r) ((r).w = MRB_Qtrue)
|
||||||
#define SET_INT_VALUE(r,n) BOXWORD_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
|
#define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r))
|
||||||
#define SET_SYM_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
|
#define SET_INT_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, FIXNUM, n)
|
||||||
#define SET_OBJ_VALUE(r,v) BOXWORD_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
|
#ifdef MRB_64BIT
|
||||||
#define SET_UNDEF_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
|
#define SET_SYM_VALUE(r,v) ((r).value.sym = v, (r).value.sym_flag = BOXWORD_SYMBOL_FLAG)
|
||||||
|
#else
|
||||||
|
#define SET_SYM_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, SYMBOL, n)
|
||||||
|
#endif
|
||||||
|
#define SET_OBJ_VALUE(r,v) ((r).value.p = v)
|
||||||
|
|
||||||
|
MRB_INLINE enum mrb_vtype
|
||||||
|
mrb_type(mrb_value o)
|
||||||
|
{
|
||||||
|
return !mrb_bool(o) ? MRB_TT_FALSE :
|
||||||
|
mrb_true_p(o) ? MRB_TT_TRUE :
|
||||||
|
mrb_fixnum_p(o) ? MRB_TT_FIXNUM :
|
||||||
|
mrb_symbol_p(o) ? MRB_TT_SYMBOL :
|
||||||
|
mrb_undef_p(o) ? MRB_TT_UNDEF :
|
||||||
|
o.value.bp->tt;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* MRUBY_BOXING_WORD_H */
|
#endif /* MRUBY_BOXING_WORD_H */
|
||||||
|
|||||||
+14
-5
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/class.h - Class class
|
** @file mruby/class.h - Class class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -23,7 +23,7 @@ struct RClass {
|
|||||||
|
|
||||||
#define mrb_class_ptr(v) ((struct RClass*)(mrb_ptr(v)))
|
#define mrb_class_ptr(v) ((struct RClass*)(mrb_ptr(v)))
|
||||||
|
|
||||||
static inline struct RClass*
|
MRB_INLINE struct RClass*
|
||||||
mrb_class(mrb_state *mrb, mrb_value v)
|
mrb_class(mrb_state *mrb, mrb_value v)
|
||||||
{
|
{
|
||||||
switch (mrb_type(v)) {
|
switch (mrb_type(v)) {
|
||||||
@@ -75,8 +75,8 @@ mrb_class(mrb_state *mrb, mrb_value v)
|
|||||||
|
|
||||||
MRB_API struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*);
|
MRB_API struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*);
|
||||||
MRB_API struct RClass* mrb_define_module_id(mrb_state*, mrb_sym);
|
MRB_API struct RClass* mrb_define_module_id(mrb_state*, mrb_sym);
|
||||||
MRB_API struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym);
|
struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym);
|
||||||
MRB_API struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym);
|
struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym);
|
||||||
MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, mrb_method_t);
|
MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, mrb_method_t);
|
||||||
MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec);
|
MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec);
|
||||||
MRB_API void mrb_alias_method(mrb_state*, struct RClass *c, mrb_sym a, mrb_sym b);
|
MRB_API void mrb_alias_method(mrb_state*, struct RClass *c, mrb_sym a, mrb_sym b);
|
||||||
@@ -85,13 +85,22 @@ MRB_API mrb_method_t mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym);
|
|||||||
MRB_API mrb_method_t mrb_method_search(mrb_state*, struct RClass*, mrb_sym);
|
MRB_API mrb_method_t mrb_method_search(mrb_state*, struct RClass*, mrb_sym);
|
||||||
|
|
||||||
MRB_API struct RClass* mrb_class_real(struct RClass* cl);
|
MRB_API struct RClass* mrb_class_real(struct RClass* cl);
|
||||||
|
mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);
|
||||||
|
|
||||||
void mrb_class_name_class(mrb_state*, struct RClass*, struct RClass*, mrb_sym);
|
void mrb_class_name_class(mrb_state*, struct RClass*, struct RClass*, mrb_sym);
|
||||||
|
mrb_bool mrb_const_name_p(mrb_state*, const char*, mrb_int);
|
||||||
mrb_value mrb_class_find_path(mrb_state*, struct RClass*);
|
mrb_value mrb_class_find_path(mrb_state*, struct RClass*);
|
||||||
|
mrb_value mrb_mod_to_s(mrb_state*, mrb_value);
|
||||||
void mrb_gc_mark_mt(mrb_state*, struct RClass*);
|
void mrb_gc_mark_mt(mrb_state*, struct RClass*);
|
||||||
size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*);
|
size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*);
|
||||||
void mrb_gc_free_mt(mrb_state*, struct RClass*);
|
void mrb_gc_free_mt(mrb_state*, struct RClass*);
|
||||||
|
|
||||||
|
#ifdef MRB_METHOD_CACHE
|
||||||
|
void mrb_mc_clear_by_class(mrb_state *mrb, struct RClass* c);
|
||||||
|
#else
|
||||||
|
#define mrb_mc_clear_by_class(mrb,c)
|
||||||
|
#endif
|
||||||
|
|
||||||
MRB_END_DECL
|
MRB_END_DECL
|
||||||
|
|
||||||
#endif /* MRUBY_CLASS_H */
|
#endif /* MRUBY_CLASS_H */
|
||||||
|
|||||||
+19
-7
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
**"common.h - mruby common platform definition"
|
** @file common.h - mruby common platform definition"
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -54,14 +54,15 @@ MRB_BEGIN_DECL
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Declare a function as always inlined. */
|
/** Declare a function as always inlined. */
|
||||||
#if defined(_MSC_VER)
|
#if defined _MSC_VER && _MSC_VER < 1900
|
||||||
# define MRB_INLINE static __inline
|
# ifndef __cplusplus
|
||||||
#else
|
# define inline __inline
|
||||||
# define MRB_INLINE static inline
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
#define MRB_INLINE static inline
|
||||||
|
|
||||||
/** Declare a public MRuby API function. */
|
/** Declare a public MRuby API function. */
|
||||||
|
#ifndef MRB_API
|
||||||
#if defined(MRB_BUILD_AS_DLL)
|
#if defined(MRB_BUILD_AS_DLL)
|
||||||
#if defined(MRB_CORE) || defined(MRB_LIB)
|
#if defined(MRB_CORE) || defined(MRB_LIB)
|
||||||
# define MRB_API __declspec(dllexport)
|
# define MRB_API __declspec(dllexport)
|
||||||
@@ -71,6 +72,17 @@ MRB_BEGIN_DECL
|
|||||||
#else
|
#else
|
||||||
# define MRB_API extern
|
# define MRB_API extern
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Declare mingw versions */
|
||||||
|
#if defined(__MINGW32__) || defined(__MINGW64__)
|
||||||
|
# include <_mingw.h>
|
||||||
|
# if defined(__MINGW64_VERSION_MAJOR)
|
||||||
|
# define MRB_MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR)
|
||||||
|
# elif defined(__MINGW32_MAJOR_VERSION)
|
||||||
|
# define MRB_MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 1000 + __MINGW32_MINOR_VERSION)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
MRB_END_DECL
|
MRB_END_DECL
|
||||||
|
|
||||||
|
|||||||
+18
-9
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/compile.h - mruby parser
|
** @file mruby/compile.h - mruby parser
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -24,7 +24,7 @@ typedef struct mrbc_context {
|
|||||||
mrb_sym *syms;
|
mrb_sym *syms;
|
||||||
int slen;
|
int slen;
|
||||||
char *filename;
|
char *filename;
|
||||||
short lineno;
|
uint16_t lineno;
|
||||||
int (*partial_hook)(struct mrb_parser_state*);
|
int (*partial_hook)(struct mrb_parser_state*);
|
||||||
void *partial_data;
|
void *partial_data;
|
||||||
struct RClass *target_class;
|
struct RClass *target_class;
|
||||||
@@ -33,7 +33,7 @@ typedef struct mrbc_context {
|
|||||||
mrb_bool no_exec:1;
|
mrb_bool no_exec:1;
|
||||||
mrb_bool keep_lv:1;
|
mrb_bool keep_lv:1;
|
||||||
mrb_bool no_optimize:1;
|
mrb_bool no_optimize:1;
|
||||||
mrb_bool on_eval:1;
|
struct RProc *upper;
|
||||||
|
|
||||||
size_t parser_nerr;
|
size_t parser_nerr;
|
||||||
} mrbc_context;
|
} mrbc_context;
|
||||||
@@ -67,7 +67,7 @@ enum mrb_lex_state_enum {
|
|||||||
|
|
||||||
/* saved error message */
|
/* saved error message */
|
||||||
struct mrb_parser_message {
|
struct mrb_parser_message {
|
||||||
int lineno;
|
uint16_t lineno;
|
||||||
int column;
|
int column;
|
||||||
char* message;
|
char* message;
|
||||||
};
|
};
|
||||||
@@ -105,7 +105,7 @@ struct mrb_parser_heredoc_info {
|
|||||||
mrb_ast_node *doc;
|
mrb_ast_node *doc;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MRB_PARSER_TOKBUF_MAX 65536
|
#define MRB_PARSER_TOKBUF_MAX (UINT16_MAX-1)
|
||||||
#define MRB_PARSER_TOKBUF_SIZE 256
|
#define MRB_PARSER_TOKBUF_SIZE 256
|
||||||
|
|
||||||
/* parser structure */
|
/* parser structure */
|
||||||
@@ -119,7 +119,7 @@ struct mrb_parser_state {
|
|||||||
#endif
|
#endif
|
||||||
mrbc_context *cxt;
|
mrbc_context *cxt;
|
||||||
mrb_sym filename_sym;
|
mrb_sym filename_sym;
|
||||||
int lineno;
|
uint16_t lineno;
|
||||||
int column;
|
int column;
|
||||||
|
|
||||||
enum mrb_lex_state_enum lstate;
|
enum mrb_lex_state_enum lstate;
|
||||||
@@ -151,8 +151,8 @@ struct mrb_parser_state {
|
|||||||
mrb_ast_node *tree;
|
mrb_ast_node *tree;
|
||||||
|
|
||||||
mrb_bool no_optimize:1;
|
mrb_bool no_optimize:1;
|
||||||
mrb_bool on_eval:1;
|
|
||||||
mrb_bool capture_errors:1;
|
mrb_bool capture_errors:1;
|
||||||
|
struct RProc *upper;
|
||||||
struct mrb_parser_message error_buffer[10];
|
struct mrb_parser_message error_buffer[10];
|
||||||
struct mrb_parser_message warn_buffer[10];
|
struct mrb_parser_message warn_buffer[10];
|
||||||
|
|
||||||
@@ -161,6 +161,7 @@ struct mrb_parser_state {
|
|||||||
uint16_t current_filename_index;
|
uint16_t current_filename_index;
|
||||||
|
|
||||||
struct mrb_jmpbuf* jmp;
|
struct mrb_jmpbuf* jmp;
|
||||||
|
mrb_ast_node *nvars;
|
||||||
};
|
};
|
||||||
|
|
||||||
MRB_API struct mrb_parser_state* mrb_parser_new(mrb_state*);
|
MRB_API struct mrb_parser_state* mrb_parser_new(mrb_state*);
|
||||||
@@ -179,7 +180,15 @@ MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t
|
|||||||
MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
|
MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
|
||||||
MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c);
|
MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c);
|
||||||
|
|
||||||
/* program load functions */
|
/** program load functions
|
||||||
|
* Please note! Currently due to interactions with the GC calling these functions will
|
||||||
|
* leak one RProc object per function call.
|
||||||
|
* To prevent this save the current memory arena before calling and restore the arena
|
||||||
|
* right after, like so
|
||||||
|
* int ai = mrb_gc_arena_save(mrb);
|
||||||
|
* mrb_value status = mrb_load_string(mrb, buffer);
|
||||||
|
* mrb_gc_arena_restore(mrb, ai);
|
||||||
|
*/
|
||||||
#ifndef MRB_DISABLE_STDIO
|
#ifndef MRB_DISABLE_STDIO
|
||||||
MRB_API mrb_value mrb_load_file(mrb_state*,FILE*);
|
MRB_API mrb_value mrb_load_file(mrb_state*,FILE*);
|
||||||
MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt);
|
MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/data.h - Data class
|
** @file mruby/data.h - Data class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -41,7 +41,7 @@ MRB_API struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass
|
|||||||
|
|
||||||
#define Data_Make_Struct(mrb,klass,strct,type,sval,data_obj) do { \
|
#define Data_Make_Struct(mrb,klass,strct,type,sval,data_obj) do { \
|
||||||
(data_obj) = Data_Wrap_Struct(mrb,klass,type,NULL);\
|
(data_obj) = Data_Wrap_Struct(mrb,klass,type,NULL);\
|
||||||
(sval) = mrb_malloc(mrb, sizeof(strct)); \
|
(sval) = (strct *)mrb_malloc(mrb, sizeof(strct)); \
|
||||||
{ static const strct zero = { 0 }; *(sval) = zero; };\
|
{ static const strct zero = { 0 }; *(sval) = zero; };\
|
||||||
(data_obj)->data = (sval);\
|
(data_obj)->data = (sval);\
|
||||||
} while (0)
|
} while (0)
|
||||||
@@ -63,10 +63,10 @@ MRB_API void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_t
|
|||||||
*(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
|
*(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static inline void
|
MRB_INLINE void
|
||||||
mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
|
mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
|
||||||
{
|
{
|
||||||
mrb_assert(mrb_type(v) == MRB_TT_DATA);
|
mrb_assert(mrb_data_p(v));
|
||||||
DATA_PTR(v) = ptr;
|
DATA_PTR(v) = ptr;
|
||||||
DATA_TYPE(v) = type;
|
DATA_TYPE(v) = type;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/debug.h - mruby debug info
|
** @file mruby/debug.h - mruby debug info
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
|
|||||||
+4
-24
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/dump.h - mruby binary dumper (mrbc binary format)
|
** @file mruby/dump.h - mruby binary dumper (mrbc binary format)
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -17,10 +17,6 @@
|
|||||||
MRB_BEGIN_DECL
|
MRB_BEGIN_DECL
|
||||||
|
|
||||||
#define DUMP_DEBUG_INFO 1
|
#define DUMP_DEBUG_INFO 1
|
||||||
#define DUMP_ENDIAN_BIG 2
|
|
||||||
#define DUMP_ENDIAN_LIL 4
|
|
||||||
#define DUMP_ENDIAN_NAT 6
|
|
||||||
#define DUMP_ENDIAN_MASK 6
|
|
||||||
|
|
||||||
int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size);
|
int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size);
|
||||||
#ifndef MRB_DISABLE_STDIO
|
#ifndef MRB_DISABLE_STDIO
|
||||||
@@ -31,6 +27,7 @@ MRB_API mrb_value mrb_load_irep_file(mrb_state*,FILE*);
|
|||||||
MRB_API mrb_value mrb_load_irep_file_cxt(mrb_state*, FILE*, mrbc_context*);
|
MRB_API mrb_value mrb_load_irep_file_cxt(mrb_state*, FILE*, mrbc_context*);
|
||||||
#endif
|
#endif
|
||||||
MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
|
MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
|
||||||
|
MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t);
|
||||||
|
|
||||||
/* dump/load error code
|
/* dump/load error code
|
||||||
*
|
*
|
||||||
@@ -51,8 +48,7 @@ MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
|
|||||||
|
|
||||||
/* Rite Binary File header */
|
/* Rite Binary File header */
|
||||||
#define RITE_BINARY_IDENT "RITE"
|
#define RITE_BINARY_IDENT "RITE"
|
||||||
#define RITE_BINARY_IDENT_LIL "ETIR"
|
#define RITE_BINARY_FORMAT_VER "0007"
|
||||||
#define RITE_BINARY_FORMAT_VER "0006"
|
|
||||||
#define RITE_COMPILER_NAME "MATZ"
|
#define RITE_COMPILER_NAME "MATZ"
|
||||||
#define RITE_COMPILER_VERSION "0000"
|
#define RITE_COMPILER_VERSION "0000"
|
||||||
|
|
||||||
@@ -60,7 +56,6 @@ MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
|
|||||||
|
|
||||||
#define RITE_BINARY_EOF "END\0"
|
#define RITE_BINARY_EOF "END\0"
|
||||||
#define RITE_SECTION_IREP_IDENT "IREP"
|
#define RITE_SECTION_IREP_IDENT "IREP"
|
||||||
#define RITE_SECTION_LINENO_IDENT "LINE"
|
|
||||||
#define RITE_SECTION_DEBUG_IDENT "DBG\0"
|
#define RITE_SECTION_DEBUG_IDENT "DBG\0"
|
||||||
#define RITE_SECTION_LV_IDENT "LVAR"
|
#define RITE_SECTION_LV_IDENT "LVAR"
|
||||||
|
|
||||||
@@ -92,10 +87,6 @@ struct rite_section_irep_header {
|
|||||||
uint8_t rite_version[4]; /* Rite Instruction Specification Version */
|
uint8_t rite_version[4]; /* Rite Instruction Specification Version */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rite_section_lineno_header {
|
|
||||||
RITE_SECTION_HEADER;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rite_section_debug_header {
|
struct rite_section_debug_header {
|
||||||
RITE_SECTION_HEADER;
|
RITE_SECTION_HEADER;
|
||||||
};
|
};
|
||||||
@@ -110,17 +101,6 @@ struct rite_binary_footer {
|
|||||||
RITE_SECTION_HEADER;
|
RITE_SECTION_HEADER;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline int
|
|
||||||
bigendian_p()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
i = 1;
|
|
||||||
p = (char*)&i;
|
|
||||||
return p[0]?0:1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
uint8_to_bin(uint8_t s, uint8_t *bin)
|
uint8_to_bin(uint8_t s, uint8_t *bin)
|
||||||
{
|
{
|
||||||
|
|||||||
+34
-6
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/error.h - Exception class
|
** @file mruby/error.h - Exception class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -32,23 +32,51 @@ MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_va
|
|||||||
/* declaration for `fail` method */
|
/* declaration for `fail` method */
|
||||||
MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value);
|
MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value);
|
||||||
|
|
||||||
|
#if defined(MRB_64BIT) || defined(MRB_USE_FLOAT) || defined(MRB_NAN_BOXING) || defined(MRB_WORD_BOXING)
|
||||||
struct RBreak {
|
struct RBreak {
|
||||||
MRB_OBJECT_HEADER;
|
MRB_OBJECT_HEADER;
|
||||||
struct RProc *proc;
|
struct RProc *proc;
|
||||||
mrb_value val;
|
mrb_value val;
|
||||||
};
|
};
|
||||||
|
#define mrb_break_value_get(brk) ((brk)->val)
|
||||||
|
#define mrb_break_value_set(brk, v) ((brk)->val = v)
|
||||||
|
#else
|
||||||
|
struct RBreak {
|
||||||
|
MRB_OBJECT_HEADER;
|
||||||
|
struct RProc *proc;
|
||||||
|
union mrb_value_union value;
|
||||||
|
};
|
||||||
|
#define RBREAK_VALUE_TT_MASK ((1 << 8) - 1)
|
||||||
|
static inline mrb_value
|
||||||
|
mrb_break_value_get(struct RBreak *brk)
|
||||||
|
{
|
||||||
|
mrb_value val;
|
||||||
|
val.value = brk->value;
|
||||||
|
val.tt = (enum mrb_vtype)(brk->flags & RBREAK_VALUE_TT_MASK);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
static inline void
|
||||||
|
mrb_break_value_set(struct RBreak *brk, mrb_value val)
|
||||||
|
{
|
||||||
|
brk->value = val.value;
|
||||||
|
brk->flags &= ~RBREAK_VALUE_TT_MASK;
|
||||||
|
brk->flags |= val.tt;
|
||||||
|
}
|
||||||
|
#endif /* MRB_64BIT || MRB_USE_FLOAT || MRB_NAN_BOXING || MRB_WORD_BOXING */
|
||||||
|
#define mrb_break_proc_get(brk) ((brk)->proc)
|
||||||
|
#define mrb_break_proc_set(brk, p) ((brk)->proc = p)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protect
|
* Protect
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-error
|
* Implemented in the mruby-error mrbgem
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state);
|
MRB_API mrb_value mrb_protect(mrb_state *mrb, mrb_func_t body, mrb_value data, mrb_bool *state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure
|
* Ensure
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-error
|
* Implemented in the mruby-error mrbgem
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
MRB_API mrb_value mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
||||||
mrb_func_t ensure, mrb_value e_data);
|
mrb_func_t ensure, mrb_value e_data);
|
||||||
@@ -56,7 +84,7 @@ MRB_API mrb_value mrb_ensure(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
|||||||
/**
|
/**
|
||||||
* Rescue
|
* Rescue
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-error
|
* Implemented in the mruby-error mrbgem
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_rescue(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
MRB_API mrb_value mrb_rescue(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
||||||
mrb_func_t rescue, mrb_value r_data);
|
mrb_func_t rescue, mrb_value r_data);
|
||||||
@@ -64,7 +92,7 @@ MRB_API mrb_value mrb_rescue(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
|||||||
/**
|
/**
|
||||||
* Rescue exception
|
* Rescue exception
|
||||||
*
|
*
|
||||||
* @mrbgem mruby-error
|
* Implemented in the mruby-error mrbgem
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
MRB_API mrb_value mrb_rescue_exceptions(mrb_state *mrb, mrb_func_t body, mrb_value b_data,
|
||||||
mrb_func_t rescue, mrb_value r_data,
|
mrb_func_t rescue, mrb_value r_data,
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/gc.h - garbage collector for mruby
|
** @file mruby/gc.h - garbage collector for mruby
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
|
|||||||
+4
-11
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/hash.h - Hash class
|
** @file mruby/hash.h - Hash class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -23,7 +23,7 @@ struct RHash {
|
|||||||
#define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v)))
|
#define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v)))
|
||||||
#define mrb_hash_value(p) mrb_obj_value((void*)(p))
|
#define mrb_hash_value(p) mrb_obj_value((void*)(p))
|
||||||
|
|
||||||
MRB_API mrb_value mrb_hash_new_capa(mrb_state*, mrb_int);
|
MRB_API mrb_value mrb_hash_new_capa(mrb_state *mrb, mrb_int capa);
|
||||||
MRB_API mrb_value mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash);
|
MRB_API mrb_value mrb_ensure_hash_type(mrb_state *mrb, mrb_value hash);
|
||||||
MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
|
MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ MRB_API mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key,
|
|||||||
* @param mrb The mruby state reference.
|
* @param mrb The mruby state reference.
|
||||||
* @param hash The target hash.
|
* @param hash The target hash.
|
||||||
* @param key The key to delete.
|
* @param key The key to delete.
|
||||||
* @return The deleted value.
|
* @return The deleted value. This value is not protected from GC. Use `mrb_gc_protect()` if necessary.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key);
|
MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key);
|
||||||
|
|
||||||
@@ -197,13 +197,6 @@ MRB_API mrb_value mrb_hash_dup(mrb_state *mrb, mrb_value hash);
|
|||||||
*/
|
*/
|
||||||
MRB_API void mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2);
|
MRB_API void mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2);
|
||||||
|
|
||||||
/* declaration of struct mrb_hash_value */
|
|
||||||
/* be careful when you touch the internal */
|
|
||||||
typedef struct {
|
|
||||||
mrb_value v;
|
|
||||||
mrb_int n;
|
|
||||||
} mrb_hash_value;
|
|
||||||
|
|
||||||
/* RHASH_TBL allocates st_table if not available. */
|
/* RHASH_TBL allocates st_table if not available. */
|
||||||
#define RHASH(obj) ((struct RHash*)(mrb_ptr(obj)))
|
#define RHASH(obj) ((struct RHash*)(mrb_ptr(obj)))
|
||||||
#define RHASH_TBL(h) (RHASH(h)->ht)
|
#define RHASH_TBL(h) (RHASH(h)->ht)
|
||||||
|
|||||||
+26
-4
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/irep.h - mrb_irep structure
|
** @file mruby/irep.h - mrb_irep structure
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -32,7 +32,7 @@ typedef struct mrb_irep {
|
|||||||
uint16_t nregs; /* Number of register variables */
|
uint16_t nregs; /* Number of register variables */
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
|
||||||
mrb_code *iseq;
|
const mrb_code *iseq;
|
||||||
mrb_value *pool;
|
mrb_value *pool;
|
||||||
mrb_sym *syms;
|
mrb_sym *syms;
|
||||||
struct mrb_irep **reps;
|
struct mrb_irep **reps;
|
||||||
@@ -49,12 +49,34 @@ typedef struct mrb_irep {
|
|||||||
|
|
||||||
MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb);
|
MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb);
|
||||||
|
|
||||||
|
/** load mruby bytecode functions
|
||||||
|
* Please note! Currently due to interactions with the GC calling these functions will
|
||||||
|
* leak one RProc object per function call.
|
||||||
|
* To prevent this save the current memory arena before calling and restore the arena
|
||||||
|
* right after, like so
|
||||||
|
* int ai = mrb_gc_arena_save(mrb);
|
||||||
|
* mrb_value status = mrb_load_irep(mrb, buffer);
|
||||||
|
* mrb_gc_arena_restore(mrb, ai);
|
||||||
|
*/
|
||||||
|
|
||||||
/* @param [const uint8_t*] irep code, expected as a literal */
|
/* @param [const uint8_t*] irep code, expected as a literal */
|
||||||
MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*);
|
MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @param [const void*] irep code
|
||||||
|
* @param [size_t] size of irep buffer. If -1 is given, it is considered unrestricted.
|
||||||
|
*/
|
||||||
|
MRB_API mrb_value mrb_load_irep_buf(mrb_state*, const void*, size_t);
|
||||||
|
|
||||||
/* @param [const uint8_t*] irep code, expected as a literal */
|
/* @param [const uint8_t*] irep code, expected as a literal */
|
||||||
MRB_API mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*);
|
MRB_API mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @param [const void*] irep code
|
||||||
|
* @param [size_t] size of irep buffer. If -1 is given, it is considered unrestricted.
|
||||||
|
*/
|
||||||
|
MRB_API mrb_value mrb_load_irep_buf_cxt(mrb_state*, const void*, size_t, mrbc_context*);
|
||||||
|
|
||||||
void mrb_irep_free(mrb_state*, struct mrb_irep*);
|
void mrb_irep_free(mrb_state*, struct mrb_irep*);
|
||||||
void mrb_irep_incref(mrb_state*, struct mrb_irep*);
|
void mrb_irep_incref(mrb_state*, struct mrb_irep*);
|
||||||
void mrb_irep_decref(mrb_state*, struct mrb_irep*);
|
void mrb_irep_decref(mrb_state*, struct mrb_irep*);
|
||||||
@@ -68,7 +90,7 @@ struct mrb_insn_data {
|
|||||||
uint8_t c;
|
uint8_t c;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mrb_insn_data mrb_decode_insn(mrb_code *pc);
|
struct mrb_insn_data mrb_decode_insn(const mrb_code *pc);
|
||||||
|
|
||||||
MRB_END_DECL
|
MRB_END_DECL
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/istruct.h - Inline structures
|
** @file mruby/istruct.h - Inline structures
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -19,12 +19,15 @@ MRB_BEGIN_DECL
|
|||||||
|
|
||||||
#define ISTRUCT_DATA_SIZE (sizeof(void*) * 3)
|
#define ISTRUCT_DATA_SIZE (sizeof(void*) * 3)
|
||||||
|
|
||||||
struct RIstruct {
|
struct RIStruct {
|
||||||
MRB_OBJECT_HEADER;
|
MRB_OBJECT_HEADER;
|
||||||
char inline_data[ISTRUCT_DATA_SIZE];
|
union {
|
||||||
|
intptr_t inline_alignment[3];
|
||||||
|
char inline_data[ISTRUCT_DATA_SIZE];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RISTRUCT(obj) ((struct RIstruct*)(mrb_ptr(obj)))
|
#define RISTRUCT(obj) ((struct RIStruct*)(mrb_ptr(obj)))
|
||||||
#define ISTRUCT_PTR(obj) (RISTRUCT(obj)->inline_data)
|
#define ISTRUCT_PTR(obj) (RISTRUCT(obj)->inline_data)
|
||||||
|
|
||||||
MRB_INLINE mrb_int mrb_istruct_size()
|
MRB_INLINE mrb_int mrb_istruct_size()
|
||||||
|
|||||||
+25
-7
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/khash.c - Hash for mruby
|
** @file mruby/khash.h - Hash for mruby
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -73,6 +73,7 @@ static const uint8_t __m_either[] = {0x03, 0x0c, 0x30, 0xc0};
|
|||||||
void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h); \
|
void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h); \
|
||||||
khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \
|
khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key); \
|
||||||
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret); \
|
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret); \
|
||||||
|
void kh_put_prepare_##name(mrb_state *mrb, kh_##name##_t *h); \
|
||||||
void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets); \
|
void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets); \
|
||||||
void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x); \
|
void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x); \
|
||||||
kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h);
|
kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h);
|
||||||
@@ -95,16 +96,25 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|||||||
__hash_equal: hash comparation function
|
__hash_equal: hash comparation function
|
||||||
*/
|
*/
|
||||||
#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
|
#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
|
||||||
void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h) \
|
mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb); \
|
||||||
|
int kh_alloc_simple_##name(mrb_state *mrb, kh_##name##_t *h) \
|
||||||
{ \
|
{ \
|
||||||
khint_t sz = h->n_buckets; \
|
khint_t sz = h->n_buckets; \
|
||||||
size_t len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0); \
|
size_t len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0); \
|
||||||
uint8_t *p = (uint8_t*)mrb_malloc(mrb, sizeof(uint8_t)*sz/4+len*sz); \
|
uint8_t *p = (uint8_t*)mrb_malloc_simple(mrb, sizeof(uint8_t)*sz/4+len*sz); \
|
||||||
|
if (!p) { return 1; } \
|
||||||
h->size = h->n_occupied = 0; \
|
h->size = h->n_occupied = 0; \
|
||||||
h->keys = (khkey_t *)p; \
|
h->keys = (khkey_t *)p; \
|
||||||
h->vals = kh_is_map ? (khval_t *)(p+sizeof(khkey_t)*sz) : NULL; \
|
h->vals = kh_is_map ? (khval_t *)(p+sizeof(khkey_t)*sz) : NULL; \
|
||||||
h->ed_flags = p+len*sz; \
|
h->ed_flags = p+len*sz; \
|
||||||
kh_fill_flags(h->ed_flags, 0xaa, sz/4); \
|
kh_fill_flags(h->ed_flags, 0xaa, sz/4); \
|
||||||
|
return 0; \
|
||||||
|
} \
|
||||||
|
void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h) \
|
||||||
|
{ \
|
||||||
|
if (kh_alloc_simple_##name(mrb, h)) { \
|
||||||
|
mrb_raise_nomemory(mrb); \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) { \
|
kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) { \
|
||||||
kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \
|
kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \
|
||||||
@@ -112,7 +122,10 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|||||||
size = KHASH_MIN_SIZE; \
|
size = KHASH_MIN_SIZE; \
|
||||||
khash_power2(size); \
|
khash_power2(size); \
|
||||||
h->n_buckets = size; \
|
h->n_buckets = size; \
|
||||||
kh_alloc_##name(mrb, h); \
|
if (kh_alloc_simple_##name(mrb, h)) { \
|
||||||
|
mrb_free(mrb, h); \
|
||||||
|
mrb_raise_nomemory(mrb); \
|
||||||
|
} \
|
||||||
return h; \
|
return h; \
|
||||||
} \
|
} \
|
||||||
kh_##name##_t *kh_init_##name(mrb_state *mrb) { \
|
kh_##name##_t *kh_init_##name(mrb_state *mrb) { \
|
||||||
@@ -171,12 +184,16 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|||||||
mrb_free(mrb, old_keys); \
|
mrb_free(mrb, old_keys); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret) \
|
void kh_put_prepare_##name(mrb_state *mrb, kh_##name##_t *h) \
|
||||||
{ \
|
{ \
|
||||||
khint_t k, del_k, step = 0; \
|
|
||||||
if (h->n_occupied >= khash_upper_bound(h)) { \
|
if (h->n_occupied >= khash_upper_bound(h)) { \
|
||||||
kh_resize_##name(mrb, h, h->n_buckets*2); \
|
kh_resize_##name(mrb, h, h->n_buckets*2); \
|
||||||
} \
|
} \
|
||||||
|
} \
|
||||||
|
khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret) \
|
||||||
|
{ \
|
||||||
|
khint_t k, del_k, step = 0; \
|
||||||
|
kh_put_prepare_##name(mrb, h); \
|
||||||
k = __hash_func(mrb,key) & khash_mask(h); \
|
k = __hash_func(mrb,key) & khash_mask(h); \
|
||||||
del_k = kh_end(h); \
|
del_k = kh_end(h); \
|
||||||
while (!__ac_isempty(h->ed_flags, k)) { \
|
while (!__ac_isempty(h->ed_flags, k)) { \
|
||||||
@@ -239,6 +256,7 @@ kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
|
|||||||
#define kh_destroy(name, mrb, h) kh_destroy_##name(mrb, h)
|
#define kh_destroy(name, mrb, h) kh_destroy_##name(mrb, h)
|
||||||
#define kh_clear(name, mrb, h) kh_clear_##name(mrb, h)
|
#define kh_clear(name, mrb, h) kh_clear_##name(mrb, h)
|
||||||
#define kh_resize(name, mrb, h, s) kh_resize_##name(mrb, h, s)
|
#define kh_resize(name, mrb, h, s) kh_resize_##name(mrb, h, s)
|
||||||
|
#define kh_put_prepare(name, mrb, h) kh_put_prepare_##name(mrb, h)
|
||||||
#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k, NULL)
|
#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k, NULL)
|
||||||
#define kh_put2(name, mrb, h, k, r) kh_put_##name(mrb, h, k, r)
|
#define kh_put2(name, mrb, h, k, r) kh_put_##name(mrb, h, k, r)
|
||||||
#define kh_get(name, mrb, h, k) kh_get_##name(mrb, h, k)
|
#define kh_get(name, mrb, h, k) kh_get_##name(mrb, h, k)
|
||||||
|
|||||||
+42
-7
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/numeric.h - Numeric, Integer, Float, Fixnum class
|
** @file mruby/numeric.h - Numeric, Integer, Float, Fixnum class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -23,7 +23,11 @@ MRB_BEGIN_DECL
|
|||||||
#define NEGFIXABLE(f) TYPED_NEGFIXABLE(f,mrb_int)
|
#define NEGFIXABLE(f) TYPED_NEGFIXABLE(f,mrb_int)
|
||||||
#define FIXABLE(f) TYPED_FIXABLE(f,mrb_int)
|
#define FIXABLE(f) TYPED_FIXABLE(f,mrb_int)
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
#define FIXABLE_FLOAT(f) TYPED_FIXABLE(f,double)
|
#ifdef MRB_INT64
|
||||||
|
#define FIXABLE_FLOAT(f) ((f)>=-9223372036854775808.0 && (f)<9223372036854775808.0)
|
||||||
|
#else
|
||||||
|
#define FIXABLE_FLOAT(f) TYPED_FIXABLE(f,mrb_float)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
@@ -33,13 +37,14 @@ MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base);
|
|||||||
/* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */
|
/* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
MRB_API mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt);
|
MRB_API mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt);
|
||||||
|
MRB_API int mrb_float_to_cstr(mrb_state *mrb, char *buf, size_t len, const char *fmt, mrb_float f);
|
||||||
MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x);
|
MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x);
|
||||||
|
MRB_API mrb_value mrb_int_value(mrb_state *mrb, mrb_float f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y);
|
MRB_API mrb_value mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||||
mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y);
|
MRB_API mrb_value mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||||
mrb_value mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y);
|
MRB_API mrb_value mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||||
mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
|
|
||||||
|
|
||||||
#ifndef __has_builtin
|
#ifndef __has_builtin
|
||||||
#define __has_builtin(x) 0
|
#define __has_builtin(x) 0
|
||||||
@@ -156,6 +161,36 @@ mrb_int_mul_overflow(mrb_int multiplier, mrb_int multiplicand, mrb_int *product)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
|
# include <stdint.h>
|
||||||
|
# include <float.h>
|
||||||
|
|
||||||
|
# define MRB_FLT_RADIX FLT_RADIX
|
||||||
|
|
||||||
|
# ifdef MRB_USE_FLOAT
|
||||||
|
# define MRB_FLT_MANT_DIG FLT_MANT_DIG
|
||||||
|
# define MRB_FLT_EPSILON FLT_EPSILON
|
||||||
|
# define MRB_FLT_DIG FLT_DIG
|
||||||
|
# define MRB_FLT_MIN_EXP FLT_MIN_EXP
|
||||||
|
# define MRB_FLT_MIN FLT_MIN
|
||||||
|
# define MRB_FLT_MIN_10_EXP FLT_MIN_10_EXP
|
||||||
|
# define MRB_FLT_MAX_EXP FLT_MAX_EXP
|
||||||
|
# define MRB_FLT_MAX FLT_MAX
|
||||||
|
# define MRB_FLT_MAX_10_EXP FLT_MAX_10_EXP
|
||||||
|
|
||||||
|
# else /* not MRB_USE_FLOAT */
|
||||||
|
# define MRB_FLT_MANT_DIG DBL_MANT_DIG
|
||||||
|
# define MRB_FLT_EPSILON DBL_EPSILON
|
||||||
|
# define MRB_FLT_DIG DBL_DIG
|
||||||
|
# define MRB_FLT_MIN_EXP DBL_MIN_EXP
|
||||||
|
# define MRB_FLT_MIN DBL_MIN
|
||||||
|
# define MRB_FLT_MIN_10_EXP DBL_MIN_10_EXP
|
||||||
|
# define MRB_FLT_MAX_EXP DBL_MAX_EXP
|
||||||
|
# define MRB_FLT_MAX DBL_MAX
|
||||||
|
# define MRB_FLT_MAX_10_EXP DBL_MAX_10_EXP
|
||||||
|
# endif /* MRB_USE_FLOAT */
|
||||||
|
#endif /* MRB_WITHOUT_FLOAT */
|
||||||
|
|
||||||
MRB_END_DECL
|
MRB_END_DECL
|
||||||
|
|
||||||
#endif /* MRUBY_NUMERIC_H */
|
#endif /* MRUBY_NUMERIC_H */
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/object.h - mruby object definition
|
** @file mruby/object.h - mruby object definition
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -8,15 +8,14 @@
|
|||||||
#define MRUBY_OBJECT_H
|
#define MRUBY_OBJECT_H
|
||||||
|
|
||||||
#define MRB_OBJECT_HEADER \
|
#define MRB_OBJECT_HEADER \
|
||||||
enum mrb_vtype tt:8;\
|
struct RClass *c; \
|
||||||
uint32_t color:3;\
|
struct RBasic *gcnext; \
|
||||||
uint32_t flags:21;\
|
enum mrb_vtype tt:8; \
|
||||||
struct RClass *c;\
|
uint32_t color:3; \
|
||||||
struct RBasic *gcnext
|
uint32_t flags:21
|
||||||
|
|
||||||
#define MRB_FLAG_TEST(obj, flag) ((obj)->flags & (flag))
|
#define MRB_FLAG_TEST(obj, flag) ((obj)->flags & (flag))
|
||||||
|
|
||||||
|
|
||||||
struct RBasic {
|
struct RBasic {
|
||||||
MRB_OBJECT_HEADER;
|
MRB_OBJECT_HEADER;
|
||||||
};
|
};
|
||||||
@@ -26,6 +25,7 @@ struct RBasic {
|
|||||||
#define MRB_FROZEN_P(o) ((o)->flags & MRB_FL_OBJ_IS_FROZEN)
|
#define MRB_FROZEN_P(o) ((o)->flags & MRB_FL_OBJ_IS_FROZEN)
|
||||||
#define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FL_OBJ_IS_FROZEN)
|
#define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FL_OBJ_IS_FROZEN)
|
||||||
#define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FL_OBJ_IS_FROZEN)
|
#define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FL_OBJ_IS_FROZEN)
|
||||||
|
#define mrb_frozen_p(o) MRB_FROZEN_P(o)
|
||||||
|
|
||||||
struct RObject {
|
struct RObject {
|
||||||
MRB_OBJECT_HEADER;
|
MRB_OBJECT_HEADER;
|
||||||
@@ -33,7 +33,6 @@ struct RObject {
|
|||||||
};
|
};
|
||||||
#define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v)))
|
#define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v)))
|
||||||
|
|
||||||
#define mrb_immediate_p(x) (mrb_type(x) < MRB_TT_HAS_BASIC)
|
|
||||||
#define mrb_special_const_p(x) mrb_immediate_p(x)
|
#define mrb_special_const_p(x) mrb_immediate_p(x)
|
||||||
|
|
||||||
struct RFiber {
|
struct RFiber {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/opcode.h - RiteVM operation codes
|
** @file mruby/opcode.h - RiteVM operation codes
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
|
|||||||
+9
-8
@@ -45,9 +45,9 @@ OPCODE(SETMCNST, BB) /* R(a+1)::Syms(b) = R(a) */
|
|||||||
OPCODE(GETUPVAR, BBB) /* R(a) = uvget(b,c) */
|
OPCODE(GETUPVAR, BBB) /* R(a) = uvget(b,c) */
|
||||||
OPCODE(SETUPVAR, BBB) /* uvset(b,c,R(a)) */
|
OPCODE(SETUPVAR, BBB) /* uvset(b,c,R(a)) */
|
||||||
OPCODE(JMP, S) /* pc=a */
|
OPCODE(JMP, S) /* pc=a */
|
||||||
OPCODE(JMPIF, BS) /* if R(b) pc=a */
|
OPCODE(JMPIF, BS) /* if R(a) pc=b */
|
||||||
OPCODE(JMPNOT, BS) /* if !R(b) pc=a */
|
OPCODE(JMPNOT, BS) /* if !R(a) pc=b */
|
||||||
OPCODE(JMPNIL, BS) /* if R(b)==nil pc=a */
|
OPCODE(JMPNIL, BS) /* if R(a)==nil pc=b */
|
||||||
OPCODE(ONERR, S) /* rescue_push(a) */
|
OPCODE(ONERR, S) /* rescue_push(a) */
|
||||||
OPCODE(EXCEPT, B) /* R(a) = exc */
|
OPCODE(EXCEPT, B) /* R(a) = exc */
|
||||||
OPCODE(RESCUE, BB) /* R(b) = R(a).isa?(R(b)) */
|
OPCODE(RESCUE, BB) /* R(b) = R(a).isa?(R(b)) */
|
||||||
@@ -58,7 +58,7 @@ OPCODE(EPOP, B) /* A.times{ensure_pop().call} */
|
|||||||
OPCODE(SENDV, BB) /* R(a) = call(R(a),Syms(b),*R(a+1)) */
|
OPCODE(SENDV, BB) /* R(a) = call(R(a),Syms(b),*R(a+1)) */
|
||||||
OPCODE(SENDVB, BB) /* R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2)) */
|
OPCODE(SENDVB, BB) /* R(a) = call(R(a),Syms(b),*R(a+1),&R(a+2)) */
|
||||||
OPCODE(SEND, BBB) /* R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c)) */
|
OPCODE(SEND, BBB) /* R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c)) */
|
||||||
OPCODE(SENDB, BBB) /* R(a) = call(R(a),Syms(Bx),R(a+1),...,R(a+c),&R(a+c+1)) */
|
OPCODE(SENDB, BBB) /* R(a) = call(R(a),Syms(b),R(a+1),...,R(a+c),&R(a+c+1)) */
|
||||||
OPCODE(CALL, Z) /* R(0) = self.call(frame.argc, frame.argv) */
|
OPCODE(CALL, Z) /* R(0) = self.call(frame.argc, frame.argv) */
|
||||||
OPCODE(SUPER, BB) /* R(a) = super(R(a+1),... ,R(a+b+1)) */
|
OPCODE(SUPER, BB) /* R(a) = super(R(a+1),... ,R(a+b+1)) */
|
||||||
OPCODE(ARGARY, BS) /* R(a) = argument array (16=m5:r1:m5:d1:lv4) */
|
OPCODE(ARGARY, BS) /* R(a) = argument array (16=m5:r1:m5:d1:lv4) */
|
||||||
@@ -71,9 +71,9 @@ OPCODE(RETURN_BLK, B) /* return R(a) (in-block return) */
|
|||||||
OPCODE(BREAK, B) /* break R(a) */
|
OPCODE(BREAK, B) /* break R(a) */
|
||||||
OPCODE(BLKPUSH, BS) /* R(a) = block (16=m5:r1:m5:d1:lv4) */
|
OPCODE(BLKPUSH, BS) /* R(a) = block (16=m5:r1:m5:d1:lv4) */
|
||||||
OPCODE(ADD, B) /* R(a) = R(a)+R(a+1) */
|
OPCODE(ADD, B) /* R(a) = R(a)+R(a+1) */
|
||||||
OPCODE(ADDI, BB) /* R(a) = R(a)+mrb_int(c) */
|
OPCODE(ADDI, BB) /* R(a) = R(a)+mrb_int(b) */
|
||||||
OPCODE(SUB, B) /* R(a) = R(a)-R(a+1) */
|
OPCODE(SUB, B) /* R(a) = R(a)-R(a+1) */
|
||||||
OPCODE(SUBI, BB) /* R(a) = R(a)-C */
|
OPCODE(SUBI, BB) /* R(a) = R(a)-mrb_int(b) */
|
||||||
OPCODE(MUL, B) /* R(a) = R(a)*R(a+1) */
|
OPCODE(MUL, B) /* R(a) = R(a)*R(a+1) */
|
||||||
OPCODE(DIV, B) /* R(a) = R(a)/R(a+1) */
|
OPCODE(DIV, B) /* R(a) = R(a)/R(a+1) */
|
||||||
OPCODE(EQ, B) /* R(a) = R(a)==R(a+1) */
|
OPCODE(EQ, B) /* R(a) = R(a)==R(a+1) */
|
||||||
@@ -92,8 +92,8 @@ OPCODE(APOST, BBB) /* *R(a),R(a+1)..R(a+c) = R(a)[b..] */
|
|||||||
OPCODE(INTERN, B) /* R(a) = intern(R(a)) */
|
OPCODE(INTERN, B) /* R(a) = intern(R(a)) */
|
||||||
OPCODE(STRING, BB) /* R(a) = str_dup(Lit(b)) */
|
OPCODE(STRING, BB) /* R(a) = str_dup(Lit(b)) */
|
||||||
OPCODE(STRCAT, B) /* str_cat(R(a),R(a+1)) */
|
OPCODE(STRCAT, B) /* str_cat(R(a),R(a+1)) */
|
||||||
OPCODE(HASH, BB) /* R(a) = hash_new(R(a),R(a+1)..R(a+b)) */
|
OPCODE(HASH, BB) /* R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1)) */
|
||||||
OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b)) */
|
OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b*2)) */
|
||||||
OPCODE(HASHCAT, B) /* R(a) = hash_cat(R(a),R(a+1)) */
|
OPCODE(HASHCAT, B) /* R(a) = hash_cat(R(a),R(a+1)) */
|
||||||
OPCODE(LAMBDA, BB) /* R(a) = lambda(SEQ[b],L_LAMBDA) */
|
OPCODE(LAMBDA, BB) /* R(a) = lambda(SEQ[b],L_LAMBDA) */
|
||||||
OPCODE(BLOCK, BB) /* R(a) = lambda(SEQ[b],L_BLOCK) */
|
OPCODE(BLOCK, BB) /* R(a) = lambda(SEQ[b],L_BLOCK) */
|
||||||
@@ -115,3 +115,4 @@ OPCODE(EXT1, Z) /* make 1st operand 16bit */
|
|||||||
OPCODE(EXT2, Z) /* make 2nd operand 16bit */
|
OPCODE(EXT2, Z) /* make 2nd operand 16bit */
|
||||||
OPCODE(EXT3, Z) /* make 1st and 2nd operands 16bit */
|
OPCODE(EXT3, Z) /* make 1st and 2nd operands 16bit */
|
||||||
OPCODE(STOP, Z) /* stop VM */
|
OPCODE(STOP, Z) /* stop VM */
|
||||||
|
OPCODE(LOADI16, BS) /* R(a) = mrb_int(b) */
|
||||||
|
|||||||
+32
-21
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/proc.h - Proc class
|
** @file mruby/proc.h - Proc class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -22,14 +22,19 @@ struct REnv {
|
|||||||
mrb_sym mid;
|
mrb_sym mid;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* flags (21bits): 1(shared flag):10(cioff/bidx):10(stack_len) */
|
/* flags (21bits): 1(close):1(touched):1(heap):8(cioff/bidx):8(stack_len) */
|
||||||
#define MRB_ENV_SET_STACK_LEN(e,len) ((e)->flags = (((e)->flags & ~0x3ff)|((unsigned int)(len) & 0x3ff)))
|
#define MRB_ENV_SET_LEN(e,len) ((e)->flags = (((e)->flags & ~0xff)|((unsigned int)(len) & 0xff)))
|
||||||
#define MRB_ENV_STACK_LEN(e) ((mrb_int)((e)->flags & 0x3ff))
|
#define MRB_ENV_LEN(e) ((mrb_int)((e)->flags & 0xff))
|
||||||
#define MRB_ENV_STACK_UNSHARED (1<<20)
|
#define MRB_ENV_CLOSED (1<<20)
|
||||||
#define MRB_ENV_UNSHARE_STACK(e) ((e)->flags |= MRB_ENV_STACK_UNSHARED)
|
#define MRB_ENV_TOUCHED (1<<19)
|
||||||
#define MRB_ENV_STACK_SHARED_P(e) (((e)->flags & MRB_ENV_STACK_UNSHARED) == 0)
|
#define MRB_ENV_HEAPED (1<<18)
|
||||||
#define MRB_ENV_BIDX(e) (((e)->flags >> 10) & 0x3ff)
|
#define MRB_ENV_CLOSE(e) ((e)->flags |= MRB_ENV_CLOSED)
|
||||||
#define MRB_ENV_SET_BIDX(e,idx) ((e)->flags = (((e)->flags & ~(0x3ff<<10))|((unsigned int)(idx) & 0x3ff)<<10))
|
#define MRB_ENV_TOUCH(e) ((e)->flags |= MRB_ENV_TOUCHED)
|
||||||
|
#define MRB_ENV_HEAP(e) ((e)->flags |= MRB_ENV_HEAPED)
|
||||||
|
#define MRB_ENV_HEAP_P(e) ((e)->flags & MRB_ENV_HEAPED)
|
||||||
|
#define MRB_ENV_ONSTACK_P(e) (((e)->flags & MRB_ENV_CLOSED) == 0)
|
||||||
|
#define MRB_ENV_BIDX(e) (((e)->flags >> 8) & 0xff)
|
||||||
|
#define MRB_ENV_SET_BIDX(e,idx) ((e)->flags = (((e)->flags & ~(0xff<<8))|((unsigned int)(idx) & 0xff)<<8))
|
||||||
|
|
||||||
void mrb_env_unshare(mrb_state*, struct REnv*);
|
void mrb_env_unshare(mrb_state*, struct REnv*);
|
||||||
|
|
||||||
@@ -86,38 +91,44 @@ struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
|
|||||||
MRB_API struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
|
MRB_API struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
|
||||||
MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals);
|
MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals);
|
||||||
void mrb_proc_copy(struct RProc *a, struct RProc *b);
|
void mrb_proc_copy(struct RProc *a, struct RProc *b);
|
||||||
|
mrb_int mrb_proc_arity(const struct RProc *p);
|
||||||
|
|
||||||
/* implementation of #send method */
|
/* implementation of #send method */
|
||||||
mrb_value mrb_f_send(mrb_state *mrb, mrb_value self);
|
mrb_value mrb_f_send(mrb_state *mrb, mrb_value self);
|
||||||
|
|
||||||
/* following functions are defined in mruby-proc-ext so please include it when using */
|
/* following functions are defined in mruby-proc-ext so please include it when using */
|
||||||
MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state*, mrb_func_t, mrb_int, const mrb_value*);
|
MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv);
|
||||||
MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state*, mrb_int);
|
MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx);
|
||||||
/* old name */
|
/* old name */
|
||||||
#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
|
#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
|
||||||
|
|
||||||
#ifdef MRB_METHOD_TABLE_INLINE
|
#define MRB_METHOD_FUNC_FL 1
|
||||||
|
#define MRB_METHOD_NOARG_FL 2
|
||||||
|
#ifndef MRB_METHOD_T_STRUCT
|
||||||
|
|
||||||
#define MRB_METHOD_FUNC_FL ((uintptr_t)1)
|
|
||||||
#define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL)
|
#define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL)
|
||||||
#define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)&(~MRB_METHOD_FUNC_FL)))
|
#define MRB_METHOD_NOARG_P(m) (((uintptr_t)(m))&MRB_METHOD_NOARG_FL)
|
||||||
#define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((struct RProc*)((uintptr_t)(fn)|MRB_METHOD_FUNC_FL)))
|
#define MRB_METHOD_NOARG_SET(m) ((m)=(mrb_method_t)(((uintptr_t)(m))|MRB_METHOD_NOARG_FL))
|
||||||
#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(struct RProc*)(pr))
|
#define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)>>2))
|
||||||
|
#define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))<<2)|MRB_METHOD_FUNC_FL))
|
||||||
|
#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(pr))
|
||||||
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
|
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
|
||||||
#define MRB_METHOD_PROC(m) ((struct RProc*)(m))
|
#define MRB_METHOD_PROC(m) ((struct RProc*)(m))
|
||||||
#define MRB_METHOD_UNDEF_P(m) ((m)==0)
|
#define MRB_METHOD_UNDEF_P(m) ((m)==0)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define MRB_METHOD_FUNC_P(m) ((m).func_p)
|
#define MRB_METHOD_FUNC_P(m) ((m).flags&MRB_METHOD_FUNC_FL)
|
||||||
|
#define MRB_METHOD_NOARG_P(m) ((m).flags&MRB_METHOD_NOARG_FL)
|
||||||
#define MRB_METHOD_FUNC(m) ((m).func)
|
#define MRB_METHOD_FUNC(m) ((m).func)
|
||||||
#define MRB_METHOD_FROM_FUNC(m,fn) do{(m).func_p=TRUE;(m).func=(fn);}while(0)
|
#define MRB_METHOD_NOARG_SET(m) do{(m).flags|=MRB_METHOD_NOARG_FL;}while(0)
|
||||||
#define MRB_METHOD_FROM_PROC(m,pr) do{(m).func_p=FALSE;(m).proc=(pr);}while(0)
|
#define MRB_METHOD_FROM_FUNC(m,fn) do{(m).flags=MRB_METHOD_FUNC_FL;(m).func=(fn);}while(0)
|
||||||
|
#define MRB_METHOD_FROM_PROC(m,pr) do{(m).flags=0;(m).proc=(pr);}while(0)
|
||||||
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
|
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
|
||||||
#define MRB_METHOD_PROC(m) ((m).proc)
|
#define MRB_METHOD_PROC(m) ((m).proc)
|
||||||
#define MRB_METHOD_UNDEF_P(m) ((m).proc==NULL)
|
#define MRB_METHOD_UNDEF_P(m) ((m).proc==NULL)
|
||||||
|
|
||||||
#endif /* MRB_METHOD_TABLE_INLINE */
|
#endif /* MRB_METHOD_T_STRUCT */
|
||||||
|
|
||||||
#define MRB_METHOD_CFUNC_P(m) (MRB_METHOD_FUNC_P(m)?TRUE:(MRB_METHOD_PROC(m)?(MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m))):FALSE))
|
#define MRB_METHOD_CFUNC_P(m) (MRB_METHOD_FUNC_P(m)?TRUE:(MRB_METHOD_PROC(m)?(MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m))):FALSE))
|
||||||
#define MRB_METHOD_CFUNC(m) (MRB_METHOD_FUNC_P(m)?MRB_METHOD_FUNC(m):((MRB_METHOD_PROC(m)&&MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m)))?MRB_PROC_CFUNC(MRB_METHOD_PROC(m)):NULL))
|
#define MRB_METHOD_CFUNC(m) (MRB_METHOD_FUNC_P(m)?MRB_METHOD_FUNC(m):((MRB_METHOD_PROC(m)&&MRB_PROC_CFUNC_P(MRB_METHOD_PROC(m)))?MRB_PROC_CFUNC(MRB_METHOD_PROC(m)):NULL))
|
||||||
|
|||||||
+10
-4
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/range.h - Range class
|
** @file mruby/range.h - Range class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
MRB_BEGIN_DECL
|
MRB_BEGIN_DECL
|
||||||
|
|
||||||
#if defined(MRB_NAN_BOXING) || defined(MRB_WORD_BOXING)
|
#if defined(MRB_NAN_BOXING) && defined(MRB_64BIT) || defined(MRB_WORD_BOXING)
|
||||||
# define MRB_RANGE_EMBED
|
# define MRB_RANGE_EMBED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -64,7 +64,13 @@ MRB_API struct RRange* mrb_range_ptr(mrb_state *mrb, mrb_value range);
|
|||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_range_new(mrb_state *mrb, mrb_value start, mrb_value end, mrb_bool exclude);
|
MRB_API mrb_value mrb_range_new(mrb_state *mrb, mrb_value start, mrb_value end, mrb_bool exclude);
|
||||||
|
|
||||||
MRB_API mrb_int mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc);
|
enum mrb_range_beg_len {
|
||||||
|
MRB_RANGE_TYPE_MISMATCH = 0, /* (failure) not range */
|
||||||
|
MRB_RANGE_OK = 1, /* (success) range */
|
||||||
|
MRB_RANGE_OUT = 2 /* (failure) out of range */
|
||||||
|
};
|
||||||
|
|
||||||
|
MRB_API enum mrb_range_beg_len mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc);
|
||||||
mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int));
|
mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int));
|
||||||
void mrb_gc_mark_range(mrb_state *mrb, struct RRange *r);
|
void mrb_gc_mark_range(mrb_state *mrb, struct RRange *r);
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/re.h - Regexp class
|
** @file mruby/re.h - Regexp class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
|
|||||||
+133
-109
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/string.h - String class
|
** @file mruby/string.h - String class
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -16,23 +16,30 @@ MRB_BEGIN_DECL
|
|||||||
|
|
||||||
extern const char mrb_digitmap[];
|
extern const char mrb_digitmap[];
|
||||||
|
|
||||||
#define RSTRING_EMBED_LEN_MAX ((mrb_int)(sizeof(void*) * 3 - 1))
|
#define RSTRING_EMBED_LEN_MAX \
|
||||||
|
((mrb_int)(sizeof(void*) * 3 + sizeof(void*) - 32 / CHAR_BIT - 1))
|
||||||
|
|
||||||
struct RString {
|
struct RString {
|
||||||
MRB_OBJECT_HEADER;
|
MRB_OBJECT_HEADER;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
mrb_int len;
|
mrb_ssize len;
|
||||||
union {
|
union {
|
||||||
mrb_int capa;
|
mrb_ssize capa;
|
||||||
struct mrb_shared_string *shared;
|
struct mrb_shared_string *shared;
|
||||||
struct RString *fshared;
|
struct RString *fshared;
|
||||||
} aux;
|
} aux;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
} heap;
|
} heap;
|
||||||
char ary[RSTRING_EMBED_LEN_MAX + 1];
|
|
||||||
} as;
|
} as;
|
||||||
};
|
};
|
||||||
|
struct RStringEmbed {
|
||||||
|
MRB_OBJECT_HEADER;
|
||||||
|
char ary[];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RSTR_SET_TYPE_FLAG(s, type) (RSTR_UNSET_TYPE_FLAG(s), (s)->flags |= MRB_STR_##type)
|
||||||
|
#define RSTR_UNSET_TYPE_FLAG(s) ((s)->flags &= ~(MRB_STR_TYPE_MASK|MRB_STR_EMBED_LEN_MASK))
|
||||||
|
|
||||||
#define RSTR_EMBED_P(s) ((s)->flags & MRB_STR_EMBED)
|
#define RSTR_EMBED_P(s) ((s)->flags & MRB_STR_EMBED)
|
||||||
#define RSTR_SET_EMBED_FLAG(s) ((s)->flags |= MRB_STR_EMBED)
|
#define RSTR_SET_EMBED_FLAG(s) ((s)->flags |= MRB_STR_EMBED)
|
||||||
@@ -47,12 +54,15 @@ struct RString {
|
|||||||
RSTR_SET_EMBED_LEN((s),(n));\
|
RSTR_SET_EMBED_LEN((s),(n));\
|
||||||
}\
|
}\
|
||||||
else {\
|
else {\
|
||||||
(s)->as.heap.len = (mrb_int)(n);\
|
(s)->as.heap.len = (mrb_ssize)(n);\
|
||||||
}\
|
}\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
#define RSTR_EMBED_PTR(s) (((struct RStringEmbed*)(s))->ary)
|
||||||
#define RSTR_EMBED_LEN(s)\
|
#define RSTR_EMBED_LEN(s)\
|
||||||
(mrb_int)(((s)->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT)
|
(mrb_int)(((s)->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT)
|
||||||
#define RSTR_PTR(s) ((RSTR_EMBED_P(s)) ? (s)->as.ary : (s)->as.heap.ptr)
|
#define RSTR_EMBEDDABLE_P(len) ((len) <= RSTRING_EMBED_LEN_MAX)
|
||||||
|
|
||||||
|
#define RSTR_PTR(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_PTR(s) : (s)->as.heap.ptr)
|
||||||
#define RSTR_LEN(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_LEN(s) : (s)->as.heap.len)
|
#define RSTR_LEN(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_LEN(s) : (s)->as.heap.len)
|
||||||
#define RSTR_CAPA(s) (RSTR_EMBED_P(s) ? RSTRING_EMBED_LEN_MAX : (s)->as.heap.aux.capa)
|
#define RSTR_CAPA(s) (RSTR_EMBED_P(s) ? RSTRING_EMBED_LEN_MAX : (s)->as.heap.aux.capa)
|
||||||
|
|
||||||
@@ -68,10 +78,24 @@ struct RString {
|
|||||||
#define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE)
|
#define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE)
|
||||||
#define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE)
|
#define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE)
|
||||||
|
|
||||||
|
#ifdef MRB_UTF8_STRING
|
||||||
|
# define RSTR_ASCII_P(s) ((s)->flags & MRB_STR_ASCII)
|
||||||
|
# define RSTR_SET_ASCII_FLAG(s) ((s)->flags |= MRB_STR_ASCII)
|
||||||
|
# define RSTR_UNSET_ASCII_FLAG(s) ((s)->flags &= ~MRB_STR_ASCII)
|
||||||
|
# define RSTR_WRITE_ASCII_FLAG(s, v) (RSTR_UNSET_ASCII_FLAG(s), (s)->flags |= v)
|
||||||
|
# define RSTR_COPY_ASCII_FLAG(dst, src) RSTR_WRITE_ASCII_FLAG(dst, RSTR_ASCII_P(src))
|
||||||
|
#else
|
||||||
|
# define RSTR_ASCII_P(s) (void)0
|
||||||
|
# define RSTR_SET_ASCII_FLAG(s) (void)0
|
||||||
|
# define RSTR_UNSET_ASCII_FLAG(s) (void)0
|
||||||
|
# define RSTR_WRITE_ASCII_FLAG(s, v) (void)0
|
||||||
|
# define RSTR_COPY_ASCII_FLAG(dst, src) (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
#define RSTR_POOL_P(s) ((s)->flags & MRB_STR_POOL)
|
#define RSTR_POOL_P(s) ((s)->flags & MRB_STR_POOL)
|
||||||
#define RSTR_SET_POOL_FLAG(s) ((s)->flags |= MRB_STR_POOL)
|
#define RSTR_SET_POOL_FLAG(s) ((s)->flags |= MRB_STR_POOL)
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a pointer from a Ruby string
|
* Returns a pointer from a Ruby string
|
||||||
*/
|
*/
|
||||||
#define mrb_str_ptr(s) ((struct RString*)(mrb_ptr(s)))
|
#define mrb_str_ptr(s) ((struct RString*)(mrb_ptr(s)))
|
||||||
@@ -82,32 +106,38 @@ struct RString {
|
|||||||
#define RSTRING_CAPA(s) RSTR_CAPA(RSTRING(s))
|
#define RSTRING_CAPA(s) RSTR_CAPA(RSTRING(s))
|
||||||
#define RSTRING_END(s) (RSTRING_PTR(s) + RSTRING_LEN(s))
|
#define RSTRING_END(s) (RSTRING_PTR(s) + RSTRING_LEN(s))
|
||||||
MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*);
|
MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*);
|
||||||
|
#define RSTRING_CSTR(mrb,s) mrb_string_cstr(mrb, s)
|
||||||
|
|
||||||
#define MRB_STR_SHARED 1
|
#define MRB_STR_SHARED 1
|
||||||
#define MRB_STR_FSHARED 2
|
#define MRB_STR_FSHARED 2
|
||||||
#define MRB_STR_NOFREE 4
|
#define MRB_STR_NOFREE 4
|
||||||
#define MRB_STR_POOL 8
|
#define MRB_STR_EMBED 8 /* type flags up to here */
|
||||||
#define MRB_STR_NO_UTF 16
|
#define MRB_STR_POOL 16 /* status flags from here */
|
||||||
#define MRB_STR_EMBED 32
|
#define MRB_STR_ASCII 32
|
||||||
#define MRB_STR_EMBED_LEN_MASK 0x7c0
|
|
||||||
#define MRB_STR_EMBED_LEN_SHIFT 6
|
#define MRB_STR_EMBED_LEN_SHIFT 6
|
||||||
|
#define MRB_STR_EMBED_LEN_BIT 5
|
||||||
|
#define MRB_STR_EMBED_LEN_MASK (((1 << MRB_STR_EMBED_LEN_BIT) - 1) << MRB_STR_EMBED_LEN_SHIFT)
|
||||||
|
#define MRB_STR_TYPE_MASK (MRB_STR_POOL - 1)
|
||||||
|
|
||||||
|
|
||||||
void mrb_gc_free_str(mrb_state*, struct RString*);
|
void mrb_gc_free_str(mrb_state*, struct RString*);
|
||||||
MRB_API void mrb_str_modify(mrb_state*, struct RString*);
|
|
||||||
|
|
||||||
/*
|
MRB_API void mrb_str_modify(mrb_state *mrb, struct RString *s);
|
||||||
|
/* mrb_str_modify() with keeping ASCII flag if set */
|
||||||
|
MRB_API void mrb_str_modify_keep_ascii(mrb_state *mrb, struct RString *s);
|
||||||
|
|
||||||
|
/**
|
||||||
* Finds the index of a substring in a string
|
* Finds the index of a substring in a string
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_int mrb_str_index(mrb_state*, mrb_value, const char*, mrb_int, mrb_int);
|
MRB_API mrb_int mrb_str_index(mrb_state *mrb, mrb_value str, const char *p, mrb_int len, mrb_int offset);
|
||||||
#define mrb_str_index_lit(mrb, str, lit, off) mrb_str_index(mrb, str, lit, mrb_strlen_lit(lit), off);
|
#define mrb_str_index_lit(mrb, str, lit, off) mrb_str_index(mrb, str, lit, mrb_strlen_lit(lit), off);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Appends self to other. Returns self as a concatenated string.
|
* Appends self to other. Returns self as a concatenated string.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
*
|
*
|
||||||
* !!!c
|
|
||||||
* int
|
* int
|
||||||
* main(int argc,
|
* main(int argc,
|
||||||
* char **argv)
|
* char **argv)
|
||||||
@@ -129,32 +159,30 @@ MRB_API mrb_int mrb_str_index(mrb_state*, mrb_value, const char*, mrb_int, mrb_i
|
|||||||
* // Concatenates str2 to str1.
|
* // Concatenates str2 to str1.
|
||||||
* mrb_str_concat(mrb, str1, str2);
|
* mrb_str_concat(mrb, str1, str2);
|
||||||
*
|
*
|
||||||
* // Prints new Concatenated Ruby string.
|
* // Prints new Concatenated Ruby string.
|
||||||
* mrb_p(mrb, str1);
|
* mrb_p(mrb, str1);
|
||||||
*
|
*
|
||||||
* mrb_close(mrb);
|
* mrb_close(mrb);
|
||||||
* return 0;
|
* return 0;
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
*
|
* Result:
|
||||||
* Result:
|
|
||||||
*
|
*
|
||||||
* => "abcdef"
|
* => "abcdef"
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] self String to concatenate.
|
* @param self String to concatenate.
|
||||||
* @param [mrb_value] other String to append to self.
|
* @param other String to append to self.
|
||||||
* @return [mrb_value] Returns a new String appending other to self.
|
* @return [mrb_value] Returns a new String appending other to self.
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
|
MRB_API void mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Adds two strings together.
|
* Adds two strings together.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
*
|
*
|
||||||
* !!!c
|
|
||||||
* int
|
* int
|
||||||
* main(int argc,
|
* main(int argc,
|
||||||
* char **argv)
|
* char **argv)
|
||||||
@@ -181,52 +209,51 @@ MRB_API void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
|
|||||||
* // Concatenates both Ruby strings.
|
* // Concatenates both Ruby strings.
|
||||||
* c = mrb_str_plus(mrb, a, b);
|
* c = mrb_str_plus(mrb, a, b);
|
||||||
*
|
*
|
||||||
* // Prints new Concatenated Ruby string.
|
* // Prints new Concatenated Ruby string.
|
||||||
* mrb_p(mrb, c);
|
* mrb_p(mrb, c);
|
||||||
*
|
*
|
||||||
* mrb_close(mrb);
|
* mrb_close(mrb);
|
||||||
* return 0;
|
* return 0;
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Result:
|
* Result:
|
||||||
*
|
*
|
||||||
* => "abc" # First string
|
* => "abc" # First string
|
||||||
* => "def" # Second string
|
* => "def" # Second string
|
||||||
* => "abcdef" # First & Second concatenated.
|
* => "abcdef" # First & Second concatenated.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] a First string to concatenate.
|
* @param a First string to concatenate.
|
||||||
* @param [mrb_value] b Second string to concatenate.
|
* @param b Second string to concatenate.
|
||||||
* @return [mrb_value] Returns a new String containing a concatenated to b.
|
* @return [mrb_value] Returns a new String containing a concatenated to b.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value);
|
MRB_API mrb_value mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Converts pointer into a Ruby string.
|
* Converts pointer into a Ruby string.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [void*] p The pointer to convert to Ruby string.
|
* @param p The pointer to convert to Ruby string.
|
||||||
* @return [mrb_value] Returns a new Ruby String.
|
* @return [mrb_value] Returns a new Ruby String.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_ptr_to_str(mrb_state *, void*);
|
MRB_API mrb_value mrb_ptr_to_str(mrb_state *mrb, void *p);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns an object as a Ruby string.
|
* Returns an object as a Ruby string.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] obj An object to return as a Ruby string.
|
* @param obj An object to return as a Ruby string.
|
||||||
* @return [mrb_value] An object as a Ruby string.
|
* @return [mrb_value] An object as a Ruby string.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj);
|
MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Resizes the string's length. Returns the amount of characters
|
* Resizes the string's length. Returns the amount of characters
|
||||||
* in the specified by len.
|
* in the specified by len.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
*
|
*
|
||||||
* !!!c
|
|
||||||
* int
|
* int
|
||||||
* main(int argc,
|
* main(int argc,
|
||||||
* char **argv)
|
* char **argv)
|
||||||
@@ -251,21 +278,20 @@ MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj);
|
|||||||
*
|
*
|
||||||
* Result:
|
* Result:
|
||||||
*
|
*
|
||||||
* => "Hello"
|
* => "Hello"
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str The Ruby string to resize.
|
* @param str The Ruby string to resize.
|
||||||
* @param [mrb_value] len The length.
|
* @param len The length.
|
||||||
* @return [mrb_value] An object as a Ruby string.
|
* @return [mrb_value] An object as a Ruby string.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
|
MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a sub string.
|
* Returns a sub string.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
*
|
*
|
||||||
* !!!c
|
|
||||||
* int
|
* int
|
||||||
* main(int argc,
|
* main(int argc,
|
||||||
* char const **argv)
|
* char const **argv)
|
||||||
@@ -291,24 +317,24 @@ MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
|
|||||||
* return 0;
|
* return 0;
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* Result:
|
* Result:
|
||||||
*
|
*
|
||||||
* => "He"
|
* => "He"
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str Ruby string.
|
* @param str Ruby string.
|
||||||
* @param [mrb_int] beg The beginning point of the sub-string.
|
* @param beg The beginning point of the sub-string.
|
||||||
* @param [mrb_int] len The end point of the sub-string.
|
* @param len The end point of the sub-string.
|
||||||
* @return [mrb_value] An object as a Ruby sub-string.
|
* @return [mrb_value] An object as a Ruby sub-string.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
|
MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a Ruby string type.
|
* Returns a Ruby string type.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str Ruby string.
|
* @param str Ruby string.
|
||||||
* @return [mrb_value] A Ruby string.
|
* @return [mrb_value] A Ruby string.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_ensure_string_type(mrb_state *mrb, mrb_value str);
|
MRB_API mrb_value mrb_ensure_string_type(mrb_state *mrb, mrb_value str);
|
||||||
@@ -320,33 +346,30 @@ MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str);
|
|||||||
MRB_API mrb_value mrb_str_new_capa(mrb_state *mrb, size_t capa);
|
MRB_API mrb_value mrb_str_new_capa(mrb_state *mrb, size_t capa);
|
||||||
MRB_API mrb_value mrb_str_buf_new(mrb_state *mrb, size_t capa);
|
MRB_API mrb_value mrb_str_buf_new(mrb_state *mrb, size_t capa);
|
||||||
|
|
||||||
MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr);
|
/* NULL terminated C string from mrb_value */
|
||||||
|
MRB_API const char *mrb_string_cstr(mrb_state *mrb, mrb_value str);
|
||||||
|
/* NULL terminated C string from mrb_value; `str` will be updated */
|
||||||
|
MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *str);
|
||||||
|
/* obslete: use RSTRING_PTR() */
|
||||||
MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value str);
|
MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value str);
|
||||||
/*
|
/* obslete: use RSTRING_LEN() */
|
||||||
* Returns the length of the Ruby string.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
|
||||||
* @param [mrb_value] str Ruby string.
|
|
||||||
* @return [mrb_int] The length of the passed in Ruby string.
|
|
||||||
*/
|
|
||||||
MRB_API mrb_int mrb_string_value_len(mrb_state *mrb, mrb_value str);
|
MRB_API mrb_int mrb_string_value_len(mrb_state *mrb, mrb_value str);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Duplicates a string object.
|
* Duplicates a string object.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str Ruby string.
|
* @param str Ruby string.
|
||||||
* @return [mrb_value] Duplicated Ruby string.
|
* @return [mrb_value] Duplicated Ruby string.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
|
MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a symbol from a passed in Ruby string.
|
* Returns a symbol from a passed in Ruby string.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] self Ruby string.
|
* @param self Ruby string.
|
||||||
* @return [mrb_value] A symbol.
|
* @return [mrb_value] A symbol.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
|
MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
|
||||||
@@ -356,40 +379,40 @@ MRB_API mrb_value mrb_cstr_to_inum(mrb_state *mrb, const char *s, mrb_int base,
|
|||||||
MRB_API double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck);
|
MRB_API double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck);
|
||||||
MRB_API double mrb_cstr_to_dbl(mrb_state *mrb, const char *s, mrb_bool badcheck);
|
MRB_API double mrb_cstr_to_dbl(mrb_state *mrb, const char *s, mrb_bool badcheck);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a converted string type.
|
* Returns a converted string type.
|
||||||
* For type checking, non converting `mrb_to_str` is recommended.
|
* For type checking, non converting `mrb_to_str` is recommended.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str);
|
MRB_API mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns true if the strings match and false if the strings don't match.
|
* Returns true if the strings match and false if the strings don't match.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str1 Ruby string to compare.
|
* @param str1 Ruby string to compare.
|
||||||
* @param [mrb_value] str2 Ruby string to compare.
|
* @param str2 Ruby string to compare.
|
||||||
* @return [mrb_value] boolean value.
|
* @return [mrb_value] boolean value.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2);
|
MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a concated string comprised of a Ruby string and a C string.
|
* Returns a concatenated string comprised of a Ruby string and a C string.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str Ruby string.
|
* @param str Ruby string.
|
||||||
* @param [const char *] ptr A C string.
|
* @param ptr A C string.
|
||||||
* @param [size_t] len length of C string.
|
* @param len length of C string.
|
||||||
* @return [mrb_value] A Ruby string.
|
* @return [mrb_value] A Ruby string.
|
||||||
* @see mrb_str_cat_cstr
|
* @see mrb_str_cat_cstr
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len);
|
MRB_API mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a concated string comprised of a Ruby string and a C string.
|
* Returns a concatenated string comprised of a Ruby string and a C string.
|
||||||
*
|
*
|
||||||
* @param [mrb_state] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str Ruby string.
|
* @param str Ruby string.
|
||||||
* @param [const char *] ptr A C string.
|
* @param ptr A C string.
|
||||||
* @return [mrb_value] A Ruby string.
|
* @return [mrb_value] A Ruby string.
|
||||||
* @see mrb_str_cat
|
* @see mrb_str_cat
|
||||||
*/
|
*/
|
||||||
@@ -397,17 +420,17 @@ MRB_API mrb_value mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *pt
|
|||||||
MRB_API mrb_value mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2);
|
MRB_API mrb_value mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2);
|
||||||
#define mrb_str_cat_lit(mrb, str, lit) mrb_str_cat(mrb, str, lit, mrb_strlen_lit(lit))
|
#define mrb_str_cat_lit(mrb, str, lit) mrb_str_cat(mrb, str, lit, mrb_strlen_lit(lit))
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Adds str2 to the end of str1.
|
* Adds str2 to the end of str1.
|
||||||
*/
|
*/
|
||||||
MRB_API mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2);
|
MRB_API mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns 0 if both Ruby strings are equal. Returns a value < 0 if Ruby str1 is less than Ruby str2. Returns a value > 0 if Ruby str2 is greater than Ruby str1.
|
* Returns 0 if both Ruby strings are equal. Returns a value < 0 if Ruby str1 is less than Ruby str2. Returns a value > 0 if Ruby str2 is greater than Ruby str1.
|
||||||
*/
|
*/
|
||||||
MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2);
|
MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a newly allocated C string from a Ruby string.
|
* Returns a newly allocated C string from a Ruby string.
|
||||||
* This is an utility function to pass a Ruby string to C library functions.
|
* This is an utility function to pass a Ruby string to C library functions.
|
||||||
*
|
*
|
||||||
@@ -418,31 +441,32 @@ MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2);
|
|||||||
* - Caller can modify returned string without affecting Ruby string
|
* - Caller can modify returned string without affecting Ruby string
|
||||||
* (e.g. it can be used for mkstemp(3)).
|
* (e.g. it can be used for mkstemp(3)).
|
||||||
*
|
*
|
||||||
* @param [mrb_state *] mrb The current mruby state.
|
* @param mrb The current mruby state.
|
||||||
* @param [mrb_value] str Ruby string. Must be an instance of String.
|
* @param str Ruby string. Must be an instance of String.
|
||||||
* @return [char *] A newly allocated C string.
|
* @return [char *] A newly allocated C string.
|
||||||
*/
|
*/
|
||||||
MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str);
|
MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str);
|
||||||
|
|
||||||
mrb_value mrb_str_pool(mrb_state *mrb, mrb_value str);
|
mrb_value mrb_str_pool(mrb_state *mrb, const char *s, mrb_int len, mrb_bool nofree);
|
||||||
uint32_t mrb_str_hash(mrb_state *mrb, mrb_value str);
|
uint32_t mrb_str_hash(mrb_state *mrb, mrb_value str);
|
||||||
mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str);
|
mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a printable version of str, surrounded by quote marks, with special characters escaped.
|
* Returns a printable version of str, surrounded by quote marks, with special characters escaped.
|
||||||
*/
|
*/
|
||||||
mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str);
|
mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str);
|
||||||
|
|
||||||
void mrb_noregexp(mrb_state *mrb, mrb_value self);
|
|
||||||
void mrb_regexp_check(mrb_state *mrb, mrb_value obj);
|
|
||||||
|
|
||||||
/* For backward compatibility */
|
/* For backward compatibility */
|
||||||
#define mrb_str_cat2(mrb, str, ptr) mrb_str_cat_cstr(mrb, str, ptr)
|
#define mrb_str_cat2(mrb, str, ptr) mrb_str_cat_cstr(mrb, str, ptr)
|
||||||
#define mrb_str_buf_cat(mrb, str, ptr, len) mrb_str_cat(mrb, str, ptr, len)
|
#define mrb_str_buf_cat(mrb, str, ptr, len) mrb_str_cat(mrb, str, ptr, len)
|
||||||
#define mrb_str_buf_append(mrb, str, str2) mrb_str_cat_str(mrb, str, str2)
|
#define mrb_str_buf_append(mrb, str, str2) mrb_str_cat_str(mrb, str, str2)
|
||||||
|
|
||||||
|
mrb_bool mrb_str_beg_len(mrb_int str_len, mrb_int *begp, mrb_int *lenp);
|
||||||
|
mrb_value mrb_str_byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
|
||||||
|
|
||||||
#ifdef MRB_UTF8_STRING
|
#ifdef MRB_UTF8_STRING
|
||||||
mrb_int mrb_utf8_len(const char *str, mrb_int byte_len);
|
mrb_int mrb_utf8len(const char *str, const char *end);
|
||||||
|
mrb_int mrb_utf8_strlen(const char *str, mrb_int byte_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MRB_END_DECL
|
MRB_END_DECL
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/throw.h - mruby exception throwing handler
|
** @file mruby/throw.h - mruby exception throwing handler
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
|
|||||||
+167
-90
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/value.h - mruby value definitions
|
** @file mruby/value.h - mruby value definitions
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -9,28 +9,43 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* MRuby Value definition functions and macros.
|
* MRuby Value definition functions and macros.
|
||||||
*/
|
*/
|
||||||
MRB_BEGIN_DECL
|
MRB_BEGIN_DECL
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mruby Symbol.
|
||||||
|
* @class mrb_sym
|
||||||
|
*
|
||||||
|
* You can create an mrb_sym by simply using mrb_str_intern() or mrb_intern_cstr()
|
||||||
|
*/
|
||||||
typedef uint32_t mrb_sym;
|
typedef uint32_t mrb_sym;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mruby Boolean.
|
||||||
|
* @class mrb_bool
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Used internally to represent boolean. Can be TRUE or FALSE.
|
||||||
|
* Not to be confused with Ruby's boolean classes, which can be
|
||||||
|
* obtained using mrb_false_value() and mrb_true_value()
|
||||||
|
*/
|
||||||
typedef uint8_t mrb_bool;
|
typedef uint8_t mrb_bool;
|
||||||
struct mrb_state;
|
struct mrb_state;
|
||||||
|
|
||||||
#if defined(MRB_INT16) && defined(MRB_INT64)
|
|
||||||
# error "You can't define MRB_INT16 and MRB_INT64 at the same time."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined _MSC_VER && _MSC_VER < 1800
|
#if defined _MSC_VER && _MSC_VER < 1800
|
||||||
# define PRIo64 "llo"
|
# define PRIo64 "llo"
|
||||||
# define PRId64 "lld"
|
# define PRId64 "lld"
|
||||||
|
# define PRIu64 "llu"
|
||||||
# define PRIx64 "llx"
|
# define PRIx64 "llx"
|
||||||
# define PRIo16 "ho"
|
# define PRIo16 "ho"
|
||||||
# define PRId16 "hd"
|
# define PRId16 "hd"
|
||||||
|
# define PRIu16 "hu"
|
||||||
# define PRIx16 "hx"
|
# define PRIx16 "hx"
|
||||||
# define PRIo32 "o"
|
# define PRIo32 "o"
|
||||||
# define PRId32 "d"
|
# define PRId32 "d"
|
||||||
|
# define PRIu32 "u"
|
||||||
# define PRIx32 "x"
|
# define PRIx32 "x"
|
||||||
#else
|
#else
|
||||||
# include <inttypes.h>
|
# include <inttypes.h>
|
||||||
@@ -44,14 +59,6 @@ struct mrb_state;
|
|||||||
# define MRB_PRIo PRIo64
|
# define MRB_PRIo PRIo64
|
||||||
# define MRB_PRId PRId64
|
# define MRB_PRId PRId64
|
||||||
# define MRB_PRIx PRIx64
|
# define MRB_PRIx PRIx64
|
||||||
#elif defined(MRB_INT16)
|
|
||||||
typedef int16_t mrb_int;
|
|
||||||
# define MRB_INT_BIT 16
|
|
||||||
# define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
|
|
||||||
# define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
|
|
||||||
# define MRB_PRIo PRIo16
|
|
||||||
# define MRB_PRId PRId16
|
|
||||||
# define MRB_PRIx PRIx16
|
|
||||||
#else
|
#else
|
||||||
typedef int32_t mrb_int;
|
typedef int32_t mrb_int;
|
||||||
# define MRB_INT_BIT 32
|
# define MRB_INT_BIT 32
|
||||||
@@ -62,6 +69,11 @@ struct mrb_state;
|
|||||||
# define MRB_PRIx PRIx32
|
# define MRB_PRIx PRIx32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MRB_ENDIAN_BIG
|
||||||
|
# define MRB_ENDIAN_LOHI(a,b) a b
|
||||||
|
#else
|
||||||
|
# define MRB_ENDIAN_LOHI(a,b) b a
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
MRB_API double mrb_float_read(const char*, char**);
|
MRB_API double mrb_float_read(const char*, char**);
|
||||||
@@ -73,9 +85,6 @@ MRB_API double mrb_float_read(const char*, char**);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined _MSC_VER && _MSC_VER < 1900
|
#if defined _MSC_VER && _MSC_VER < 1900
|
||||||
# ifndef __cplusplus
|
|
||||||
# define inline __inline
|
|
||||||
# endif
|
|
||||||
# include <stdarg.h>
|
# include <stdarg.h>
|
||||||
MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
|
MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
|
||||||
MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
|
MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
|
||||||
@@ -94,32 +103,31 @@ static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum mrb_vtype {
|
enum mrb_vtype {
|
||||||
MRB_TT_FALSE = 0, /* 0 */
|
MRB_TT_FALSE = 0,
|
||||||
MRB_TT_FREE, /* 1 */
|
MRB_TT_TRUE,
|
||||||
MRB_TT_TRUE, /* 2 */
|
MRB_TT_FLOAT,
|
||||||
MRB_TT_FIXNUM, /* 3 */
|
MRB_TT_FIXNUM,
|
||||||
MRB_TT_SYMBOL, /* 4 */
|
MRB_TT_SYMBOL,
|
||||||
MRB_TT_UNDEF, /* 5 */
|
MRB_TT_UNDEF,
|
||||||
MRB_TT_FLOAT, /* 6 */
|
MRB_TT_CPTR,
|
||||||
MRB_TT_CPTR, /* 7 */
|
MRB_TT_FREE,
|
||||||
MRB_TT_OBJECT, /* 8 */
|
MRB_TT_OBJECT,
|
||||||
MRB_TT_CLASS, /* 9 */
|
MRB_TT_CLASS,
|
||||||
MRB_TT_MODULE, /* 10 */
|
MRB_TT_MODULE,
|
||||||
MRB_TT_ICLASS, /* 11 */
|
MRB_TT_ICLASS,
|
||||||
MRB_TT_SCLASS, /* 12 */
|
MRB_TT_SCLASS,
|
||||||
MRB_TT_PROC, /* 13 */
|
MRB_TT_PROC,
|
||||||
MRB_TT_ARRAY, /* 14 */
|
MRB_TT_ARRAY,
|
||||||
MRB_TT_HASH, /* 15 */
|
MRB_TT_HASH,
|
||||||
MRB_TT_STRING, /* 16 */
|
MRB_TT_STRING,
|
||||||
MRB_TT_RANGE, /* 17 */
|
MRB_TT_RANGE,
|
||||||
MRB_TT_EXCEPTION, /* 18 */
|
MRB_TT_EXCEPTION,
|
||||||
MRB_TT_FILE, /* 19 */
|
MRB_TT_ENV,
|
||||||
MRB_TT_ENV, /* 20 */
|
MRB_TT_DATA,
|
||||||
MRB_TT_DATA, /* 21 */
|
MRB_TT_FIBER,
|
||||||
MRB_TT_FIBER, /* 22 */
|
MRB_TT_ISTRUCT,
|
||||||
MRB_TT_ISTRUCT, /* 23 */
|
MRB_TT_BREAK,
|
||||||
MRB_TT_BREAK, /* 24 */
|
MRB_TT_MAXDEFINE
|
||||||
MRB_TT_MAXDEFINE /* 25 */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <mruby/object.h>
|
#include <mruby/object.h>
|
||||||
@@ -140,6 +148,13 @@ typedef void mrb_value;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT))
|
||||||
|
struct RCptr {
|
||||||
|
MRB_OBJECT_HEADER;
|
||||||
|
void *p;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MRB_NAN_BOXING)
|
#if defined(MRB_NAN_BOXING)
|
||||||
#include "boxing_nan.h"
|
#include "boxing_nan.h"
|
||||||
#elif defined(MRB_WORD_BOXING)
|
#elif defined(MRB_WORD_BOXING)
|
||||||
@@ -148,36 +163,106 @@ typedef void mrb_value;
|
|||||||
#include "boxing_no.h"
|
#include "boxing_no.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MRB_SYMBOL_BIT (sizeof(mrb_sym) * CHAR_BIT - MRB_SYMBOL_SHIFT)
|
||||||
|
#define MRB_SYMBOL_MAX (UINT32_MAX >> MRB_SYMBOL_SHIFT)
|
||||||
|
|
||||||
|
#if INTPTR_MAX < MRB_INT_MAX
|
||||||
|
typedef intptr_t mrb_ssize;
|
||||||
|
# define MRB_SSIZE_MAX (INTPTR_MAX>>MRB_FIXNUM_SHIFT)
|
||||||
|
#else
|
||||||
|
typedef mrb_int mrb_ssize;
|
||||||
|
# define MRB_SSIZE_MAX MRB_INT_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef mrb_immediate_p
|
||||||
|
#define mrb_immediate_p(o) (mrb_type(o) < MRB_TT_FREE)
|
||||||
|
#endif
|
||||||
#ifndef mrb_fixnum_p
|
#ifndef mrb_fixnum_p
|
||||||
#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
|
#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef mrb_symbol_p
|
||||||
|
#define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
|
||||||
|
#endif
|
||||||
#ifndef mrb_undef_p
|
#ifndef mrb_undef_p
|
||||||
#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
|
#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
|
||||||
#endif
|
#endif
|
||||||
#ifndef mrb_nil_p
|
#ifndef mrb_nil_p
|
||||||
#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
|
#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef mrb_false_p
|
||||||
|
#define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE && !!mrb_fixnum(o))
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_true_p
|
||||||
|
#define mrb_true_p(o) (mrb_type(o) == MRB_TT_TRUE)
|
||||||
|
#endif
|
||||||
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
|
#ifndef mrb_float_p
|
||||||
|
#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_array_p
|
||||||
|
#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_string_p
|
||||||
|
#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_hash_p
|
||||||
|
#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_cptr_p
|
||||||
|
#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_exception_p
|
||||||
|
#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_free_p
|
||||||
|
#define mrb_free_p(o) (mrb_type(o) == MRB_TT_FREE)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_object_p
|
||||||
|
#define mrb_object_p(o) (mrb_type(o) == MRB_TT_OBJECT)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_class_p
|
||||||
|
#define mrb_class_p(o) (mrb_type(o) == MRB_TT_CLASS)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_module_p
|
||||||
|
#define mrb_module_p(o) (mrb_type(o) == MRB_TT_MODULE)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_iclass_p
|
||||||
|
#define mrb_iclass_p(o) (mrb_type(o) == MRB_TT_ICLASS)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_sclass_p
|
||||||
|
#define mrb_sclass_p(o) (mrb_type(o) == MRB_TT_SCLASS)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_proc_p
|
||||||
|
#define mrb_proc_p(o) (mrb_type(o) == MRB_TT_PROC)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_range_p
|
||||||
|
#define mrb_range_p(o) (mrb_type(o) == MRB_TT_RANGE)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_env_p
|
||||||
|
#define mrb_env_p(o) (mrb_type(o) == MRB_TT_ENV)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_data_p
|
||||||
|
#define mrb_data_p(o) (mrb_type(o) == MRB_TT_DATA)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_fiber_p
|
||||||
|
#define mrb_fiber_p(o) (mrb_type(o) == MRB_TT_FIBER)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_istruct_p
|
||||||
|
#define mrb_istruct_p(o) (mrb_type(o) == MRB_TT_ISTRUCT)
|
||||||
|
#endif
|
||||||
|
#ifndef mrb_break_p
|
||||||
|
#define mrb_break_p(o) (mrb_type(o) == MRB_TT_BREAK)
|
||||||
|
#endif
|
||||||
#ifndef mrb_bool
|
#ifndef mrb_bool
|
||||||
#define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
|
#define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
|
||||||
#endif
|
#endif
|
||||||
#if !defined(MRB_SYMBOL_BITSIZE)
|
|
||||||
#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
|
|
||||||
#define MRB_SYMBOL_MAX UINT32_MAX
|
|
||||||
#endif
|
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
|
||||||
#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
|
|
||||||
#endif
|
|
||||||
#define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
|
|
||||||
#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
|
|
||||||
#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
|
|
||||||
#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
|
|
||||||
#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
|
|
||||||
#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
|
|
||||||
#define mrb_test(o) mrb_bool(o)
|
#define mrb_test(o) mrb_bool(o)
|
||||||
MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a float in Ruby.
|
* Returns a float in Ruby.
|
||||||
|
*
|
||||||
|
* Takes a float and boxes it into an mrb_value
|
||||||
*/
|
*/
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
||||||
@@ -189,7 +274,7 @@ MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline mrb_value
|
MRB_INLINE mrb_value
|
||||||
mrb_cptr_value(struct mrb_state *mrb, void *p)
|
mrb_cptr_value(struct mrb_state *mrb, void *p)
|
||||||
{
|
{
|
||||||
mrb_value v;
|
mrb_value v;
|
||||||
@@ -198,8 +283,10 @@ mrb_cptr_value(struct mrb_state *mrb, void *p)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns a fixnum in Ruby.
|
* Returns a fixnum in Ruby.
|
||||||
|
*
|
||||||
|
* Takes an integer and boxes it into an mrb_value
|
||||||
*/
|
*/
|
||||||
MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i)
|
MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i)
|
||||||
{
|
{
|
||||||
@@ -208,7 +295,7 @@ MRB_INLINE mrb_value mrb_fixnum_value(mrb_int i)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline mrb_value
|
MRB_INLINE mrb_value
|
||||||
mrb_symbol_value(mrb_sym i)
|
mrb_symbol_value(mrb_sym i)
|
||||||
{
|
{
|
||||||
mrb_value v;
|
mrb_value v;
|
||||||
@@ -216,7 +303,7 @@ mrb_symbol_value(mrb_sym i)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline mrb_value
|
MRB_INLINE mrb_value
|
||||||
mrb_obj_value(void *p)
|
mrb_obj_value(void *p)
|
||||||
{
|
{
|
||||||
mrb_value v;
|
mrb_value v;
|
||||||
@@ -226,8 +313,7 @@ mrb_obj_value(void *p)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
/*
|
|
||||||
* Get a nil mrb_value object.
|
* Get a nil mrb_value object.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
@@ -240,7 +326,7 @@ MRB_INLINE mrb_value mrb_nil_value(void)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns false in Ruby.
|
* Returns false in Ruby.
|
||||||
*/
|
*/
|
||||||
MRB_INLINE mrb_value mrb_false_value(void)
|
MRB_INLINE mrb_value mrb_false_value(void)
|
||||||
@@ -250,7 +336,7 @@ MRB_INLINE mrb_value mrb_false_value(void)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns true in Ruby.
|
* Returns true in Ruby.
|
||||||
*/
|
*/
|
||||||
MRB_INLINE mrb_value mrb_true_value(void)
|
MRB_INLINE mrb_value mrb_true_value(void)
|
||||||
@@ -260,7 +346,7 @@ MRB_INLINE mrb_value mrb_true_value(void)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline mrb_value
|
MRB_INLINE mrb_value
|
||||||
mrb_bool_value(mrb_bool boolean)
|
mrb_bool_value(mrb_bool boolean)
|
||||||
{
|
{
|
||||||
mrb_value v;
|
mrb_value v;
|
||||||
@@ -268,7 +354,7 @@ mrb_bool_value(mrb_bool boolean)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline mrb_value
|
MRB_INLINE mrb_value
|
||||||
mrb_undef_value(void)
|
mrb_undef_value(void)
|
||||||
{
|
{
|
||||||
mrb_value v;
|
mrb_value v;
|
||||||
@@ -276,34 +362,25 @@ mrb_undef_value(void)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MRB_USE_ETEXT_EDATA
|
#if defined(MRB_USE_ETEXT_EDATA) && !defined(MRB_USE_LINK_TIME_RO_DATA_P)
|
||||||
#if (defined(__APPLE__) && defined(__MACH__))
|
# ifdef __GNUC__
|
||||||
#include <mach-o/getsect.h>
|
# warning MRB_USE_ETEXT_EDATA is deprecated. Define MRB_USE_LINK_TIME_RO_DATA_P instead.
|
||||||
static inline mrb_bool
|
# endif
|
||||||
mrb_ro_data_p(const char *p)
|
# define MRB_USE_LINK_TIME_RO_DATA_P
|
||||||
{
|
#endif
|
||||||
return (const char*)get_etext() < p && p < (const char*)get_edata();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
extern char _etext[];
|
|
||||||
#ifdef MRB_NO_INIT_ARRAY_START
|
|
||||||
extern char _edata[];
|
|
||||||
|
|
||||||
static inline mrb_bool
|
#if defined(MRB_USE_CUSTOM_RO_DATA_P)
|
||||||
mrb_ro_data_p(const char *p)
|
/* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */
|
||||||
{
|
mrb_bool mrb_ro_data_p(const char *p);
|
||||||
return _etext < p && p < _edata;
|
#elif defined(MRB_USE_LINK_TIME_RO_DATA_P)
|
||||||
}
|
extern char __ehdr_start[];
|
||||||
#else
|
|
||||||
extern char __init_array_start[];
|
extern char __init_array_start[];
|
||||||
|
|
||||||
static inline mrb_bool
|
static inline mrb_bool
|
||||||
mrb_ro_data_p(const char *p)
|
mrb_ro_data_p(const char *p)
|
||||||
{
|
{
|
||||||
return _etext < p && p < (char*)&__init_array_start;
|
return __ehdr_start < p && p < __init_array_start;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
# define mrb_ro_data_p(p) FALSE
|
# define mrb_ro_data_p(p) FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/variable.h - mruby variables
|
** @file mruby/variable.h - mruby variables
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -97,18 +97,15 @@ MRB_API void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
|
|||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
*
|
*
|
||||||
* !!!ruby
|
|
||||||
* # Ruby style
|
* # Ruby style
|
||||||
* $value = nil
|
* $value = nil
|
||||||
*
|
*
|
||||||
* !!!c
|
|
||||||
* // C style
|
* // C style
|
||||||
* mrb_sym sym = mrb_intern_lit(mrb, "$value");
|
* mrb_sym sym = mrb_intern_lit(mrb, "$value");
|
||||||
* mrb_gv_remove(mrb, sym);
|
* mrb_gv_remove(mrb, sym);
|
||||||
*
|
*
|
||||||
* @param mrb The mruby state reference
|
* @param mrb The mruby state reference
|
||||||
* @param sym The name of the global variable
|
* @param sym The name of the global variable
|
||||||
* @param val The value of the global variable
|
|
||||||
*/
|
*/
|
||||||
MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym);
|
MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym);
|
||||||
|
|
||||||
@@ -117,6 +114,7 @@ MRB_API void mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_
|
|||||||
MRB_API void mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v);
|
MRB_API void mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v);
|
||||||
MRB_API mrb_bool mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym);
|
MRB_API mrb_bool mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym);
|
||||||
mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*);
|
mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*);
|
||||||
|
void mrb_obj_iv_set_force(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
|
||||||
mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod);
|
mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod);
|
||||||
mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self);
|
mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self);
|
||||||
mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value);
|
mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value);
|
||||||
|
|||||||
+25
-11
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/**
|
||||||
** mruby/version.h - mruby version definition
|
** @file mruby/version.h - mruby version definition
|
||||||
**
|
**
|
||||||
** See Copyright Notice in mruby.h
|
** See Copyright Notice in mruby.h
|
||||||
*/
|
*/
|
||||||
@@ -42,12 +42,12 @@ MRB_BEGIN_DECL
|
|||||||
/*
|
/*
|
||||||
* Minor release version number.
|
* Minor release version number.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_RELEASE_MINOR 0
|
#define MRUBY_RELEASE_MINOR 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tiny release version number.
|
* Tiny release version number.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_RELEASE_TEENY 1
|
#define MRUBY_RELEASE_TEENY 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The mruby version.
|
* The mruby version.
|
||||||
@@ -62,22 +62,36 @@ MRB_BEGIN_DECL
|
|||||||
/*
|
/*
|
||||||
* Release year.
|
* Release year.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_RELEASE_YEAR 2019
|
#define MRUBY_RELEASE_YEAR 2020
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Release month.
|
* Release month.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_RELEASE_MONTH 4
|
#define MRUBY_RELEASE_MONTH 8
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Release day.
|
* Release day.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_RELEASE_DAY 4
|
#define MRUBY_RELEASE_DAY 6
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Release date as a string.
|
* Release date as a string.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_RELEASE_DATE MRB_STRINGIZE(MRUBY_RELEASE_YEAR) "-" MRB_STRINGIZE(MRUBY_RELEASE_MONTH) "-" MRB_STRINGIZE(MRUBY_RELEASE_DAY)
|
#define MRUBY_RELEASE_DATE \
|
||||||
|
MRUBY_RELEASE_YEAR_STR "-" \
|
||||||
|
MRUBY_RELEASE_MONTH_STR "-" \
|
||||||
|
MRUBY_RELEASE_DAY_STR
|
||||||
|
#define MRUBY_RELEASE_YEAR_STR MRB_STRINGIZE(MRUBY_RELEASE_YEAR)
|
||||||
|
#if MRUBY_RELEASE_MONTH < 10
|
||||||
|
#define MRUBY_RELEASE_MONTH_STR "0" MRB_STRINGIZE(MRUBY_RELEASE_MONTH)
|
||||||
|
#else
|
||||||
|
#define MRUBY_RELEASE_MONTH_STR MRB_STRINGIZE(MRUBY_RELEASE_MONTH)
|
||||||
|
#endif
|
||||||
|
#if MRUBY_RELEASE_DAY < 10
|
||||||
|
#define MRUBY_RELEASE_DAY_STR "0" MRB_STRINGIZE(MRUBY_RELEASE_DAY)
|
||||||
|
#else
|
||||||
|
#define MRUBY_RELEASE_DAY_STR MRB_STRINGIZE(MRUBY_RELEASE_DAY)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The year mruby was first created.
|
* The year mruby was first created.
|
||||||
@@ -92,9 +106,9 @@ MRB_BEGIN_DECL
|
|||||||
/*
|
/*
|
||||||
* mruby's version, and release date.
|
* mruby's version, and release date.
|
||||||
*/
|
*/
|
||||||
#define MRUBY_DESCRIPTION \
|
#define MRUBY_DESCRIPTION \
|
||||||
"mruby " MRUBY_VERSION \
|
"mruby " MRUBY_VERSION \
|
||||||
" (" MRUBY_RELEASE_DATE ") " \
|
" (" MRUBY_RELEASE_DATE ")" \
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mruby's copyright information.
|
* mruby's copyright information.
|
||||||
|
|||||||
+3
-59
@@ -1,3 +1,5 @@
|
|||||||
|
autoload :Pathname, 'pathname'
|
||||||
|
|
||||||
class Object
|
class Object
|
||||||
class << self
|
class << self
|
||||||
def attr_block(*syms)
|
def attr_block(*syms)
|
||||||
@@ -16,68 +18,10 @@ class String
|
|||||||
def relative_path
|
def relative_path
|
||||||
relative_path_from(Dir.pwd)
|
relative_path_from(Dir.pwd)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Compatible with 1.9 on 1.8
|
|
||||||
unless (sprintf("%{a}", :a => 1) rescue false)
|
|
||||||
def %(params)
|
|
||||||
if params.is_a?(Hash)
|
|
||||||
str = self.clone
|
|
||||||
params.each do |k, v|
|
|
||||||
str.gsub!("%{#{k}}") { v }
|
|
||||||
end
|
|
||||||
str
|
|
||||||
else
|
|
||||||
if params.is_a?(Array)
|
|
||||||
sprintf(self, *params)
|
|
||||||
else
|
|
||||||
sprintf(self, params)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Symbol
|
|
||||||
# Compatible with 1.9 on 1.8
|
|
||||||
unless method_defined?(:to_proc)
|
|
||||||
def to_proc
|
|
||||||
proc { |obj, *args| obj.send(self, *args) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
module Enumerable
|
|
||||||
# Compatible with 1.9 on 1.8
|
|
||||||
unless method_defined?(:each_with_object)
|
|
||||||
def each_with_object(memo)
|
|
||||||
return to_enum :each_with_object, memo unless block_given?
|
|
||||||
each { |obj| yield obj, memo }
|
|
||||||
memo
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
$pp_show = true
|
|
||||||
|
|
||||||
if $verbose.nil?
|
|
||||||
if Rake.respond_to?(:verbose) && !Rake.verbose.nil?
|
|
||||||
if Rake.verbose.class == TrueClass
|
|
||||||
# verbose message logging
|
|
||||||
$pp_show = false
|
|
||||||
else
|
|
||||||
$pp_show = true
|
|
||||||
Rake.verbose(false)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
# could not identify rake version
|
|
||||||
$pp_show = false
|
|
||||||
end
|
|
||||||
else
|
|
||||||
$pp_show = false if $verbose
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def _pp(cmd, src, tgt=nil, options={})
|
def _pp(cmd, src, tgt=nil, options={})
|
||||||
return unless $pp_show
|
return if Rake.verbose
|
||||||
|
|
||||||
width = 5
|
width = 5
|
||||||
template = options[:indent] ? "%#{width*options[:indent]}s %s %s" : "%-#{width}s %s %s"
|
template = options[:indent] ? "%#{width*options[:indent]}s %s %s" : "%-#{width}s %s %s"
|
||||||
|
|||||||
+36
-47
@@ -1,7 +1,11 @@
|
|||||||
|
require "mruby-core-ext"
|
||||||
require "mruby/build/load_gems"
|
require "mruby/build/load_gems"
|
||||||
require "mruby/build/command"
|
require "mruby/build/command"
|
||||||
|
|
||||||
module MRuby
|
module MRuby
|
||||||
|
autoload :Gem, "mruby/gem"
|
||||||
|
autoload :Lockfile, "mruby/lockfile"
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def targets
|
def targets
|
||||||
@targets ||= {}
|
@targets ||= {}
|
||||||
@@ -22,7 +26,6 @@ module MRuby
|
|||||||
|
|
||||||
def initialize(name, &block)
|
def initialize(name, &block)
|
||||||
@name, @initializer = name.to_s, block
|
@name, @initializer = name.to_s, block
|
||||||
MRuby::Toolchain.toolchains ||= {}
|
|
||||||
MRuby::Toolchain.toolchains[@name] = self
|
MRuby::Toolchain.toolchains[@name] = self
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -30,13 +33,8 @@ module MRuby
|
|||||||
conf.instance_exec(conf, params, &@initializer)
|
conf.instance_exec(conf, params, &@initializer)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.load
|
self.toolchains = {}
|
||||||
Dir.glob("#{MRUBY_ROOT}/tasks/toolchains/*.rake").each do |file|
|
|
||||||
Kernel.load file
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
Toolchain.load
|
|
||||||
|
|
||||||
class Build
|
class Build
|
||||||
class << self
|
class << self
|
||||||
@@ -45,7 +43,7 @@ module MRuby
|
|||||||
include Rake::DSL
|
include Rake::DSL
|
||||||
include LoadGems
|
include LoadGems
|
||||||
attr_accessor :name, :bins, :exts, :file_separator, :build_dir, :gem_clone_dir
|
attr_accessor :name, :bins, :exts, :file_separator, :build_dir, :gem_clone_dir
|
||||||
attr_reader :libmruby_objs, :gems, :toolchains
|
attr_reader :libmruby_objs, :gems, :toolchains, :gem_dir_to_repo_url
|
||||||
attr_writer :enable_bintest, :enable_test
|
attr_writer :enable_bintest, :enable_test
|
||||||
|
|
||||||
alias libmruby libmruby_objs
|
alias libmruby libmruby_objs
|
||||||
@@ -70,7 +68,7 @@ module MRuby
|
|||||||
|
|
||||||
@file_separator = '/'
|
@file_separator = '/'
|
||||||
@build_dir = "#{build_dir}/#{@name}"
|
@build_dir = "#{build_dir}/#{@name}"
|
||||||
@gem_clone_dir = "#{build_dir}/mrbgems"
|
@gem_clone_dir = "#{build_dir}/repos/#{@name}"
|
||||||
@cc = Command::Compiler.new(self, %w(.c))
|
@cc = Command::Compiler.new(self, %w(.c))
|
||||||
@cxx = Command::Compiler.new(self, %w(.cc .cxx .cpp))
|
@cxx = Command::Compiler.new(self, %w(.cc .cxx .cpp))
|
||||||
@objc = Command::Compiler.new(self, %w(.m))
|
@objc = Command::Compiler.new(self, %w(.m))
|
||||||
@@ -90,7 +88,9 @@ module MRuby
|
|||||||
@cxx_abi_enabled = false
|
@cxx_abi_enabled = false
|
||||||
@enable_bintest = false
|
@enable_bintest = false
|
||||||
@enable_test = false
|
@enable_test = false
|
||||||
|
@enable_lock = true
|
||||||
@toolchains = []
|
@toolchains = []
|
||||||
|
@gem_dir_to_repo_url = {}
|
||||||
|
|
||||||
MRuby.targets[@name] = self
|
MRuby.targets[@name] = self
|
||||||
end
|
end
|
||||||
@@ -118,6 +118,14 @@ module MRuby
|
|||||||
@enable_debug = true
|
@enable_debug = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def disable_lock
|
||||||
|
@enable_lock = false
|
||||||
|
end
|
||||||
|
|
||||||
|
def lock_enabled?
|
||||||
|
Lockfile.enabled? && @enable_lock
|
||||||
|
end
|
||||||
|
|
||||||
def disable_cxx_exception
|
def disable_cxx_exception
|
||||||
if @cxx_exception_enabled or @cxx_abi_enabled
|
if @cxx_exception_enabled or @cxx_abi_enabled
|
||||||
raise "cxx_exception already enabled"
|
raise "cxx_exception already enabled"
|
||||||
@@ -155,8 +163,8 @@ module MRuby
|
|||||||
compilers.each { |c|
|
compilers.each { |c|
|
||||||
c.defines += %w(MRB_ENABLE_CXX_EXCEPTION MRB_ENABLE_CXX_ABI)
|
c.defines += %w(MRB_ENABLE_CXX_EXCEPTION MRB_ENABLE_CXX_ABI)
|
||||||
c.flags << c.cxx_compile_flag
|
c.flags << c.cxx_compile_flag
|
||||||
|
c.flags = c.flags.flatten - c.cxx_invalid_flags.flatten
|
||||||
}
|
}
|
||||||
compilers.each { |c| c.flags << c.cxx_compile_flag }
|
|
||||||
linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
|
linker.command = cxx.command if toolchains.find { |v| v == 'gcc' }
|
||||||
@cxx_abi_enabled = true
|
@cxx_abi_enabled = true
|
||||||
end
|
end
|
||||||
@@ -165,7 +173,7 @@ module MRuby
|
|||||||
obj = objfile(cxx_src) if obj.nil?
|
obj = objfile(cxx_src) if obj.nil?
|
||||||
|
|
||||||
file cxx_src => [src, __FILE__] do |t|
|
file cxx_src => [src, __FILE__] do |t|
|
||||||
FileUtils.mkdir_p File.dirname t.name
|
mkdir_p File.dirname t.name
|
||||||
IO.write t.name, <<EOS
|
IO.write t.name, <<EOS
|
||||||
#define __STDC_CONSTANT_MACROS
|
#define __STDC_CONSTANT_MACROS
|
||||||
#define __STDC_LIMIT_MACROS
|
#define __STDC_LIMIT_MACROS
|
||||||
@@ -196,10 +204,15 @@ EOS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def toolchain(name, params={})
|
def toolchain(name, params={})
|
||||||
tc = Toolchain.toolchains[name.to_s]
|
name = name.to_s
|
||||||
fail "Unknown #{name} toolchain" unless tc
|
tc = Toolchain.toolchains[name] || begin
|
||||||
|
path = "#{MRUBY_ROOT}/tasks/toolchains/#{name}.rake"
|
||||||
|
fail "Unknown #{name} toolchain" unless File.exist?(path)
|
||||||
|
load path
|
||||||
|
Toolchain.toolchains[name]
|
||||||
|
end
|
||||||
tc.setup(self, params)
|
tc.setup(self, params)
|
||||||
@toolchains.unshift name.to_s
|
@toolchains.unshift name
|
||||||
end
|
end
|
||||||
|
|
||||||
def primary_toolchain
|
def primary_toolchain
|
||||||
@@ -226,6 +239,10 @@ EOS
|
|||||||
gem :core => 'mruby-bin-mrbc'
|
gem :core => 'mruby-bin-mrbc'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def locks
|
||||||
|
Lockfile.build(@name)
|
||||||
|
end
|
||||||
|
|
||||||
def mrbcfile
|
def mrbcfile
|
||||||
return @mrbcfile if @mrbcfile
|
return @mrbcfile if @mrbcfile
|
||||||
|
|
||||||
@@ -255,15 +272,7 @@ EOS
|
|||||||
if name.is_a?(Array)
|
if name.is_a?(Array)
|
||||||
name.flatten.map { |n| filename(n) }
|
name.flatten.map { |n| filename(n) }
|
||||||
else
|
else
|
||||||
'"%s"' % name.gsub('/', file_separator)
|
name.gsub('/', file_separator)
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def cygwin_filename(name)
|
|
||||||
if name.is_a?(Array)
|
|
||||||
name.flatten.map { |n| cygwin_filename(n) }
|
|
||||||
else
|
|
||||||
'"%s"' % `cygpath -w "#{filename(name)}"`.strip
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -303,7 +312,7 @@ EOS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def verbose_flag
|
def verbose_flag
|
||||||
$verbose ? ' -v' : ''
|
Rake.verbose ? ' -v' : ''
|
||||||
end
|
end
|
||||||
|
|
||||||
def run_test
|
def run_test
|
||||||
@@ -327,7 +336,8 @@ EOS
|
|||||||
puts " Binaries: #{@bins.join(', ')}" unless @bins.empty?
|
puts " Binaries: #{@bins.join(', ')}" unless @bins.empty?
|
||||||
unless @gems.empty?
|
unless @gems.empty?
|
||||||
puts " Included Gems:"
|
puts " Included Gems:"
|
||||||
@gems.map do |gem|
|
gems = @gems.sort_by { |gem| gem.name }
|
||||||
|
gems.each do |gem|
|
||||||
gem_version = " - #{gem.version}" if gem.version != '0.0.0'
|
gem_version = " - #{gem.version}" if gem.version != '0.0.0'
|
||||||
gem_summary = " - #{gem.summary}" if gem.summary
|
gem_summary = " - #{gem.summary}" if gem.summary
|
||||||
puts " #{gem.name}#{gem_version}#{gem_summary}"
|
puts " #{gem.name}#{gem_version}#{gem_summary}"
|
||||||
@@ -369,7 +379,7 @@ EOS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def run_test
|
def run_test
|
||||||
@test_runner.runner_options << ' -v' if $verbose
|
@test_runner.runner_options << verbose_flag
|
||||||
mrbtest = exefile("#{build_dir}/bin/mrbtest")
|
mrbtest = exefile("#{build_dir}/bin/mrbtest")
|
||||||
if (@test_runner.command == nil)
|
if (@test_runner.command == nil)
|
||||||
puts "You should run #{mrbtest} on target device."
|
puts "You should run #{mrbtest} on target device."
|
||||||
@@ -378,26 +388,5 @@ EOS
|
|||||||
@test_runner.run(mrbtest)
|
@test_runner.run(mrbtest)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def big_endian
|
|
||||||
if @endian
|
|
||||||
puts "Endian has already specified as #{@endian}."
|
|
||||||
return
|
|
||||||
end
|
|
||||||
@endian = :big
|
|
||||||
@mrbc.compile_options += ' -E'
|
|
||||||
compilers.each do |c|
|
|
||||||
c.defines += %w(MRB_ENDIAN_BIG)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def little_endian
|
|
||||||
if @endian
|
|
||||||
puts "Endian has already specified as #{@endian}."
|
|
||||||
return
|
|
||||||
end
|
|
||||||
@endian = :little
|
|
||||||
@mrbc.compile_options += ' -e'
|
|
||||||
end
|
|
||||||
end # CrossBuild
|
end # CrossBuild
|
||||||
end # MRuby
|
end # MRuby
|
||||||
|
|||||||
+96
-69
@@ -4,7 +4,7 @@ module MRuby
|
|||||||
class Command
|
class Command
|
||||||
include Rake::DSL
|
include Rake::DSL
|
||||||
extend Forwardable
|
extend Forwardable
|
||||||
def_delegators :@build, :filename, :objfile, :libfile, :exefile, :cygwin_filename
|
def_delegators :@build, :filename, :objfile, :libfile, :exefile
|
||||||
attr_accessor :build, :command
|
attr_accessor :build, :command
|
||||||
|
|
||||||
def initialize(build)
|
def initialize(build)
|
||||||
@@ -24,6 +24,14 @@ module MRuby
|
|||||||
target
|
target
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def shellquote(s)
|
||||||
|
if ENV['OS'] == 'Windows_NT'
|
||||||
|
"\"#{s}\""
|
||||||
|
else
|
||||||
|
"#{s}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
NotFoundCommands = {}
|
NotFoundCommands = {}
|
||||||
|
|
||||||
private
|
private
|
||||||
@@ -41,7 +49,7 @@ module MRuby
|
|||||||
class Command::Compiler < Command
|
class Command::Compiler < Command
|
||||||
attr_accessor :flags, :include_paths, :defines, :source_exts
|
attr_accessor :flags, :include_paths, :defines, :source_exts
|
||||||
attr_accessor :compile_options, :option_define, :option_include_path, :out_ext
|
attr_accessor :compile_options, :option_define, :option_include_path, :out_ext
|
||||||
attr_accessor :cxx_compile_flag, :cxx_exception_flag
|
attr_accessor :cxx_compile_flag, :cxx_exception_flag, :cxx_invalid_flags
|
||||||
|
|
||||||
def initialize(build, source_exts=[])
|
def initialize(build, source_exts=[])
|
||||||
super(build)
|
super(build)
|
||||||
@@ -50,9 +58,10 @@ module MRuby
|
|||||||
@source_exts = source_exts
|
@source_exts = source_exts
|
||||||
@include_paths = ["#{MRUBY_ROOT}/include"]
|
@include_paths = ["#{MRUBY_ROOT}/include"]
|
||||||
@defines = %w()
|
@defines = %w()
|
||||||
@option_include_path = '-I%s'
|
@option_include_path = %q[-I"%s"]
|
||||||
@option_define = '-D%s'
|
@option_define = %q[-D"%s"]
|
||||||
@compile_options = '%{flags} -o %{outfile} -c %{infile}'
|
@compile_options = %q[%{flags} -o "%{outfile}" -c "%{infile}"]
|
||||||
|
@cxx_invalid_flags = []
|
||||||
end
|
end
|
||||||
|
|
||||||
alias header_search_paths include_paths
|
alias header_search_paths include_paths
|
||||||
@@ -70,25 +79,16 @@ module MRuby
|
|||||||
def all_flags(_defines=[], _include_paths=[], _flags=[])
|
def all_flags(_defines=[], _include_paths=[], _flags=[])
|
||||||
define_flags = [defines, _defines].flatten.map{ |d| option_define % d }
|
define_flags = [defines, _defines].flatten.map{ |d| option_define % d }
|
||||||
include_path_flags = [include_paths, _include_paths].flatten.map do |f|
|
include_path_flags = [include_paths, _include_paths].flatten.map do |f|
|
||||||
if MRUBY_BUILD_HOST_IS_CYGWIN
|
option_include_path % filename(f)
|
||||||
option_include_path % cygwin_filename(f)
|
|
||||||
else
|
|
||||||
option_include_path % filename(f)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
[flags, define_flags, include_path_flags, _flags].flatten.join(' ')
|
[flags, define_flags, include_path_flags, _flags].flatten.join(' ')
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(outfile, infile, _defines=[], _include_paths=[], _flags=[])
|
def run(outfile, infile, _defines=[], _include_paths=[], _flags=[])
|
||||||
FileUtils.mkdir_p File.dirname(outfile)
|
mkdir_p File.dirname(outfile)
|
||||||
_pp "CC", infile.relative_path, outfile.relative_path
|
_pp "CC", infile.relative_path, outfile.relative_path
|
||||||
if MRUBY_BUILD_HOST_IS_CYGWIN
|
_run compile_options, { :flags => all_flags(_defines, _include_paths, _flags),
|
||||||
_run compile_options, { :flags => all_flags(_defines, _include_paths, _flags),
|
:infile => filename(infile), :outfile => filename(outfile) }
|
||||||
:infile => cygwin_filename(infile), :outfile => cygwin_filename(outfile) }
|
|
||||||
else
|
|
||||||
_run compile_options, { :flags => all_flags(_defines, _include_paths, _flags),
|
|
||||||
:infile => filename(infile), :outfile => filename(outfile) }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def define_rules(build_dir, source_dir='')
|
def define_rules(build_dir, source_dir='')
|
||||||
@@ -127,13 +127,40 @@ module MRuby
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
#
|
||||||
|
# === Example of +.d+ file
|
||||||
|
#
|
||||||
|
# ==== Without <tt>-MP</tt> compiler flag
|
||||||
|
#
|
||||||
|
# /build/host/src/array.o: \
|
||||||
|
# /src/array.c \
|
||||||
|
# /include/mruby/common.h \
|
||||||
|
# /include/mruby/value.h \
|
||||||
|
# /src/value_array.h
|
||||||
|
#
|
||||||
|
# ==== With <tt>-MP</tt> compiler flag
|
||||||
|
#
|
||||||
|
# /build/host/src/array.o: \
|
||||||
|
# /src/array.c \
|
||||||
|
# /include/mruby/common.h \
|
||||||
|
# /include/mruby/value.h \
|
||||||
|
# /src/value_array.h
|
||||||
|
#
|
||||||
|
# /include/mruby/common.h:
|
||||||
|
#
|
||||||
|
# /include/mruby/value.h:
|
||||||
|
#
|
||||||
|
# /src/value_array.h:
|
||||||
|
#
|
||||||
def get_dependencies(file)
|
def get_dependencies(file)
|
||||||
file = file.ext('d') unless File.extname(file) == '.d'
|
file = file.ext('d') unless File.extname(file) == '.d'
|
||||||
|
deps = []
|
||||||
if File.exist?(file)
|
if File.exist?(file)
|
||||||
File.read(file).gsub("\\\n ", "").scan(/^\S+:\s+(.+)$/).flatten.map {|s| s.split(' ') }.flatten
|
File.foreach(file){|line| deps << $1 if /^ +(.*?)(?: *\\)?$/ =~ line}
|
||||||
else
|
deps.uniq!
|
||||||
[]
|
end
|
||||||
end + [ MRUBY_CONFIG ]
|
deps << MRUBY_CONFIG
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -148,18 +175,14 @@ module MRuby
|
|||||||
@flags_before_libraries, @flags_after_libraries = [], []
|
@flags_before_libraries, @flags_after_libraries = [], []
|
||||||
@libraries = []
|
@libraries = []
|
||||||
@library_paths = []
|
@library_paths = []
|
||||||
@option_library = '-l%s'
|
@option_library = %q[-l"%s"]
|
||||||
@option_library_path = '-L%s'
|
@option_library_path = %q[-L"%s"]
|
||||||
@link_options = "%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}"
|
@link_options = %Q[%{flags} -o "%{outfile}" %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}]
|
||||||
end
|
end
|
||||||
|
|
||||||
def all_flags(_library_paths=[], _flags=[])
|
def all_flags(_library_paths=[], _flags=[])
|
||||||
library_path_flags = [library_paths, _library_paths].flatten.map do |f|
|
library_path_flags = [library_paths, _library_paths].flatten.map do |f|
|
||||||
if MRUBY_BUILD_HOST_IS_CYGWIN
|
option_library_path % filename(f)
|
||||||
option_library_path % cygwin_filename(f)
|
|
||||||
else
|
|
||||||
option_library_path % filename(f)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
[flags, library_path_flags, _flags].flatten.join(' ')
|
[flags, library_path_flags, _flags].flatten.join(' ')
|
||||||
end
|
end
|
||||||
@@ -169,23 +192,15 @@ module MRuby
|
|||||||
end
|
end
|
||||||
|
|
||||||
def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[], _flags_before_libraries=[], _flags_after_libraries=[])
|
def run(outfile, objfiles, _libraries=[], _library_paths=[], _flags=[], _flags_before_libraries=[], _flags_after_libraries=[])
|
||||||
FileUtils.mkdir_p File.dirname(outfile)
|
mkdir_p File.dirname(outfile)
|
||||||
library_flags = [libraries, _libraries].flatten.map { |d| option_library % d }
|
library_flags = [libraries, _libraries].flatten.map { |d| option_library % d }
|
||||||
|
|
||||||
_pp "LD", outfile.relative_path
|
_pp "LD", outfile.relative_path
|
||||||
if MRUBY_BUILD_HOST_IS_CYGWIN
|
_run link_options, { :flags => all_flags(_library_paths, _flags),
|
||||||
_run link_options, { :flags => all_flags(_library_paths, _flags),
|
:outfile => filename(outfile) , :objs => filename(objfiles).map{|f| %Q["#{f}"]}.join(' '),
|
||||||
:outfile => cygwin_filename(outfile) , :objs => cygwin_filename(objfiles).join(' '),
|
:flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
|
||||||
:flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
|
:flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
|
||||||
:flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
|
:libs => library_flags.join(' ') }
|
||||||
:libs => library_flags.join(' ') }
|
|
||||||
else
|
|
||||||
_run link_options, { :flags => all_flags(_library_paths, _flags),
|
|
||||||
:outfile => filename(outfile) , :objs => filename(objfiles).join(' '),
|
|
||||||
:flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
|
|
||||||
:flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
|
|
||||||
:libs => library_flags.join(' ') }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -195,17 +210,13 @@ module MRuby
|
|||||||
def initialize(build)
|
def initialize(build)
|
||||||
super
|
super
|
||||||
@command = ENV['AR'] || 'ar'
|
@command = ENV['AR'] || 'ar'
|
||||||
@archive_options = 'rs %{outfile} %{objs}'
|
@archive_options = 'rs "%{outfile}" %{objs}'
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(outfile, objfiles)
|
def run(outfile, objfiles)
|
||||||
FileUtils.mkdir_p File.dirname(outfile)
|
mkdir_p File.dirname(outfile)
|
||||||
_pp "AR", outfile.relative_path
|
_pp "AR", outfile.relative_path
|
||||||
if MRUBY_BUILD_HOST_IS_CYGWIN
|
_run archive_options, { :outfile => filename(outfile), :objs => filename(objfiles).map{|f| %Q["#{f}"]}.join(' ') }
|
||||||
_run archive_options, { :outfile => cygwin_filename(outfile), :objs => cygwin_filename(objfiles).join(' ') }
|
|
||||||
else
|
|
||||||
_run archive_options, { :outfile => filename(outfile), :objs => filename(objfiles).join(' ') }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -215,11 +226,11 @@ module MRuby
|
|||||||
def initialize(build)
|
def initialize(build)
|
||||||
super
|
super
|
||||||
@command = 'bison'
|
@command = 'bison'
|
||||||
@compile_options = '-o %{outfile} %{infile}'
|
@compile_options = %q[-o "%{outfile}" "%{infile}"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(outfile, infile)
|
def run(outfile, infile)
|
||||||
FileUtils.mkdir_p File.dirname(outfile)
|
mkdir_p File.dirname(outfile)
|
||||||
_pp "YACC", infile.relative_path, outfile.relative_path
|
_pp "YACC", infile.relative_path, outfile.relative_path
|
||||||
_run compile_options, { :outfile => filename(outfile) , :infile => filename(infile) }
|
_run compile_options, { :outfile => filename(outfile) , :infile => filename(infile) }
|
||||||
end
|
end
|
||||||
@@ -231,11 +242,11 @@ module MRuby
|
|||||||
def initialize(build)
|
def initialize(build)
|
||||||
super
|
super
|
||||||
@command = 'gperf'
|
@command = 'gperf'
|
||||||
@compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'
|
@compile_options = %q[-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" "%{infile}" > "%{outfile}"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(outfile, infile)
|
def run(outfile, infile)
|
||||||
FileUtils.mkdir_p File.dirname(outfile)
|
mkdir_p File.dirname(outfile)
|
||||||
_pp "GPERF", infile.relative_path, outfile.relative_path
|
_pp "GPERF", infile.relative_path, outfile.relative_path
|
||||||
_run compile_options, { :outfile => filename(outfile) , :infile => filename(infile) }
|
_run compile_options, { :outfile => filename(outfile) , :infile => filename(infile) }
|
||||||
end
|
end
|
||||||
@@ -243,36 +254,50 @@ module MRuby
|
|||||||
|
|
||||||
class Command::Git < Command
|
class Command::Git < Command
|
||||||
attr_accessor :flags
|
attr_accessor :flags
|
||||||
attr_accessor :clone_options, :pull_options, :checkout_options
|
attr_accessor :clone_options, :pull_options, :checkout_options, :checkout_detach_options, :reset_options
|
||||||
|
|
||||||
def initialize(build)
|
def initialize(build)
|
||||||
super
|
super
|
||||||
@command = 'git'
|
@command = 'git'
|
||||||
@flags = %w[]
|
@flags = %w[]
|
||||||
@clone_options = "clone %{flags} %{url} %{dir}"
|
@clone_options = "clone %{flags} %{url} %{dir}"
|
||||||
@pull_options = "pull"
|
@pull_options = "--git-dir %{repo_dir}/.git --work-tree %{repo_dir} pull"
|
||||||
@checkout_options = "checkout %{checksum_hash}"
|
@checkout_options = "--git-dir %{repo_dir}/.git --work-tree %{repo_dir} checkout %{checksum_hash}"
|
||||||
|
@checkout_detach_options = "--git-dir %{repo_dir}/.git --work-tree %{repo_dir} checkout --detach %{checksum_hash}"
|
||||||
|
@reset_options = "--git-dir %{repo_dir}/.git --work-tree %{repo_dir} reset %{checksum_hash}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def run_clone(dir, url, _flags = [])
|
def run_clone(dir, url, _flags = [])
|
||||||
_pp "GIT", url, dir.relative_path
|
_pp "GIT", url, dir.relative_path
|
||||||
_run clone_options, { :flags => [flags, _flags].flatten.join(' '), :url => url, :dir => filename(dir) }
|
_run clone_options, { :flags => [flags, _flags].flatten.join(' '), :url => shellquote(url), :dir => shellquote(filename(dir)) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def run_pull(dir, url)
|
def run_pull(dir, url)
|
||||||
root = Dir.pwd
|
|
||||||
Dir.chdir dir
|
|
||||||
_pp "GIT PULL", url, dir.relative_path
|
_pp "GIT PULL", url, dir.relative_path
|
||||||
_run pull_options
|
_run pull_options, { :repo_dir => shellquote(dir) }
|
||||||
Dir.chdir root
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def run_checkout(dir, checksum_hash)
|
def run_checkout(dir, checksum_hash)
|
||||||
root = Dir.pwd
|
_pp "GIT CHECKOUT", dir, checksum_hash
|
||||||
Dir.chdir dir
|
_run checkout_options, { :checksum_hash => checksum_hash, :repo_dir => shellquote(dir) }
|
||||||
_pp "GIT CHECKOUT", checksum_hash
|
end
|
||||||
_run checkout_options, { :checksum_hash => checksum_hash }
|
|
||||||
Dir.chdir root
|
def run_checkout_detach(dir, checksum_hash)
|
||||||
|
_pp "GIT CHECKOUT DETACH", dir, checksum_hash
|
||||||
|
_run checkout_detach_options, { :checksum_hash => checksum_hash, :repo_dir => shellquote(dir) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_reset_hard(dir, checksum_hash)
|
||||||
|
_pp "GIT RESET", dir, checksum_hash
|
||||||
|
_run reset_options, { :checksum_hash => checksum_hash, :repo_dir => shellquote(dir) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def commit_hash(dir)
|
||||||
|
`#{@command} --git-dir #{shellquote(dir +'/.git')} --work-tree #{shellquote(dir)} rev-parse --verify HEAD`.strip
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_branch(dir)
|
||||||
|
`#{@command} --git-dir #{shellquote(dir + '/.git')} --work-tree #{shellquote(dir)} rev-parse --abbrev-ref HEAD`.strip
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -291,7 +316,9 @@ module MRuby
|
|||||||
infiles.each do |f|
|
infiles.each do |f|
|
||||||
_pp "MRBC", f.relative_path, nil, :indent => 2
|
_pp "MRBC", f.relative_path, nil, :indent => 2
|
||||||
end
|
end
|
||||||
IO.popen("#{filename @command} #{@compile_options % {:funcname => funcname}} #{filename(infiles).join(' ')}", 'r+') do |io|
|
cmd = %Q["#{filename @command}" #{@compile_options % {:funcname => funcname}} #{filename(infiles).map{|f| %Q["#{f}"]}.join(' ')}]
|
||||||
|
puts cmd if Rake.verbose
|
||||||
|
IO.popen(cmd, 'r+') do |io|
|
||||||
out.puts io.read
|
out.puts io.read
|
||||||
end
|
end
|
||||||
# if mrbc execution fail, drop the file
|
# if mrbc execution fail, drop the file
|
||||||
|
|||||||
@@ -13,13 +13,12 @@ module MRuby
|
|||||||
end
|
end
|
||||||
|
|
||||||
def gem(gemdir, &block)
|
def gem(gemdir, &block)
|
||||||
caller_dir = File.expand_path(File.dirname(/^(.*?):\d/.match(caller.first).to_a[1]))
|
|
||||||
|
|
||||||
if gemdir.is_a?(Hash)
|
if gemdir.is_a?(Hash)
|
||||||
gemdir = load_special_path_gem(gemdir)
|
gemdir = load_special_path_gem(gemdir)
|
||||||
elsif GemBox.path && gemdir.is_a?(String)
|
elsif GemBox.path && gemdir.is_a?(String)
|
||||||
gemdir = File.expand_path(gemdir, File.dirname(GemBox.path))
|
gemdir = File.expand_path(gemdir, File.dirname(GemBox.path))
|
||||||
else
|
else
|
||||||
|
caller_dir = File.expand_path(File.dirname(caller(1,1)[0][/^(.*?):\d/,1]))
|
||||||
gemdir = File.expand_path(gemdir, caller_dir)
|
gemdir = File.expand_path(gemdir, caller_dir)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -58,7 +57,7 @@ module MRuby
|
|||||||
if File.exist? mgem_list_dir
|
if File.exist? mgem_list_dir
|
||||||
git.run_pull mgem_list_dir, mgem_list_url if $pull_gems
|
git.run_pull mgem_list_dir, mgem_list_url if $pull_gems
|
||||||
else
|
else
|
||||||
FileUtils.mkdir_p mgem_list_dir
|
mkdir_p mgem_list_dir
|
||||||
git.run_clone mgem_list_dir, mgem_list_url, "--depth 1"
|
git.run_clone mgem_list_dir, mgem_list_url, "--depth 1"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -83,27 +82,41 @@ module MRuby
|
|||||||
# by default the 'master' branch is used
|
# by default the 'master' branch is used
|
||||||
branch = params[:branch] ? params[:branch] : 'master'
|
branch = params[:branch] ? params[:branch] : 'master'
|
||||||
|
|
||||||
|
lock = locks[url] if lock_enabled?
|
||||||
|
|
||||||
if File.exist?(gemdir)
|
if File.exist?(gemdir)
|
||||||
if $pull_gems
|
if $pull_gems
|
||||||
|
# Jump to the top of the branch
|
||||||
|
git.run_checkout gemdir, branch
|
||||||
git.run_pull gemdir, url
|
git.run_pull gemdir, url
|
||||||
else
|
elsif params[:checksum_hash]
|
||||||
gemdir
|
git.run_checkout_detach gemdir, params[:checksum_hash]
|
||||||
|
elsif lock
|
||||||
|
git.run_checkout_detach gemdir, lock['commit']
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
options = [params[:options]] || []
|
options = [params[:options]] || []
|
||||||
options << "--recursive"
|
options << "--recursive"
|
||||||
options << "--branch \"#{branch}\""
|
options << "--branch \"#{branch}\""
|
||||||
options << "--depth 1" unless params[:checksum_hash]
|
options << "--depth 1" unless params[:checksum_hash]
|
||||||
FileUtils.mkdir_p "#{gem_clone_dir}"
|
mkdir_p "#{gem_clone_dir}"
|
||||||
git.run_clone gemdir, url, options
|
git.run_clone gemdir, url, options
|
||||||
|
|
||||||
|
# Jump to the specified commit
|
||||||
|
if params[:checksum_hash]
|
||||||
|
git.run_checkout_detach gemdir, params[:checksum_hash]
|
||||||
|
elsif lock
|
||||||
|
git.run_checkout_detach gemdir, lock['commit']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:checksum_hash]
|
if lock_enabled?
|
||||||
# Jump to the specified commit
|
@gem_dir_to_repo_url[gemdir] = url unless params[:path]
|
||||||
git.run_checkout gemdir, params[:checksum_hash]
|
locks[url] = {
|
||||||
else
|
'url' => url,
|
||||||
# Jump to the top of the branch
|
'branch' => git.current_branch(gemdir),
|
||||||
git.run_checkout gemdir, branch if $pull_gems
|
'commit' => git.commit_hash(gemdir),
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
gemdir << "/#{params[:path]}" if params[:path]
|
gemdir << "/#{params[:path]}" if params[:path]
|
||||||
|
|||||||
+21
-8
@@ -1,7 +1,6 @@
|
|||||||
require 'pathname'
|
|
||||||
require 'forwardable'
|
require 'forwardable'
|
||||||
require 'tsort'
|
autoload :TSort, 'tsort'
|
||||||
require 'shellwords'
|
autoload :Shellwords, 'shellwords'
|
||||||
|
|
||||||
module MRuby
|
module MRuby
|
||||||
module Gem
|
module Gem
|
||||||
@@ -92,6 +91,9 @@ module MRuby
|
|||||||
build.libmruby_objs << @objs
|
build.libmruby_objs << @objs
|
||||||
|
|
||||||
instance_eval(&@build_config_initializer) if @build_config_initializer
|
instance_eval(&@build_config_initializer) if @build_config_initializer
|
||||||
|
|
||||||
|
repo_url = build.gem_dir_to_repo_url[dir]
|
||||||
|
build.locks[repo_url]['version'] = version if repo_url
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup_compilers
|
def setup_compilers
|
||||||
@@ -104,6 +106,15 @@ module MRuby
|
|||||||
define_gem_init_builder if @generate_functions
|
define_gem_init_builder if @generate_functions
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def for_windows?
|
||||||
|
if build.kind_of?(MRuby::CrossBuild)
|
||||||
|
return %w(x86_64-w64-mingw32 i686-w64-mingw32).include?(build.host_target)
|
||||||
|
elsif build.kind_of?(MRuby::Build)
|
||||||
|
return ('A'..'Z').to_a.any? { |vol| Dir.exist?("#{vol}:") }
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
def add_dependency(name, *requirements)
|
def add_dependency(name, *requirements)
|
||||||
default_gem = requirements.last.kind_of?(Hash) ? requirements.pop : nil
|
default_gem = requirements.last.kind_of?(Hash) ? requirements.pop : nil
|
||||||
requirements = ['>= 0.0.0'] if requirements.empty?
|
requirements = ['>= 0.0.0'] if requirements.empty?
|
||||||
@@ -155,7 +166,7 @@ module MRuby
|
|||||||
def define_gem_init_builder
|
def define_gem_init_builder
|
||||||
file objfile("#{build_dir}/gem_init") => [ "#{build_dir}/gem_init.c", File.join(dir, "mrbgem.rake") ]
|
file objfile("#{build_dir}/gem_init") => [ "#{build_dir}/gem_init.c", File.join(dir, "mrbgem.rake") ]
|
||||||
file "#{build_dir}/gem_init.c" => [build.mrbcfile, __FILE__] + [rbfiles].flatten do |t|
|
file "#{build_dir}/gem_init.c" => [build.mrbcfile, __FILE__] + [rbfiles].flatten do |t|
|
||||||
FileUtils.mkdir_p build_dir
|
mkdir_p build_dir
|
||||||
generate_gem_init("#{build_dir}/gem_init.c")
|
generate_gem_init("#{build_dir}/gem_init.c")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -267,16 +278,18 @@ module MRuby
|
|||||||
# ~> compare algorithm
|
# ~> compare algorithm
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
|
# ~> 2 means >= 2.0.0 and < 3.0.0
|
||||||
# ~> 2.2 means >= 2.2.0 and < 3.0.0
|
# ~> 2.2 means >= 2.2.0 and < 3.0.0
|
||||||
# ~> 2.2.0 means >= 2.2.0 and < 2.3.0
|
# ~> 2.2.2 means >= 2.2.2 and < 2.3.0
|
||||||
def twiddle_wakka_ok?(other)
|
def twiddle_wakka_ok?(other)
|
||||||
gr_or_eql = (self <=> other) >= 0
|
gr_or_eql = (self <=> other) >= 0
|
||||||
still_minor = (self <=> other.skip_minor) < 0
|
still_major_or_minor = (self <=> other.skip_major_or_minor) < 0
|
||||||
gr_or_eql and still_minor
|
gr_or_eql and still_major_or_minor
|
||||||
end
|
end
|
||||||
|
|
||||||
def skip_minor
|
def skip_major_or_minor
|
||||||
a = @ary.dup
|
a = @ary.dup
|
||||||
|
a << 0 if a.size == 1 # ~> 2 can also be represented as ~> 2.0
|
||||||
a.slice!(-1)
|
a.slice!(-1)
|
||||||
a[-1] = a[-1].succ
|
a[-1] = a[-1].succ
|
||||||
a
|
a
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
autoload :YAML, 'yaml'
|
||||||
|
|
||||||
|
module MRuby
|
||||||
|
autoload :Source, 'mruby/source'
|
||||||
|
|
||||||
|
class Lockfile
|
||||||
|
class << self
|
||||||
|
def enable
|
||||||
|
@enabled = true
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable
|
||||||
|
@enabled = false
|
||||||
|
end
|
||||||
|
|
||||||
|
def enabled?
|
||||||
|
@enabled
|
||||||
|
end
|
||||||
|
|
||||||
|
def build(target_name)
|
||||||
|
instance.build(target_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def write
|
||||||
|
instance.write if enabled?
|
||||||
|
end
|
||||||
|
|
||||||
|
def instance
|
||||||
|
@instance ||= new("#{MRUBY_CONFIG}.lock")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(filename)
|
||||||
|
@filename = filename
|
||||||
|
end
|
||||||
|
|
||||||
|
def build(target_name)
|
||||||
|
read[target_name] ||= {}
|
||||||
|
end
|
||||||
|
|
||||||
|
def write
|
||||||
|
locks = {"mruby_version" => mruby}
|
||||||
|
locks["builds"] = @builds if @builds
|
||||||
|
File.write(@filename, YAML.dump(locks))
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def read
|
||||||
|
@builds ||= if File.exist?(@filename)
|
||||||
|
YAML.load_file(@filename)["builds"] || {}
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def shellquote(s)
|
||||||
|
if ENV['OS'] == 'Windows_NT'
|
||||||
|
"\"#{s}\""
|
||||||
|
else
|
||||||
|
"'#{s}'"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def mruby
|
||||||
|
mruby = {
|
||||||
|
'version' => MRuby::Source::MRUBY_VERSION,
|
||||||
|
'release_no' => MRuby::Source::MRUBY_RELEASE_NO,
|
||||||
|
}
|
||||||
|
|
||||||
|
git_dir = "#{MRUBY_ROOT}/.git"
|
||||||
|
if File.directory?(git_dir)
|
||||||
|
mruby['git_commit'] = `git --git-dir #{shellquote(git_dir)} --work-tree #{shellquote(MRUBY_ROOT)} rev-parse --verify HEAD`.strip
|
||||||
|
end
|
||||||
|
|
||||||
|
mruby
|
||||||
|
end
|
||||||
|
|
||||||
|
enable
|
||||||
|
end
|
||||||
|
end
|
||||||
+3
-1
@@ -6,7 +6,9 @@ module MRuby
|
|||||||
ROOT = Pathname.new(File.expand_path('../../../',__FILE__))
|
ROOT = Pathname.new(File.expand_path('../../../',__FILE__))
|
||||||
|
|
||||||
# Reads a constant defined at version.h
|
# Reads a constant defined at version.h
|
||||||
MRUBY_READ_VERSION_CONSTANT = Proc.new { |name| ROOT.join('include','mruby','version.h').read.match(/^#define #{name} +"?([\w\. ]+)"?$/)[1] }
|
MRUBY_READ_VERSION_CONSTANT = Proc.new do |name|
|
||||||
|
ROOT.join('include','mruby','version.h').read.match(/^#define #{name} +"?([\w\. ]+)"?\r?$/)[1]
|
||||||
|
end
|
||||||
|
|
||||||
MRUBY_RUBY_VERSION = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_VERSION']
|
MRUBY_RUBY_VERSION = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_VERSION']
|
||||||
MRUBY_RUBY_ENGINE = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_ENGINE']
|
MRUBY_RUBY_ENGINE = MRUBY_READ_VERSION_CONSTANT['MRUBY_RUBY_ENGINE']
|
||||||
|
|||||||
@@ -1,605 +1,2 @@
|
|||||||
#!/usr/bin/env ruby
|
#! /usr/bin/env ruby
|
||||||
|
exec "rake", *ARGV
|
||||||
# Original is https://github.com/jimweirich/rake/
|
|
||||||
# Copyright (c) 2003 Jim Weirich
|
|
||||||
# License: MIT-LICENSE
|
|
||||||
|
|
||||||
require 'getoptlong'
|
|
||||||
require 'fileutils'
|
|
||||||
|
|
||||||
$rake_fiber_table = {}
|
|
||||||
$rake_jobs = 1
|
|
||||||
$rake_failed = []
|
|
||||||
|
|
||||||
class String
|
|
||||||
def ext(newext='')
|
|
||||||
return self.dup if ['.', '..'].include? self
|
|
||||||
if newext != ''
|
|
||||||
newext = (newext =~ /^\./) ? newext : ("." + newext)
|
|
||||||
end
|
|
||||||
self.chomp(File.extname(self)) << newext
|
|
||||||
end
|
|
||||||
|
|
||||||
def pathmap(spec=nil, &block)
|
|
||||||
return self if spec.nil?
|
|
||||||
result = ''
|
|
||||||
spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag|
|
|
||||||
case frag
|
|
||||||
when '%f'
|
|
||||||
result << File.basename(self)
|
|
||||||
when '%n'
|
|
||||||
result << File.basename(self).ext
|
|
||||||
when '%d'
|
|
||||||
result << File.dirname(self)
|
|
||||||
when '%x'
|
|
||||||
result << File.extname(self)
|
|
||||||
when '%X'
|
|
||||||
result << self.ext
|
|
||||||
when '%p'
|
|
||||||
result << self
|
|
||||||
when '%s'
|
|
||||||
result << (File::ALT_SEPARATOR || File::SEPARATOR)
|
|
||||||
when '%-'
|
|
||||||
# do nothing
|
|
||||||
when '%%'
|
|
||||||
result << "%"
|
|
||||||
when /%(-?\d+)d/
|
|
||||||
result << pathmap_partial($1.to_i)
|
|
||||||
when /^%\{([^}]*)\}(\d*[dpfnxX])/
|
|
||||||
patterns, operator = $1, $2
|
|
||||||
result << pathmap('%' + operator).pathmap_replace(patterns, &block)
|
|
||||||
when /^%/
|
|
||||||
fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'"
|
|
||||||
else
|
|
||||||
result << frag
|
|
||||||
end
|
|
||||||
end
|
|
||||||
result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
module MiniRake
|
|
||||||
class Task
|
|
||||||
TASKS = Hash.new
|
|
||||||
RULES = Array.new
|
|
||||||
|
|
||||||
# List of prerequisites for a task.
|
|
||||||
attr_reader :prerequisites
|
|
||||||
|
|
||||||
# Source dependency for rule synthesized tasks. Nil if task was not
|
|
||||||
# sythesized from a rule.
|
|
||||||
attr_accessor :source
|
|
||||||
|
|
||||||
# Create a task named +task_name+ with no actions or prerequisites..
|
|
||||||
# use +enhance+ to add actions and prerequisites.
|
|
||||||
def initialize(task_name)
|
|
||||||
@name = task_name
|
|
||||||
@prerequisites = []
|
|
||||||
@actions = []
|
|
||||||
end
|
|
||||||
|
|
||||||
# Enhance a task with prerequisites or actions. Returns self.
|
|
||||||
def enhance(deps=nil, &block)
|
|
||||||
@prerequisites |= deps if deps
|
|
||||||
@actions << block if block_given?
|
|
||||||
self
|
|
||||||
end
|
|
||||||
|
|
||||||
# Name of the task.
|
|
||||||
def name
|
|
||||||
@name.to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
def done?; @done end
|
|
||||||
def running?; @running end
|
|
||||||
|
|
||||||
# Invoke the task if it is needed. Prerequisites are invoked first.
|
|
||||||
def invoke
|
|
||||||
puts "Invoke #{name} (already=[#{@already_invoked}], needed=[#{needed?}])" if $trace
|
|
||||||
return if @already_invoked
|
|
||||||
prerequisites = @prerequisites.collect{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten
|
|
||||||
prerequisites.each do |n|
|
|
||||||
t = Task[n]
|
|
||||||
unless t.done?
|
|
||||||
return prerequisites.select{|v| v = Task[v]; v && (!v.done? || !v.running?) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@already_invoked = true
|
|
||||||
|
|
||||||
if needed?
|
|
||||||
@running = true
|
|
||||||
if $rake_root_fiber
|
|
||||||
return Fiber.new do
|
|
||||||
self.execute
|
|
||||||
$rake_root_fiber.transfer
|
|
||||||
end
|
|
||||||
else
|
|
||||||
self.execute
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@done = true
|
|
||||||
end
|
|
||||||
|
|
||||||
# Execute the actions associated with this task.
|
|
||||||
def execute
|
|
||||||
puts "Execute #{name}" if $trace
|
|
||||||
self.class.enhance_with_matching_rule(name) if @actions.empty?
|
|
||||||
unless $dryrun
|
|
||||||
@actions.each { |act| act.call(self) }
|
|
||||||
end
|
|
||||||
@done = true
|
|
||||||
@running = false
|
|
||||||
end
|
|
||||||
|
|
||||||
# Is this task needed?
|
|
||||||
def needed?
|
|
||||||
true
|
|
||||||
end
|
|
||||||
|
|
||||||
# Timestamp for this task. Basic tasks return the current time for
|
|
||||||
# their time stamp. Other tasks can be more sophisticated.
|
|
||||||
def timestamp
|
|
||||||
Time.now
|
|
||||||
end
|
|
||||||
|
|
||||||
# Class Methods ----------------------------------------------------
|
|
||||||
|
|
||||||
class << self
|
|
||||||
|
|
||||||
# Clear the task list. This cause rake to immediately forget all
|
|
||||||
# the tasks that have been assigned. (Normally used in the unit
|
|
||||||
# tests.)
|
|
||||||
def clear
|
|
||||||
TASKS.clear
|
|
||||||
RULES.clear
|
|
||||||
end
|
|
||||||
|
|
||||||
# List of all defined tasks.
|
|
||||||
def tasks
|
|
||||||
TASKS.keys.sort.collect { |tn| Task[tn] }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Return a task with the given name. If the task is not currently
|
|
||||||
# known, try to synthesize one from the defined rules. If no
|
|
||||||
# rules are found, but an existing file matches the task name,
|
|
||||||
# assume it is a file task with no dependencies or actions.
|
|
||||||
def [](task_name)
|
|
||||||
task_name = task_name.to_s
|
|
||||||
if task = TASKS[task_name]
|
|
||||||
return task
|
|
||||||
end
|
|
||||||
if task = enhance_with_matching_rule(task_name)
|
|
||||||
return task
|
|
||||||
end
|
|
||||||
if File.exist?(task_name)
|
|
||||||
return FileTask.define_task(task_name)
|
|
||||||
end
|
|
||||||
fail "Don't know how to rake #{task_name}"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Define a task given +args+ and an option block. If a rule with
|
|
||||||
# the given name already exists, the prerequisites and actions are
|
|
||||||
# added to the existing task.
|
|
||||||
def define_task(args, &block)
|
|
||||||
task_name, deps = resolve_args(args)
|
|
||||||
lookup(task_name).enhance([deps].flatten, &block)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Define a rule for synthesizing tasks.
|
|
||||||
def create_rule(args, &block)
|
|
||||||
pattern, deps = resolve_args(args)
|
|
||||||
pattern = Regexp.new(Regexp.quote(pattern) + '$') if String === pattern
|
|
||||||
RULES << [pattern, deps, block]
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# Lookup a task. Return an existing task if found, otherwise
|
|
||||||
# create a task of the current type.
|
|
||||||
def lookup(task_name)
|
|
||||||
name = task_name.to_s
|
|
||||||
TASKS[name] ||= self.new(name)
|
|
||||||
end
|
|
||||||
|
|
||||||
# If a rule can be found that matches the task name, enhance the
|
|
||||||
# task with the prerequisites and actions from the rule. Set the
|
|
||||||
# source attribute of the task appropriately for the rule. Return
|
|
||||||
# the enhanced task or nil of no rule was found.
|
|
||||||
def enhance_with_matching_rule(task_name)
|
|
||||||
RULES.each do |pattern, extensions, block|
|
|
||||||
if pattern.match(task_name)
|
|
||||||
ext = extensions.first
|
|
||||||
deps = extensions[1..-1]
|
|
||||||
case ext
|
|
||||||
when String
|
|
||||||
source = task_name.sub(/\.[^.]*$/, ext)
|
|
||||||
when Proc
|
|
||||||
source = ext.call(task_name)
|
|
||||||
else
|
|
||||||
fail "Don't know how to handle rule dependent: #{ext.inspect}"
|
|
||||||
end
|
|
||||||
if File.exist?(source)
|
|
||||||
task = FileTask.define_task({task_name => [source]+deps}, &block)
|
|
||||||
task.source = source
|
|
||||||
return task
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
# Resolve the arguments for a task/rule.
|
|
||||||
def resolve_args(args)
|
|
||||||
case args
|
|
||||||
when Hash
|
|
||||||
fail "Too Many Task Names: #{args.keys.join(' ')}" if args.size > 1
|
|
||||||
fail "No Task Name Given" if args.size < 1
|
|
||||||
task_name = args.keys[0]
|
|
||||||
deps = args[task_name]
|
|
||||||
deps = [deps] if (String===deps) || (Regexp===deps) || (Proc===deps)
|
|
||||||
else
|
|
||||||
task_name = args
|
|
||||||
deps = []
|
|
||||||
end
|
|
||||||
[task_name, deps]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
|
||||||
class FileTask < Task
|
|
||||||
# Is this file task needed? Yes if it doesn't exist, or if its time
|
|
||||||
# stamp is out of date.
|
|
||||||
def needed?
|
|
||||||
return true unless File.exist?(name)
|
|
||||||
prerequisites = @prerequisites.collect{ |n| n.is_a?(Proc) ? n.call(name) : n }.flatten
|
|
||||||
latest_prereq = prerequisites.collect{|n| Task[n].timestamp}.max
|
|
||||||
return false if latest_prereq.nil?
|
|
||||||
timestamp < latest_prereq
|
|
||||||
end
|
|
||||||
|
|
||||||
# Time stamp for file task.
|
|
||||||
def timestamp
|
|
||||||
return Time.at(0) unless File.exist?(name)
|
|
||||||
stat = File::stat(name.to_s)
|
|
||||||
stat.directory? ? Time.at(0) : stat.mtime
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
module DSL
|
|
||||||
# Declare a basic task.
|
|
||||||
def task(args, &block)
|
|
||||||
MiniRake::Task.define_task(args, &block)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Declare a file task.
|
|
||||||
def file(args, &block)
|
|
||||||
MiniRake::FileTask.define_task(args, &block)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Declare a set of files tasks to create the given directories on
|
|
||||||
# demand.
|
|
||||||
def directory(args, &block)
|
|
||||||
MiniRake::FileTask.define_task(args) do |t|
|
|
||||||
block.call(t) unless block.nil?
|
|
||||||
dir = args.is_a?(Hash) ? args.keys.first : args
|
|
||||||
(dir.split(File::SEPARATOR) + ['']).inject do |acc, part|
|
|
||||||
(acc + File::SEPARATOR).tap do |d|
|
|
||||||
Dir.mkdir(d) unless File.exists? d
|
|
||||||
end + part
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Declare a rule for auto-tasks.
|
|
||||||
def rule(args, &block)
|
|
||||||
MiniRake::Task.create_rule(args, &block)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Write a message to standard out if $verbose is enabled.
|
|
||||||
def log(msg)
|
|
||||||
print " " if $trace && $verbose
|
|
||||||
puts msg if $verbose
|
|
||||||
end
|
|
||||||
|
|
||||||
# Run the system command +cmd+.
|
|
||||||
def sh(cmd)
|
|
||||||
puts cmd if $verbose
|
|
||||||
|
|
||||||
if !$rake_root_fiber || Fiber.current == $rake_root_fiber
|
|
||||||
system(cmd) or fail "Command Failed: [#{cmd}]"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
pid = Process.spawn(cmd)
|
|
||||||
$rake_fiber_table[pid] = {
|
|
||||||
fiber: Fiber.current,
|
|
||||||
command: cmd,
|
|
||||||
process_waiter: Process.detach(pid)
|
|
||||||
}
|
|
||||||
$rake_root_fiber.transfer
|
|
||||||
end
|
|
||||||
|
|
||||||
def desc(text)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Rake = MiniRake
|
|
||||||
extend MiniRake::DSL
|
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
|
||||||
# Task Definition Functions ...
|
|
||||||
|
|
||||||
######################################################################
|
|
||||||
# Rake main application object. When invoking +rake+ from the command
|
|
||||||
# line, a RakeApp object is created and run.
|
|
||||||
#
|
|
||||||
class RakeApp
|
|
||||||
RAKEFILES = ['rakefile', 'Rakefile']
|
|
||||||
|
|
||||||
OPTIONS = [
|
|
||||||
['--dry-run', '-n', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Do a dry run without executing actions."],
|
|
||||||
['--help', '-H', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Display this help message."],
|
|
||||||
['--libdir', '-I', GetoptLong::REQUIRED_ARGUMENT,
|
|
||||||
"Include LIBDIR in the search path for required modules."],
|
|
||||||
['--nosearch', '-N', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Do not search parent directories for the Rakefile."],
|
|
||||||
['--quiet', '-q', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Do not log messages to standard output (default)."],
|
|
||||||
['--rakefile', '-f', GetoptLong::REQUIRED_ARGUMENT,
|
|
||||||
"Use FILE as the rakefile."],
|
|
||||||
['--require', '-r', GetoptLong::REQUIRED_ARGUMENT,
|
|
||||||
"Require MODULE before executing rakefile."],
|
|
||||||
['--tasks', '-T', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Display the tasks and dependencies, then exit."],
|
|
||||||
['--pull-gems','-p', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Pull all git mrbgems."],
|
|
||||||
['--trace', '-t', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Turn on invoke/execute tracing."],
|
|
||||||
['--usage', '-h', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Display usage."],
|
|
||||||
['--verbose', '-v', GetoptLong::NO_ARGUMENT,
|
|
||||||
"Log message to standard output."],
|
|
||||||
['--directory', '-C', GetoptLong::REQUIRED_ARGUMENT,
|
|
||||||
"Change executing directory of rakefiles."],
|
|
||||||
['--jobs', '-j', GetoptLong::REQUIRED_ARGUMENT,
|
|
||||||
'Execute rake with parallel jobs.']
|
|
||||||
]
|
|
||||||
|
|
||||||
# Create a RakeApp object.
|
|
||||||
def initialize
|
|
||||||
@rakefile = nil
|
|
||||||
@nosearch = false
|
|
||||||
end
|
|
||||||
|
|
||||||
# True if one of the files in RAKEFILES is in the current directory.
|
|
||||||
# If a match is found, it is copied into @rakefile.
|
|
||||||
def have_rakefile
|
|
||||||
RAKEFILES.each do |fn|
|
|
||||||
if File.exist?(fn)
|
|
||||||
@rakefile = fn
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
# Display the program usage line.
|
|
||||||
def usage
|
|
||||||
puts "rake [-f rakefile] {options} targets..."
|
|
||||||
end
|
|
||||||
|
|
||||||
# Display the rake command line help.
|
|
||||||
def help
|
|
||||||
usage
|
|
||||||
puts
|
|
||||||
puts "Options are ..."
|
|
||||||
puts
|
|
||||||
OPTIONS.sort.each do |long, short, mode, desc|
|
|
||||||
if mode == GetoptLong::REQUIRED_ARGUMENT
|
|
||||||
if desc =~ /\b([A-Z]{2,})\b/
|
|
||||||
long = long + "=#{$1}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
printf " %-20s (%s)\n", long, short
|
|
||||||
printf " %s\n", desc
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Display the tasks and dependencies.
|
|
||||||
def display_tasks
|
|
||||||
MiniRake::Task.tasks.each do |t|
|
|
||||||
puts "#{t.class} #{t.name}"
|
|
||||||
t.prerequisites.each { |pre| puts " #{pre}" }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Return a list of the command line options supported by the
|
|
||||||
# program.
|
|
||||||
def command_line_options
|
|
||||||
OPTIONS.collect { |lst| lst[0..-2] }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Do the option defined by +opt+ and +value+.
|
|
||||||
def do_option(opt, value)
|
|
||||||
case opt
|
|
||||||
when '--dry-run'
|
|
||||||
$dryrun = true
|
|
||||||
$trace = true
|
|
||||||
when '--help'
|
|
||||||
help
|
|
||||||
exit
|
|
||||||
when '--libdir'
|
|
||||||
$:.push(value)
|
|
||||||
when '--nosearch'
|
|
||||||
@nosearch = true
|
|
||||||
when '--quiet'
|
|
||||||
$verbose = false
|
|
||||||
when '--rakefile'
|
|
||||||
RAKEFILES.clear
|
|
||||||
RAKEFILES << value
|
|
||||||
when '--require'
|
|
||||||
require value
|
|
||||||
when '--tasks'
|
|
||||||
$show_tasks = true
|
|
||||||
when '--pull-gems'
|
|
||||||
$pull_gems = true
|
|
||||||
when '--trace'
|
|
||||||
$trace = true
|
|
||||||
when '--usage'
|
|
||||||
usage
|
|
||||||
exit
|
|
||||||
when '--verbose'
|
|
||||||
$verbose = true
|
|
||||||
when '--version'
|
|
||||||
puts "rake, version #{RAKEVERSION}"
|
|
||||||
exit
|
|
||||||
when '--directory'
|
|
||||||
Dir.chdir value
|
|
||||||
when '--jobs'
|
|
||||||
$rake_jobs = [value.to_i, 1].max
|
|
||||||
else
|
|
||||||
fail "Unknown option: #{opt}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Read and handle the command line options.
|
|
||||||
def handle_options
|
|
||||||
$verbose = false
|
|
||||||
$pull_gems = false
|
|
||||||
opts = GetoptLong.new(*command_line_options)
|
|
||||||
opts.each { |opt, value| do_option(opt, value) }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Run the +rake+ application.
|
|
||||||
def run
|
|
||||||
handle_options
|
|
||||||
|
|
||||||
unless $rake_root_fiber
|
|
||||||
require 'fiber'
|
|
||||||
$rake_root_fiber = Fiber.current
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
|
||||||
here = Dir.pwd
|
|
||||||
while ! have_rakefile
|
|
||||||
Dir.chdir("..")
|
|
||||||
if Dir.pwd == here || @nosearch
|
|
||||||
fail "No Rakefile found (looking for: #{RAKEFILES.join(', ')})"
|
|
||||||
end
|
|
||||||
here = Dir.pwd
|
|
||||||
end
|
|
||||||
root_tasks = []
|
|
||||||
ARGV.each do |task_name|
|
|
||||||
if /^(\w+)=(.*)/.match(task_name)
|
|
||||||
ENV[$1] = $2
|
|
||||||
else
|
|
||||||
root_tasks << task_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
puts "(in #{Dir.pwd})"
|
|
||||||
$rakefile = @rakefile
|
|
||||||
load @rakefile
|
|
||||||
if $show_tasks
|
|
||||||
display_tasks
|
|
||||||
else
|
|
||||||
root_tasks.push("default") if root_tasks.empty?
|
|
||||||
# revese tasks for popping
|
|
||||||
root_tasks.reverse!
|
|
||||||
|
|
||||||
tasks = []
|
|
||||||
until root_tasks.empty?
|
|
||||||
root_name = root_tasks.pop
|
|
||||||
tasks << root_name
|
|
||||||
until tasks.empty?
|
|
||||||
task_name = tasks.pop
|
|
||||||
t = MiniRake::Task[task_name]
|
|
||||||
f = t.invoke
|
|
||||||
|
|
||||||
# append additional tasks to task queue
|
|
||||||
if f.kind_of?(Array)
|
|
||||||
tasks.push(*f)
|
|
||||||
tasks.uniq!
|
|
||||||
end
|
|
||||||
|
|
||||||
unless f.kind_of? Fiber
|
|
||||||
tasks.insert 0, task_name unless t.done?
|
|
||||||
if root_name == task_name
|
|
||||||
wait_process
|
|
||||||
end
|
|
||||||
next
|
|
||||||
end
|
|
||||||
|
|
||||||
wait_process while $rake_fiber_table.size >= $rake_jobs
|
|
||||||
|
|
||||||
f.transfer
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
wait_process until $rake_fiber_table.empty?
|
|
||||||
end
|
|
||||||
rescue Exception => e
|
|
||||||
begin
|
|
||||||
$rake_failed << e
|
|
||||||
wait_process until $rake_fiber_table.empty?
|
|
||||||
rescue Exception => next_e
|
|
||||||
e = next_e
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return if $rake_failed.empty?
|
|
||||||
|
|
||||||
puts "rake aborted!"
|
|
||||||
$rake_failed.each do |ex|
|
|
||||||
puts ex.message
|
|
||||||
if $trace || $verbose
|
|
||||||
puts ex.backtrace.join("\n")
|
|
||||||
else
|
|
||||||
puts ex.backtrace.find {|str| str =~ /#{@rakefile}/ } || ""
|
|
||||||
end
|
|
||||||
end
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
|
|
||||||
def wait_process(count = 0)
|
|
||||||
dur = [0.0001 * (10 ** count), 1].min
|
|
||||||
sleep dur
|
|
||||||
|
|
||||||
exited = []
|
|
||||||
$rake_fiber_table.each do |pid, v|
|
|
||||||
exited << pid unless v[:process_waiter].alive?
|
|
||||||
end
|
|
||||||
|
|
||||||
exited.each do |pid|
|
|
||||||
ent = $rake_fiber_table.delete pid
|
|
||||||
st = ent[:process_waiter].value
|
|
||||||
|
|
||||||
# ignore process that isn't created by `sh` method
|
|
||||||
return if ent.nil?
|
|
||||||
|
|
||||||
if st.exitstatus != 0
|
|
||||||
raise "Command Failed: [#{ent[:command]}]"
|
|
||||||
end
|
|
||||||
|
|
||||||
fail 'task scheduling bug!' if $rake_fiber_table.size >= $rake_jobs
|
|
||||||
|
|
||||||
ent[:fiber].transfer
|
|
||||||
end
|
|
||||||
|
|
||||||
wait_process(count + 1) if !$rake_fiber_table.empty? && exited.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
if __FILE__ == $0 then
|
|
||||||
RakeApp.new.run
|
|
||||||
end
|
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ MRuby::GemBox.new do |conf|
|
|||||||
# Use toplevel object (main) methods extension
|
# Use toplevel object (main) methods extension
|
||||||
conf.gem :core => "mruby-toplevel-ext"
|
conf.gem :core => "mruby-toplevel-ext"
|
||||||
|
|
||||||
|
# Use Rational/Complex numbers
|
||||||
|
conf.gem :core => "mruby-rational"
|
||||||
|
conf.gem :core => "mruby-complex"
|
||||||
|
|
||||||
# Generate mirb command
|
# Generate mirb command
|
||||||
conf.gem :core => "mruby-bin-mirb"
|
conf.gem :core => "mruby-bin-mirb"
|
||||||
|
|
||||||
@@ -86,6 +90,12 @@ MRuby::GemBox.new do |conf|
|
|||||||
# Use class/module extension
|
# Use class/module extension
|
||||||
conf.gem :core => "mruby-class-ext"
|
conf.gem :core => "mruby-class-ext"
|
||||||
|
|
||||||
|
# Use Method/UnboundMethod class
|
||||||
|
conf.gem :core => "mruby-method"
|
||||||
|
|
||||||
|
# Use eval()
|
||||||
|
conf.gem :core => "mruby-eval"
|
||||||
|
|
||||||
# Use mruby-compiler to build other mrbgems
|
# Use mruby-compiler to build other mrbgems
|
||||||
conf.gem :core => "mruby-compiler"
|
conf.gem :core => "mruby-compiler"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,5 +2,4 @@ MRuby::Gem::Specification.new('mruby-array-ext') do |spec|
|
|||||||
spec.license = 'MIT'
|
spec.license = 'MIT'
|
||||||
spec.author = 'mruby developers'
|
spec.author = 'mruby developers'
|
||||||
spec.summary = 'Array class extension'
|
spec.summary = 'Array class extension'
|
||||||
spec.add_test_dependency 'mruby-enumerator', core: 'mruby-enumerator'
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -88,6 +88,22 @@ class Array
|
|||||||
array
|
array
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# call-seq:
|
||||||
|
# ary.difference(other_ary1, other_ary2, ...) -> new_ary
|
||||||
|
#
|
||||||
|
# Returns a new array that is a copy of the original array, removing all
|
||||||
|
# occurrences of any item that also appear in +other_ary+. The order is
|
||||||
|
# preserved from the original array.
|
||||||
|
#
|
||||||
|
def difference(*args)
|
||||||
|
ary = self
|
||||||
|
args.each do |x|
|
||||||
|
ary = ary - x
|
||||||
|
end
|
||||||
|
ary
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# call-seq:
|
# call-seq:
|
||||||
# ary | other_ary -> new_ary
|
# ary | other_ary -> new_ary
|
||||||
@@ -157,6 +173,24 @@ class Array
|
|||||||
array
|
array
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# call-seq:
|
||||||
|
# ary.intersection(other_ary,...) -> new_ary
|
||||||
|
#
|
||||||
|
# Set Intersection---Returns a new array containing elements common to
|
||||||
|
# this array and <i>other_ary</i>s, removing duplicates. The order is
|
||||||
|
# preserved from the original array.
|
||||||
|
#
|
||||||
|
# [1, 2, 3].intersection([3, 4, 1], [1, 3, 5]) #=> [1, 3]
|
||||||
|
#
|
||||||
|
def intersection(*args)
|
||||||
|
ary = self
|
||||||
|
args.each do |x|
|
||||||
|
ary = ary & x
|
||||||
|
end
|
||||||
|
ary
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# call-seq:
|
# call-seq:
|
||||||
# ary.flatten -> new_ary
|
# ary.flatten -> new_ary
|
||||||
@@ -652,37 +686,6 @@ class Array
|
|||||||
satisfied ? low : nil
|
satisfied ? low : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
|
||||||
# call-seq:
|
|
||||||
# ary.delete_if { |item| block } -> ary
|
|
||||||
# ary.delete_if -> Enumerator
|
|
||||||
#
|
|
||||||
# Deletes every element of +self+ for which block evaluates to +true+.
|
|
||||||
#
|
|
||||||
# The array is changed instantly every time the block is called, not after
|
|
||||||
# the iteration is over.
|
|
||||||
#
|
|
||||||
# See also Array#reject!
|
|
||||||
#
|
|
||||||
# If no block is given, an Enumerator is returned instead.
|
|
||||||
#
|
|
||||||
# scores = [ 97, 42, 75 ]
|
|
||||||
# scores.delete_if {|score| score < 80 } #=> [97]
|
|
||||||
|
|
||||||
def delete_if(&block)
|
|
||||||
return to_enum :delete_if unless block
|
|
||||||
|
|
||||||
idx = 0
|
|
||||||
while idx < self.size do
|
|
||||||
if block.call(self[idx])
|
|
||||||
self.delete_at(idx)
|
|
||||||
else
|
|
||||||
idx += 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
self
|
|
||||||
end
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# call-seq:
|
# call-seq:
|
||||||
# ary.keep_if { |item| block } -> ary
|
# ary.keep_if { |item| block } -> ary
|
||||||
@@ -815,12 +818,11 @@ class Array
|
|||||||
# a.permutation(0).to_a #=> [[]] # one permutation of length 0
|
# a.permutation(0).to_a #=> [[]] # one permutation of length 0
|
||||||
# a.permutation(4).to_a #=> [] # no permutations of length 4
|
# a.permutation(4).to_a #=> [] # no permutations of length 4
|
||||||
def permutation(n=self.size, &block)
|
def permutation(n=self.size, &block)
|
||||||
size = self.size
|
|
||||||
return to_enum(:permutation, n) unless block
|
return to_enum(:permutation, n) unless block
|
||||||
return if n > size
|
size = self.size
|
||||||
if n == 0
|
if n == 0
|
||||||
yield []
|
yield []
|
||||||
else
|
elsif 0 < n && n <= size
|
||||||
i = 0
|
i = 0
|
||||||
while i<size
|
while i<size
|
||||||
result = [self[i]]
|
result = [self[i]]
|
||||||
@@ -835,6 +837,7 @@ class Array
|
|||||||
i += 1
|
i += 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -861,9 +864,8 @@ class Array
|
|||||||
# a.combination(5).to_a #=> [] # no combinations of length 5
|
# a.combination(5).to_a #=> [] # no combinations of length 5
|
||||||
|
|
||||||
def combination(n, &block)
|
def combination(n, &block)
|
||||||
size = self.size
|
|
||||||
return to_enum(:combination, n) unless block
|
return to_enum(:combination, n) unless block
|
||||||
return if n > size
|
size = self.size
|
||||||
if n == 0
|
if n == 0
|
||||||
yield []
|
yield []
|
||||||
elsif n == 1
|
elsif n == 1
|
||||||
@@ -872,7 +874,7 @@ class Array
|
|||||||
yield [self[i]]
|
yield [self[i]]
|
||||||
i += 1
|
i += 1
|
||||||
end
|
end
|
||||||
else
|
elsif n <= size
|
||||||
i = 0
|
i = 0
|
||||||
while i<size
|
while i<size
|
||||||
result = [self[i]]
|
result = [self[i]]
|
||||||
@@ -882,6 +884,7 @@ class Array
|
|||||||
i += 1
|
i += 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -903,8 +906,8 @@ class Array
|
|||||||
column_count = nil
|
column_count = nil
|
||||||
self.each do |row|
|
self.each do |row|
|
||||||
raise TypeError unless row.is_a?(Array)
|
raise TypeError unless row.is_a?(Array)
|
||||||
column_count ||= row.count
|
column_count ||= row.size
|
||||||
raise IndexError, 'element size differs' unless column_count == row.count
|
raise IndexError, 'element size differs' unless column_count == row.size
|
||||||
end
|
end
|
||||||
|
|
||||||
Array.new(column_count) do |column_index|
|
Array.new(column_count) do |column_index|
|
||||||
@@ -936,4 +939,8 @@ class Array
|
|||||||
end
|
end
|
||||||
h
|
h
|
||||||
end
|
end
|
||||||
|
|
||||||
|
alias append push
|
||||||
|
alias prepend unshift
|
||||||
|
alias filter! select!
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -28,9 +28,8 @@ static mrb_value
|
|||||||
mrb_ary_assoc(mrb_state *mrb, mrb_value ary)
|
mrb_ary_assoc(mrb_state *mrb, mrb_value ary)
|
||||||
{
|
{
|
||||||
mrb_int i;
|
mrb_int i;
|
||||||
mrb_value v, k;
|
mrb_value v;
|
||||||
|
mrb_value k = mrb_get_arg1(mrb);
|
||||||
mrb_get_args(mrb, "o", &k);
|
|
||||||
|
|
||||||
for (i = 0; i < RARRAY_LEN(ary); ++i) {
|
for (i = 0; i < RARRAY_LEN(ary); ++i) {
|
||||||
v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
|
v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
|
||||||
@@ -59,13 +58,12 @@ static mrb_value
|
|||||||
mrb_ary_rassoc(mrb_state *mrb, mrb_value ary)
|
mrb_ary_rassoc(mrb_state *mrb, mrb_value ary)
|
||||||
{
|
{
|
||||||
mrb_int i;
|
mrb_int i;
|
||||||
mrb_value v, value;
|
mrb_value v;
|
||||||
|
mrb_value value = mrb_get_arg1(mrb);
|
||||||
mrb_get_args(mrb, "o", &value);
|
|
||||||
|
|
||||||
for (i = 0; i < RARRAY_LEN(ary); ++i) {
|
for (i = 0; i < RARRAY_LEN(ary); ++i) {
|
||||||
v = RARRAY_PTR(ary)[i];
|
v = RARRAY_PTR(ary)[i];
|
||||||
if (mrb_type(v) == MRB_TT_ARRAY &&
|
if (mrb_array_p(v) &&
|
||||||
RARRAY_LEN(v) > 1 &&
|
RARRAY_LEN(v) > 1 &&
|
||||||
mrb_equal(mrb, RARRAY_PTR(v)[1], value))
|
mrb_equal(mrb, RARRAY_PTR(v)[1], value))
|
||||||
return v;
|
return v;
|
||||||
@@ -140,12 +138,11 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
|
|||||||
mrb_ary_modify(mrb, a);
|
mrb_ary_modify(mrb, a);
|
||||||
|
|
||||||
if (mrb_get_argc(mrb) == 1) {
|
if (mrb_get_argc(mrb) == 1) {
|
||||||
mrb_value index;
|
mrb_value index = mrb_get_arg1(mrb);
|
||||||
|
|
||||||
mrb_get_args(mrb, "o|i", &index, &len);
|
|
||||||
switch (mrb_type(index)) {
|
switch (mrb_type(index)) {
|
||||||
case MRB_TT_RANGE:
|
case MRB_TT_RANGE:
|
||||||
if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == 1) {
|
if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == MRB_RANGE_OK) {
|
||||||
goto delete_pos_len;
|
goto delete_pos_len;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -194,7 +191,7 @@ mrb_mruby_array_ext_gem_init(mrb_state* mrb)
|
|||||||
mrb_define_method(mrb, a, "at", mrb_ary_at, MRB_ARGS_REQ(1));
|
mrb_define_method(mrb, a, "at", mrb_ary_at, MRB_ARGS_REQ(1));
|
||||||
mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1));
|
mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1));
|
||||||
mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY());
|
mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY());
|
||||||
mrb_define_method(mrb, a, "slice!", mrb_ary_slice_bang, MRB_ARGS_ANY());
|
mrb_define_method(mrb, a, "slice!", mrb_ary_slice_bang, MRB_ARGS_ARG(1,1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -1,6 +1,23 @@
|
|||||||
##
|
##
|
||||||
# Array(Ext) Test
|
# Array(Ext) Test
|
||||||
|
|
||||||
|
def assert_permutation_combination(exp, receiver, meth, *args)
|
||||||
|
act = []
|
||||||
|
ret = receiver.__send__(meth, *args) { |v| act << v }
|
||||||
|
assert "assert_#{meth}" do
|
||||||
|
assert_equal(exp, act.sort)
|
||||||
|
assert_same(receiver, ret)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_permutation(exp, receiver, *args)
|
||||||
|
assert_permutation_combination(exp, receiver, :permutation, *args)
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_combination(exp, receiver, *args)
|
||||||
|
assert_permutation_combination(exp, receiver, :combination, *args)
|
||||||
|
end
|
||||||
|
|
||||||
assert("Array#assoc") do
|
assert("Array#assoc") do
|
||||||
s1 = [ "colors", "red", "blue", "green" ]
|
s1 = [ "colors", "red", "blue", "green" ]
|
||||||
s2 = [ "letters", "a", "b", "c" ]
|
s2 = [ "letters", "a", "b", "c" ]
|
||||||
@@ -76,6 +93,14 @@ assert("Array#union") do
|
|||||||
assert_equal [1, 2, 3, 4, 5], a.union(b,c)
|
assert_equal [1, 2, 3, 4, 5], a.union(b,c)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert("Array#difference") do
|
||||||
|
a = [1, 2, 3, 1, 6, 7]
|
||||||
|
b = [1, 4, 6]
|
||||||
|
c = [1, 5, 7]
|
||||||
|
|
||||||
|
assert_equal [2, 3], a.difference(b,c)
|
||||||
|
end
|
||||||
|
|
||||||
assert("Array#&") do
|
assert("Array#&") do
|
||||||
a = [1, 2, 3, 1]
|
a = [1, 2, 3, 1]
|
||||||
b = [1, 4]
|
b = [1, 4]
|
||||||
@@ -86,6 +111,14 @@ assert("Array#&") do
|
|||||||
assert_equal [1, 2, 3, 1], a
|
assert_equal [1, 2, 3, 1], a
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert("Array#intersection") do
|
||||||
|
a = [1, 2, 3, 1, 8, 6, 7, 8]
|
||||||
|
b = [1, 4, 6, 8]
|
||||||
|
c = [1, 5, 7, 8]
|
||||||
|
|
||||||
|
assert_equal [1, 8], a.intersection(b,c)
|
||||||
|
end
|
||||||
|
|
||||||
assert("Array#flatten") do
|
assert("Array#flatten") do
|
||||||
assert_equal [1, 2, "3", {4=>5}, :'6'], [1, 2, "3", {4=>5}, :'6'].flatten
|
assert_equal [1, 2, "3", {4=>5}, :'6'], [1, 2, "3", {4=>5}, :'6'].flatten
|
||||||
assert_equal [1, 2, 3, 4, 5, 6], [1, 2, [3, 4, 5], 6].flatten
|
assert_equal [1, 2, 3, 4, 5, 6], [1, 2, [3, 4, 5], 6].flatten
|
||||||
@@ -162,12 +195,6 @@ assert("Array#reverse_each") do
|
|||||||
b << i
|
b << i
|
||||||
end
|
end
|
||||||
assert_equal [ "d", "c", "b", "a" ], b
|
assert_equal [ "d", "c", "b", "a" ], b
|
||||||
|
|
||||||
if Object.const_defined?(:Enumerator)
|
|
||||||
assert_equal [ "d", "c", "b", "a" ], a.reverse_each.to_a
|
|
||||||
else
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
assert("Array#rotate") do
|
assert("Array#rotate") do
|
||||||
@@ -268,22 +295,9 @@ assert("Array#bsearch") do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
assert("Array#bsearch_index") do
|
# tested through Array#bsearch
|
||||||
# tested through Array#bsearch
|
#assert("Array#bsearch_index") do
|
||||||
end
|
#end
|
||||||
|
|
||||||
assert("Array#delete_if") do
|
|
||||||
a = [1, 2, 3, 4, 5]
|
|
||||||
assert_equal [1, 2, 3, 4, 5], a.delete_if { false }
|
|
||||||
assert_equal [1, 2, 3, 4, 5], a
|
|
||||||
|
|
||||||
a = [1, 2, 3, 4, 5]
|
|
||||||
assert_equal [], a.delete_if { true }
|
|
||||||
assert_equal [], a
|
|
||||||
|
|
||||||
a = [ 1, 2, 3, 4, 5 ]
|
|
||||||
assert_equal [1, 2, 3], a.delete_if { |val| val > 3 }
|
|
||||||
end
|
|
||||||
|
|
||||||
assert("Array#keep_if") do
|
assert("Array#keep_if") do
|
||||||
a = [1, 2, 3, 4, 5]
|
a = [1, 2, 3, 4, 5]
|
||||||
@@ -369,30 +383,24 @@ end
|
|||||||
|
|
||||||
assert("Array#permutation") do
|
assert("Array#permutation") do
|
||||||
a = [1, 2, 3]
|
a = [1, 2, 3]
|
||||||
assert_equal([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],
|
assert_permutation([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]], a)
|
||||||
a.permutation.to_a)
|
assert_permutation([[1],[2],[3]], a, 1)
|
||||||
assert_equal([[1],[2],[3]],
|
assert_permutation([[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]], a, 2)
|
||||||
a.permutation(1).to_a)
|
assert_permutation([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]], a, 3)
|
||||||
assert_equal([[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]],
|
assert_permutation([[]], a, 0)
|
||||||
a.permutation(2).to_a)
|
assert_permutation([], a, 4)
|
||||||
assert_equal([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],
|
assert_permutation([], a, -1)
|
||||||
a.permutation(3).to_a)
|
|
||||||
assert_equal([[]], a.permutation(0).to_a)
|
|
||||||
assert_equal([], a.permutation(4).to_a)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
assert("Array#combination") do
|
assert("Array#combination") do
|
||||||
a = [1, 2, 3, 4]
|
a = [1, 2, 3, 4]
|
||||||
assert_equal([[1],[2],[3],[4]],
|
assert_combination([[1],[2],[3],[4]], a, 1)
|
||||||
a.combination(1).to_a)
|
assert_combination([[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]], a, 2)
|
||||||
assert_equal([[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]],
|
assert_combination([[1,2,3],[1,2,4],[1,3,4],[2,3,4]], a, 3)
|
||||||
a.combination(2).to_a)
|
assert_combination([[1,2,3,4]], a, 4)
|
||||||
assert_equal([[1,2,3],[1,2,4],[1,3,4],[2,3,4]],
|
assert_combination([[]], a, 0)
|
||||||
a.combination(3).to_a)
|
assert_combination([], a, 5)
|
||||||
assert_equal([[1,2,3,4]],
|
assert_combination([], a, -1)
|
||||||
a.combination(4).to_a)
|
|
||||||
assert_equal([[]], a.combination(0).to_a)
|
|
||||||
assert_equal([], a.combination(5).to_a)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
assert('Array#transpose') do
|
assert('Array#transpose') do
|
||||||
|
|||||||
@@ -5,19 +5,22 @@ unless MRuby::Build.current.kind_of?(MRuby::CrossBuild)
|
|||||||
spec.author = 'mruby developers'
|
spec.author = 'mruby developers'
|
||||||
spec.summary = "#{name} command"
|
spec.summary = "#{name} command"
|
||||||
|
|
||||||
|
mruby_config_dir = "#{build.build_dir}/bin"
|
||||||
mruby_config = name + (ENV['OS'] == 'Windows_NT' ? '.bat' : '')
|
mruby_config = name + (ENV['OS'] == 'Windows_NT' ? '.bat' : '')
|
||||||
mruby_config_path = "#{build.build_dir}/bin/#{mruby_config}"
|
mruby_config_path = "#{mruby_config_dir}/#{mruby_config}"
|
||||||
make_cfg = "#{build.build_dir}/lib/libmruby.flags.mak"
|
make_cfg = "#{build.build_dir}/lib/libmruby.flags.mak"
|
||||||
tmplt_path = "#{__dir__}/#{mruby_config}"
|
tmplt_path = "#{__dir__}/#{mruby_config}"
|
||||||
build.bins << mruby_config
|
build.bins << mruby_config
|
||||||
|
|
||||||
file mruby_config_path => [make_cfg, tmplt_path] do |t|
|
directory mruby_config_dir
|
||||||
|
|
||||||
|
file mruby_config_path => [mruby_config_dir, make_cfg, tmplt_path] do |t|
|
||||||
config = Hash[File.readlines(make_cfg).map!(&:chomp).map! {|l|
|
config = Hash[File.readlines(make_cfg).map!(&:chomp).map! {|l|
|
||||||
l.gsub('\\"', '"').split(' = ', 2).map! {|s| s.sub(/^(?=.)/, 'echo ')}
|
l.gsub('\\"', '"').split(' = ', 2).map! {|s| s.sub(/^(?=.)/, 'echo ')}
|
||||||
}]
|
}]
|
||||||
tmplt = File.read(tmplt_path)
|
tmplt = File.read(tmplt_path)
|
||||||
File.write(t.name, tmplt.gsub(/(#{Regexp.union(*config.keys)})\b/, config))
|
File.write(t.name, tmplt.gsub(/(#{Regexp.union(*config.keys)})\b/, config))
|
||||||
FileUtils.chmod(0755, t.name)
|
chmod(0755, t.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
require 'open3'
|
require 'open3'
|
||||||
require 'tempfile'
|
require 'tempfile'
|
||||||
|
require 'strscan'
|
||||||
|
|
||||||
class BinTest_MrubyBinDebugger
|
class BinTest_MrubyBinDebugger
|
||||||
@debug1=false
|
# @debug1=false
|
||||||
@debug2=true
|
# @debug2=true
|
||||||
def self.test(rubysource, testcase)
|
def self.test(rubysource, testcase)
|
||||||
script, bin = Tempfile.new(['test', '.rb']), Tempfile.new(['test', '.mrb'])
|
script, bin = Tempfile.new(['test', '.rb']), Tempfile.new(['test', '.mrb'])
|
||||||
|
|
||||||
@@ -19,10 +20,20 @@ class BinTest_MrubyBinDebugger
|
|||||||
|
|
||||||
stdin_data = testcase.map{|t| t[:cmd]}.join("\n") << "\n"
|
stdin_data = testcase.map{|t| t[:cmd]}.join("\n") << "\n"
|
||||||
|
|
||||||
|
prompt = /^\(#{Regexp.escape(script.path)}:\d+\) /
|
||||||
["bin/mrdb #{script.path}","bin/mrdb -b #{bin.path}"].each do |cmd|
|
["bin/mrdb #{script.path}","bin/mrdb -b #{bin.path}"].each do |cmd|
|
||||||
o, s = Open3.capture2(cmd, :stdin_data => stdin_data)
|
o, s = Open3.capture2(cmd, :stdin_data => stdin_data)
|
||||||
|
scanner = StringScanner.new(o)
|
||||||
|
scanner.skip_until(prompt)
|
||||||
|
testcase.each do |tc|
|
||||||
|
exp = tc[:exp]
|
||||||
|
if exp
|
||||||
|
act = scanner.scan_until(/\n/)
|
||||||
|
break unless assert_operator act, :start_with?, exp
|
||||||
|
end
|
||||||
|
scanner.skip_until(prompt)
|
||||||
|
end
|
||||||
|
|
||||||
exp_vals = testcase.map{|t| t.fetch(:exp, nil)}
|
|
||||||
=begin
|
=begin
|
||||||
if @debug1
|
if @debug1
|
||||||
o.split("\n").each_with_index do |i,actual|
|
o.split("\n").each_with_index do |i,actual|
|
||||||
@@ -41,14 +52,6 @@ end
|
|||||||
assert_true actual.include?(exp) unless exp.nil?
|
assert_true actual.include?(exp) unless exp.nil?
|
||||||
end
|
end
|
||||||
=end
|
=end
|
||||||
idx = 0
|
|
||||||
exp_vals.each do |exp|
|
|
||||||
next if exp.nil?
|
|
||||||
idx = o.index(exp, idx)
|
|
||||||
assert_false idx.nil?
|
|
||||||
break unless idx
|
|
||||||
idx += 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -90,8 +93,8 @@ assert('mruby-bin-debugger(print) error') do
|
|||||||
|
|
||||||
# test case
|
# test case
|
||||||
tc = []
|
tc = []
|
||||||
tc << {:cmd=>"p (1+2", :exp=>'$1 = SyntaxError'}
|
tc << {:cmd=>"p (1+2", :exp=>'$1 = line 1: syntax error'}
|
||||||
tc << {:cmd=>"p bar", :exp=>'$2 = (eval):2: undefined method'}
|
tc << {:cmd=>"p bar", :exp=>'$2 = undefined method'}
|
||||||
|
|
||||||
BinTest_MrubyBinDebugger.test(src, tc)
|
BinTest_MrubyBinDebugger.test(src, tc)
|
||||||
end
|
end
|
||||||
@@ -588,7 +591,7 @@ SRC
|
|||||||
tc << {:cmd=>'p foo=[foo,bar,baz]', :exp=>'$2 = ["foo", "bar", "baz"]'}
|
tc << {:cmd=>'p foo=[foo,bar,baz]', :exp=>'$2 = ["foo", "bar", "baz"]'}
|
||||||
|
|
||||||
tc << {:cmd=>'p undefined=-1', :exp=>'$3 = -1'}
|
tc << {:cmd=>'p undefined=-1', :exp=>'$3 = -1'}
|
||||||
tc << {:cmd=>'p "#{undefined}"', :exp=>'$4 = (eval):2: undefined method'}
|
tc << {:cmd=>'p "#{undefined}"', :exp=>'$4 = undefined method'}
|
||||||
|
|
||||||
BinTest_MrubyBinDebugger.test(src, tc)
|
BinTest_MrubyBinDebugger.test(src, tc)
|
||||||
end
|
end
|
||||||
@@ -626,7 +629,7 @@ SRC
|
|||||||
tc << {:cmd=>'p [a,b]', :exp=>'$13 = [20, 10]'}
|
tc << {:cmd=>'p [a,b]', :exp=>'$13 = [20, 10]'}
|
||||||
|
|
||||||
tc << {:cmd=>'p undefined=-1', :exp=>'$14 = -1'}
|
tc << {:cmd=>'p undefined=-1', :exp=>'$14 = -1'}
|
||||||
tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = (eval):2: undefined method'}
|
tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = undefined method'}
|
||||||
|
|
||||||
BinTest_MrubyBinDebugger.test(src, tc)
|
BinTest_MrubyBinDebugger.test(src, tc)
|
||||||
end
|
end
|
||||||
@@ -694,8 +697,7 @@ SRC
|
|||||||
tc << {:cmd=>'p [a,b]', :exp=>'$13 = [20, 10]'}
|
tc << {:cmd=>'p [a,b]', :exp=>'$13 = [20, 10]'}
|
||||||
|
|
||||||
tc << {:cmd=>'p undefined=-1', :exp=>'$14 = -1'}
|
tc << {:cmd=>'p undefined=-1', :exp=>'$14 = -1'}
|
||||||
tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = (eval):2: undefined method'}
|
tc << {:cmd=>'p "#{undefined}"', :exp=>'$15 = undefined method'}
|
||||||
|
|
||||||
BinTest_MrubyBinDebugger.test(src, tc)
|
BinTest_MrubyBinDebugger.test(src, tc)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ check_file_lineno(mrb_state *mrb, struct mrb_irep *irep, const char *file, uint1
|
|||||||
for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
|
for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
|
||||||
const char *filename;
|
const char *filename;
|
||||||
info_file = irep->debug_info->files[f_idx];
|
info_file = irep->debug_info->files[f_idx];
|
||||||
filename = mrb_sym2name_len(mrb, info_file->filename_sym, NULL);
|
filename = mrb_sym_name_len(mrb, info_file->filename_sym, NULL);
|
||||||
if (!strcmp(filename, file)) {
|
if (!strcmp(filename, file)) {
|
||||||
result = MRB_DEBUG_BP_FILE_OK;
|
result = MRB_DEBUG_BP_FILE_OK;
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ compare_break_method(mrb_state *mrb, mrb_debug_breakpoint *bp, struct RClass *cl
|
|||||||
mrb_debug_methodpoint *method_p;
|
mrb_debug_methodpoint *method_p;
|
||||||
mrb_bool is_defined;
|
mrb_bool is_defined;
|
||||||
|
|
||||||
method_name = mrb_sym2name(mrb, method_sym);
|
method_name = mrb_sym_name(mrb, method_sym);
|
||||||
|
|
||||||
method_p = &bp->point.methodpoint;
|
method_p = &bp->point.methodpoint;
|
||||||
if (strcmp(method_p->method_name, method_name) == 0) {
|
if (strcmp(method_p->method_name, method_name) == 0) {
|
||||||
@@ -428,7 +428,7 @@ mrb_debug_disable_break_all(mrb_state *mrb, mrb_debug_context *dbg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static mrb_bool
|
static mrb_bool
|
||||||
check_start_pc_for_line(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, uint16_t line)
|
check_start_pc_for_line(mrb_state *mrb, mrb_irep *irep, const mrb_code *pc, uint16_t line)
|
||||||
{
|
{
|
||||||
if (pc > irep->iseq) {
|
if (pc > irep->iseq) {
|
||||||
if (line == mrb_debug_get_line(mrb, irep, pc - irep->iseq - 1)) {
|
if (line == mrb_debug_get_line(mrb, irep, pc - irep->iseq - 1)) {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ mrdb_check_syntax(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size
|
|||||||
mrb_value
|
mrb_value
|
||||||
mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len, mrb_bool *exc, int direct_eval)
|
mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len, mrb_bool *exc, int direct_eval)
|
||||||
{
|
{
|
||||||
void (*tmp)(struct mrb_state *, struct mrb_irep *, mrb_code *, mrb_value *);
|
void (*tmp)(struct mrb_state *, struct mrb_irep *, const mrb_code *, mrb_value *);
|
||||||
mrb_value ruby_code;
|
mrb_value ruby_code;
|
||||||
mrb_value s;
|
mrb_value s;
|
||||||
mrb_value v;
|
mrb_value v;
|
||||||
@@ -74,7 +74,7 @@ mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t
|
|||||||
*exc = mrb_obj_is_kind_of(mrb, v, mrb->eException_class);
|
*exc = mrb_obj_is_kind_of(mrb, v, mrb->eException_class);
|
||||||
}
|
}
|
||||||
|
|
||||||
s = mrb_funcall(mrb, v, "inspect", 0);
|
s = mrb_inspect(mrb, v);
|
||||||
|
|
||||||
/* enable code_fetch_hook */
|
/* enable code_fetch_hook */
|
||||||
mrb->code_fetch_hook = tmp;
|
mrb->code_fetch_hook = tmp;
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ dbgcmd_print(mrb_state *mrb, mrdb_state *mrdb)
|
|||||||
{
|
{
|
||||||
mrb_value expr;
|
mrb_value expr;
|
||||||
mrb_value result;
|
mrb_value result;
|
||||||
mrb_value s;
|
|
||||||
uint8_t wcnt;
|
uint8_t wcnt;
|
||||||
int ai;
|
int ai;
|
||||||
|
|
||||||
@@ -39,8 +38,9 @@ dbgcmd_print(mrb_state *mrb, mrdb_state *mrdb)
|
|||||||
result = mrb_debug_eval(mrb, mrdb->dbg, RSTRING_PTR(expr), RSTRING_LEN(expr), NULL, 0);
|
result = mrb_debug_eval(mrb, mrdb->dbg, RSTRING_PTR(expr), RSTRING_LEN(expr), NULL, 0);
|
||||||
|
|
||||||
/* $print_no = result */
|
/* $print_no = result */
|
||||||
s = mrb_str_cat_lit(mrb, result, "\0");
|
printf("$%lu = ", (unsigned long)mrdb->print_no++);
|
||||||
printf("$%lu = %s\n", (unsigned long)mrdb->print_no++, RSTRING_PTR(s));
|
fwrite(RSTRING_PTR(result), RSTRING_LEN(result), 1, stdout);
|
||||||
|
putc('\n', stdout);
|
||||||
|
|
||||||
if (mrdb->print_no == 0) {
|
if (mrdb->print_no == 0) {
|
||||||
mrdb->print_no = 1;
|
mrdb->print_no = 1;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include <mruby.h>
|
#include <mruby.h>
|
||||||
@@ -505,7 +504,7 @@ get_and_parse_command(mrb_state *mrb, mrdb_state *mrdb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int32_t
|
static int32_t
|
||||||
check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *regs)
|
check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, const mrb_code *pc, mrb_value *regs)
|
||||||
{
|
{
|
||||||
struct RClass* c;
|
struct RClass* c;
|
||||||
mrb_sym sym;
|
mrb_sym sym;
|
||||||
@@ -546,7 +545,7 @@ check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *regs)
|
mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, const mrb_code *pc, mrb_value *regs)
|
||||||
{
|
{
|
||||||
const char *file;
|
const char *file;
|
||||||
int32_t line;
|
int32_t line;
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ typedef struct mrb_debug_breakpoint {
|
|||||||
typedef struct mrb_debug_context {
|
typedef struct mrb_debug_context {
|
||||||
struct mrb_irep *root_irep;
|
struct mrb_irep *root_irep;
|
||||||
struct mrb_irep *irep;
|
struct mrb_irep *irep;
|
||||||
mrb_code *pc;
|
const mrb_code *pc;
|
||||||
mrb_value *regs;
|
mrb_value *regs;
|
||||||
|
|
||||||
const char *prvfile;
|
const char *prvfile;
|
||||||
|
|||||||
@@ -6,6 +6,14 @@
|
|||||||
#ifndef MRDBCONF_H
|
#ifndef MRDBCONF_H
|
||||||
#define MRDBCONF_H
|
#define MRDBCONF_H
|
||||||
|
|
||||||
|
#ifndef MRB_ENABLE_DEBUG_HOOK
|
||||||
|
# error mruby-bin-debugger need 'MRB_ENABLE_DEBUG_HOOK' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MRB_DISABLE_STDIO
|
||||||
|
# error mruby-bin-debugger conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
/* configuration options: */
|
/* configuration options: */
|
||||||
/* maximum size for command buffer */
|
/* maximum size for command buffer */
|
||||||
#define MAX_COMMAND_LINE 1024
|
#define MAX_COMMAND_LINE 1024
|
||||||
|
|||||||
@@ -7,6 +7,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <mruby.h>
|
#include <mruby.h>
|
||||||
|
|
||||||
|
#ifdef MRB_DISABLE_STDIO
|
||||||
|
# error mruby-bin-mirb conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <mruby/array.h>
|
#include <mruby/array.h>
|
||||||
#include <mruby/proc.h>
|
#include <mruby/proc.h>
|
||||||
#include <mruby/compile.h>
|
#include <mruby/compile.h>
|
||||||
@@ -17,7 +22,6 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
@@ -240,7 +244,7 @@ usage(const char *name)
|
|||||||
};
|
};
|
||||||
const char *const *p = usage_msg;
|
const char *const *p = usage_msg;
|
||||||
|
|
||||||
printf("Usage: %s [switches]\n", name);
|
printf("Usage: %s [switches] [programfile] [arguments]\n", name);
|
||||||
while (*p)
|
while (*p)
|
||||||
printf(" %s\n", *p++);
|
printf(" %s\n", *p++);
|
||||||
}
|
}
|
||||||
@@ -406,6 +410,26 @@ ctrl_c_handler(int signo)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISABLE_MIRB_UNDERSCORE
|
||||||
|
void decl_lv_underscore(mrb_state *mrb, mrbc_context *cxt)
|
||||||
|
{
|
||||||
|
struct RProc *proc;
|
||||||
|
struct mrb_parser_state *parser;
|
||||||
|
|
||||||
|
parser = mrb_parse_string(mrb, "_=nil", cxt);
|
||||||
|
if (parser == NULL) {
|
||||||
|
fputs("create parser state error\n", stderr);
|
||||||
|
mrb_close(mrb);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
proc = mrb_generate_code(mrb, parser);
|
||||||
|
mrb_vm_run(mrb, proc, mrb_top_self(mrb), 0);
|
||||||
|
|
||||||
|
mrb_parser_free(parser);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -471,6 +495,10 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
cxt = mrbc_context_new(mrb);
|
cxt = mrbc_context_new(mrb);
|
||||||
|
|
||||||
|
#ifndef DISABLE_MIRB_UNDERSCORE
|
||||||
|
decl_lv_underscore(mrb, cxt);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Load libraries */
|
/* Load libraries */
|
||||||
for (i = 0; i < args.libc; i++) {
|
for (i = 0; i < args.libc; i++) {
|
||||||
FILE *lfp = fopen(args.libv[i], "r");
|
FILE *lfp = fopen(args.libv[i], "r");
|
||||||
@@ -621,8 +649,8 @@ main(int argc, char **argv)
|
|||||||
/* adjust stack length of toplevel environment */
|
/* adjust stack length of toplevel environment */
|
||||||
if (mrb->c->cibase->env) {
|
if (mrb->c->cibase->env) {
|
||||||
struct REnv *e = mrb->c->cibase->env;
|
struct REnv *e = mrb->c->cibase->env;
|
||||||
if (e && MRB_ENV_STACK_LEN(e) < proc->body.irep->nlocals) {
|
if (e && MRB_ENV_LEN(e) < proc->body.irep->nlocals) {
|
||||||
MRB_ENV_SET_STACK_LEN(e, proc->body.irep->nlocals);
|
MRB_ENV_SET_LEN(e, proc->body.irep->nlocals);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* pass a proc for evaluation */
|
/* pass a proc for evaluation */
|
||||||
@@ -643,6 +671,9 @@ main(int argc, char **argv)
|
|||||||
result = mrb_any_to_s(mrb, result);
|
result = mrb_any_to_s(mrb, result);
|
||||||
}
|
}
|
||||||
p(mrb, result, 1);
|
p(mrb, result, 1);
|
||||||
|
#ifndef DISABLE_MIRB_UNDERSCORE
|
||||||
|
*(mrb->c->stack + 1) = result;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ruby_code[0] = '\0';
|
ruby_code[0] = '\0';
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
#include <stdio.h>
|
#include <mruby.h>
|
||||||
|
|
||||||
|
#ifdef MRB_DISABLE_STDIO
|
||||||
|
# error mruby-bin-mrbc conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mruby.h>
|
|
||||||
#include <mruby/compile.h>
|
#include <mruby/compile.h>
|
||||||
#include <mruby/dump.h>
|
#include <mruby/dump.h>
|
||||||
#include <mruby/proc.h>
|
#include <mruby/proc.h>
|
||||||
@@ -32,8 +36,6 @@ usage(const char *name)
|
|||||||
"-v print version number, then turn on verbose mode",
|
"-v print version number, then turn on verbose mode",
|
||||||
"-g produce debugging information",
|
"-g produce debugging information",
|
||||||
"-B<symbol> binary <symbol> output in C language format",
|
"-B<symbol> binary <symbol> output in C language format",
|
||||||
"-e generate little endian iseq data",
|
|
||||||
"-E generate big endian iseq data",
|
|
||||||
"--remove-lv remove local variables",
|
"--remove-lv remove local variables",
|
||||||
"--verbose run at verbose mode",
|
"--verbose run at verbose mode",
|
||||||
"--version print the version",
|
"--version print the version",
|
||||||
@@ -50,19 +52,26 @@ usage(const char *name)
|
|||||||
static char *
|
static char *
|
||||||
get_outfilename(mrb_state *mrb, char *infile, const char *ext)
|
get_outfilename(mrb_state *mrb, char *infile, const char *ext)
|
||||||
{
|
{
|
||||||
size_t infilelen;
|
size_t ilen, flen, elen;
|
||||||
size_t extlen;
|
|
||||||
char *outfile;
|
char *outfile;
|
||||||
char *p;
|
char *p = NULL;
|
||||||
|
|
||||||
infilelen = strlen(infile);
|
ilen = strlen(infile);
|
||||||
extlen = strlen(ext);
|
flen = ilen;
|
||||||
outfile = (char*)mrb_malloc(mrb, infilelen + extlen + 1);
|
|
||||||
memcpy(outfile, infile, infilelen + 1);
|
|
||||||
if (*ext) {
|
if (*ext) {
|
||||||
if ((p = strrchr(outfile, '.')) == NULL)
|
elen = strlen(ext);
|
||||||
p = outfile + infilelen;
|
if ((p = strrchr(infile, '.'))) {
|
||||||
memcpy(p, ext, extlen + 1);
|
ilen = p - infile;
|
||||||
|
}
|
||||||
|
flen += elen;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
flen = ilen;
|
||||||
|
}
|
||||||
|
outfile = (char*)mrb_malloc(mrb, flen+1);
|
||||||
|
strncpy(outfile, infile, ilen+1);
|
||||||
|
if (p) {
|
||||||
|
strncpy(outfile+ilen, ext, elen+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return outfile;
|
return outfile;
|
||||||
@@ -71,7 +80,6 @@ get_outfilename(mrb_state *mrb, char *infile, const char *ext)
|
|||||||
static int
|
static int
|
||||||
parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
||||||
{
|
{
|
||||||
char *outfile = NULL;
|
|
||||||
static const struct mrbc_args args_zero = { 0 };
|
static const struct mrbc_args args_zero = { 0 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -86,7 +94,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|||||||
case 'o':
|
case 'o':
|
||||||
if (args->outfile) {
|
if (args->outfile) {
|
||||||
fprintf(stderr, "%s: an output file is already specified. (%s)\n",
|
fprintf(stderr, "%s: an output file is already specified. (%s)\n",
|
||||||
args->prog, outfile);
|
args->prog, args->outfile);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (argv[i][2] == '\0' && argv[i+1]) {
|
if (argv[i][2] == '\0' && argv[i+1]) {
|
||||||
@@ -121,10 +129,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|||||||
args->flags |= DUMP_DEBUG_INFO;
|
args->flags |= DUMP_DEBUG_INFO;
|
||||||
break;
|
break;
|
||||||
case 'E':
|
case 'E':
|
||||||
args->flags = DUMP_ENDIAN_BIG | (args->flags & ~DUMP_ENDIAN_MASK);
|
|
||||||
break;
|
|
||||||
case 'e':
|
case 'e':
|
||||||
args->flags = DUMP_ENDIAN_LIL | (args->flags & ~DUMP_ENDIAN_MASK);
|
fprintf(stderr, "%s: -e/-E option no longer needed.\n", args->prog);
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
return -1;
|
return -1;
|
||||||
@@ -157,10 +163,6 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (args->verbose && args->initname && (args->flags & DUMP_ENDIAN_MASK) == 0) {
|
|
||||||
fprintf(stderr, "%s: generating %s endian C file. specify -e/-E for cross compiling.\n",
|
|
||||||
args->prog, bigendian_p() ? "big" : "little");
|
|
||||||
}
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +186,7 @@ partial_hook(struct mrb_parser_state *p)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fn = args->argv[args->idx++];
|
fn = args->argv[args->idx++];
|
||||||
p->f = fopen(fn, "r");
|
p->f = fopen(fn, "rb");
|
||||||
if (p->f == NULL) {
|
if (p->f == NULL) {
|
||||||
fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, fn);
|
fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, fn);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -211,7 +213,7 @@ load_file(mrb_state *mrb, struct mrbc_args *args)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
need_close = TRUE;
|
need_close = TRUE;
|
||||||
if ((infile = fopen(input, "r")) == NULL) {
|
if ((infile = fopen(input, "rb")) == NULL) {
|
||||||
fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, input);
|
fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, input);
|
||||||
return mrb_nil_value();
|
return mrb_nil_value();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
require 'tempfile'
|
require 'tempfile'
|
||||||
|
require 'open3'
|
||||||
|
|
||||||
|
def assert_mruby(exp_out, exp_err, exp_success, args)
|
||||||
|
out, err, stat = Open3.capture3(cmd("mruby"), *args)
|
||||||
|
assert "assert_mruby" do
|
||||||
|
assert_operator(exp_out, :===, out, "standard output")
|
||||||
|
assert_operator(exp_err, :===, err, "standard error")
|
||||||
|
assert_equal(exp_success, stat.success?, "exit success?")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
assert('regression for #1564') do
|
assert('regression for #1564') do
|
||||||
o = `#{cmd('mruby')} -e #{shellquote('<<')} 2>&1`
|
assert_mruby("", /\A-e:1:2: syntax error, .*\n\z/, false, %w[-e <<])
|
||||||
assert_include o, "-e:1:2: syntax error"
|
assert_mruby("", /\A-e:1:3: syntax error, .*\n\z/, false, %w[-e <<-])
|
||||||
o = `#{cmd('mruby')} -e #{shellquote('<<-')} 2>&1`
|
|
||||||
assert_include o, "-e:1:3: syntax error"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
assert('regression for #1572') do
|
assert('regression for #1572') do
|
||||||
@@ -31,6 +39,11 @@ assert '$0 value' do
|
|||||||
assert_equal '"-e"', `#{cmd('mruby')} -e #{shellquote('p $0')}`.chomp
|
assert_equal '"-e"', `#{cmd('mruby')} -e #{shellquote('p $0')}`.chomp
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert 'ARGV value' do
|
||||||
|
assert_mruby(%{["ab", "cde"]\n}, "", true, %w[-e p(ARGV) ab cde])
|
||||||
|
assert_mruby("[]\n", "", true, %w[-e p(ARGV)])
|
||||||
|
end
|
||||||
|
|
||||||
assert('float literal') do
|
assert('float literal') do
|
||||||
script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb')
|
script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb')
|
||||||
File.write script.path, 'p [3.21, 2e308.infinite?, -2e308.infinite?]'
|
File.write script.path, 'p [3.21, 2e308.infinite?, -2e308.infinite?]'
|
||||||
@@ -66,11 +79,22 @@ RUBY
|
|||||||
assert_equal 0, $?.exitstatus
|
assert_equal 0, $?.exitstatus
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert('mruby -c option') do
|
||||||
|
assert_mruby("Syntax OK\n", "", true, ["-c", "-e", "p 1"])
|
||||||
|
assert_mruby("", /\A-e:1:7: syntax error, .*\n\z/, false, ["-c", "-e", "p 1; 1."])
|
||||||
|
end
|
||||||
|
|
||||||
assert('mruby -d option') do
|
assert('mruby -d option') do
|
||||||
o = `#{cmd('mruby')} -e #{shellquote('p $DEBUG')}`
|
assert_mruby("false\n", "", true, ["-e", "p $DEBUG"])
|
||||||
assert_equal "false\n", o
|
assert_mruby("true\n", "", true, ["-dep $DEBUG"])
|
||||||
o = `#{cmd('mruby')} -d -e #{shellquote('p $DEBUG')}`
|
end
|
||||||
assert_equal "true\n", o
|
|
||||||
|
assert('mruby -e option (no code specified)') do
|
||||||
|
assert_mruby("", /\A.*: No code specified for -e\n\z/, false, %w[-e])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby -h option') do
|
||||||
|
assert_mruby(/\AUsage: #{Regexp.escape cmd("mruby")} .*/m, "", true, %w[-h])
|
||||||
end
|
end
|
||||||
|
|
||||||
assert('mruby -r option') do
|
assert('mruby -r option') do
|
||||||
@@ -95,3 +119,46 @@ EOS
|
|||||||
assert_equal 'hogeClass', `#{cmd('mruby')} -r #{lib.path} -r #{script.path} -e #{shellquote('print Hoge.class')}`
|
assert_equal 'hogeClass', `#{cmd('mruby')} -r #{lib.path} -r #{script.path} -e #{shellquote('print Hoge.class')}`
|
||||||
assert_equal 0, $?.exitstatus
|
assert_equal 0, $?.exitstatus
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert('mruby -r option (no library specified)') do
|
||||||
|
assert_mruby("", /\A.*: No library specified for -r\n\z/, false, %w[-r])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby -r option (file not found)') do
|
||||||
|
assert_mruby("", /\A.*: Cannot open library file: .*\n\z/, false, %w[-r _no_exists_])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby -v option') do
|
||||||
|
ver_re = '\Amruby \d+\.\d+\.\d+ \(\d+-\d+-\d+\)\n'
|
||||||
|
assert_mruby(/#{ver_re}\z/, "", true, %w[-v])
|
||||||
|
assert_mruby(/#{ver_re}^[^\n]*NODE.*\n:end\n\z/m, "", true, %w[-v -e p(:end)])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby --verbose option') do
|
||||||
|
assert_mruby(/\A[^\n]*NODE.*\n:end\n\z/m, "", true, %w[--verbose -e p(:end)])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby --') do
|
||||||
|
assert_mruby(%{["-x", "1"]\n}, "", true, %w[-e p(ARGV) -- -x 1])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby invalid short option') do
|
||||||
|
assert_mruby("", /\A.*: invalid option -1 .*\n\z/, false, %w[-1])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('mruby invalid long option') do
|
||||||
|
assert_mruby("", /\A.*: invalid option --longopt .*\n\z/, false, %w[--longopt])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('unhandled exception') do
|
||||||
|
assert_mruby("", /\bEXCEPTION\b.*\n\z/, false, %w[-e raise("EXCEPTION")])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('program file not found') do
|
||||||
|
assert_mruby("", /\A.*: Cannot open program file: .*\n\z/, false, %w[_no_exists_])
|
||||||
|
end
|
||||||
|
|
||||||
|
assert('codegen error') do
|
||||||
|
code = "def f(#{(1..100).map{|n| "a#{n}"} * ","}); end"
|
||||||
|
assert_mruby("", /\Acodegen error:.*\n\z/, false, ["-e", code])
|
||||||
|
end
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ MRuby::Gem::Specification.new('mruby-bin-mruby') do |spec|
|
|||||||
spec.summary = 'mruby command'
|
spec.summary = 'mruby command'
|
||||||
spec.bins = %w(mruby)
|
spec.bins = %w(mruby)
|
||||||
spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
|
spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
|
||||||
spec.add_dependency('mruby-error', :core => 'mruby-error')
|
|
||||||
spec.add_test_dependency('mruby-print', :core => 'mruby-print')
|
spec.add_test_dependency('mruby-print', :core => 'mruby-print')
|
||||||
|
|
||||||
if build.cxx_exception_enabled?
|
if build.cxx_exception_enabled?
|
||||||
|
|||||||
@@ -1,39 +1,39 @@
|
|||||||
#include <stdio.h>
|
#include <mruby.h>
|
||||||
|
|
||||||
|
#ifdef MRB_DISABLE_STDIO
|
||||||
|
# error mruby-bin-mruby conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mruby.h>
|
|
||||||
#include <mruby/array.h>
|
#include <mruby/array.h>
|
||||||
#include <mruby/compile.h>
|
#include <mruby/compile.h>
|
||||||
#include <mruby/dump.h>
|
#include <mruby/dump.h>
|
||||||
#include <mruby/variable.h>
|
#include <mruby/variable.h>
|
||||||
|
|
||||||
#ifdef MRB_DISABLE_STDIO
|
|
||||||
static void
|
|
||||||
p(mrb_state *mrb, mrb_value obj)
|
|
||||||
{
|
|
||||||
mrb_value val = mrb_inspect(mrb, obj);
|
|
||||||
|
|
||||||
fwrite(RSTRING_PTR(val), RSTRING_LEN(val), 1, stdout);
|
|
||||||
putc('\n', stdout);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define p(mrb,obj) mrb_p(mrb,obj)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _args {
|
struct _args {
|
||||||
FILE *rfp;
|
FILE *rfp;
|
||||||
char* cmdline;
|
char *cmdline;
|
||||||
mrb_bool fname : 1;
|
mrb_bool fname : 1;
|
||||||
mrb_bool mrbfile : 1;
|
mrb_bool mrbfile : 1;
|
||||||
mrb_bool check_syntax : 1;
|
mrb_bool check_syntax : 1;
|
||||||
mrb_bool verbose : 1;
|
mrb_bool verbose : 1;
|
||||||
|
mrb_bool version : 1;
|
||||||
mrb_bool debug : 1;
|
mrb_bool debug : 1;
|
||||||
int argc;
|
int argc;
|
||||||
char** argv;
|
char **argv;
|
||||||
int libc;
|
int libc;
|
||||||
char **libv;
|
char **libv;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct options {
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
char *program;
|
||||||
|
char *opt;
|
||||||
|
char short_opt[2];
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage(const char *name)
|
usage(const char *name)
|
||||||
{
|
{
|
||||||
@@ -52,11 +52,69 @@ usage(const char *name)
|
|||||||
};
|
};
|
||||||
const char *const *p = usage_msg;
|
const char *const *p = usage_msg;
|
||||||
|
|
||||||
printf("Usage: %s [switches] programfile\n", name);
|
printf("Usage: %s [switches] [programfile] [arguments]\n", name);
|
||||||
while (*p)
|
while (*p)
|
||||||
printf(" %s\n", *p++);
|
printf(" %s\n", *p++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
options_init(struct options *opts, int argc, char **argv)
|
||||||
|
{
|
||||||
|
opts->argc = argc;
|
||||||
|
opts->argv = argv;
|
||||||
|
opts->program = *argv;
|
||||||
|
*opts->short_opt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
options_opt(struct options *opts)
|
||||||
|
{
|
||||||
|
/* concatenated short options (e.g. `-cv`) */
|
||||||
|
if (*opts->short_opt && *++opts->opt) {
|
||||||
|
short_opt:
|
||||||
|
opts->short_opt[0] = *opts->opt;
|
||||||
|
opts->short_opt[1] = 0;
|
||||||
|
return opts->short_opt;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (++opts->argv, --opts->argc) {
|
||||||
|
opts->opt = *opts->argv;
|
||||||
|
|
||||||
|
/* empty || not start with `-` || `-` */
|
||||||
|
if (!opts->opt[0] || opts->opt[0] != '-' || !opts->opt[1]) return NULL;
|
||||||
|
|
||||||
|
if (opts->opt[1] == '-') {
|
||||||
|
/* `--` */
|
||||||
|
if (!opts->opt[2]) {
|
||||||
|
++opts->argv, --opts->argc;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* long option */
|
||||||
|
opts->opt += 2;
|
||||||
|
*opts->short_opt = 0;
|
||||||
|
return opts->opt;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* short option */
|
||||||
|
++opts->opt;
|
||||||
|
goto short_opt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
options_arg(struct options *opts)
|
||||||
|
{
|
||||||
|
if (*opts->short_opt && opts->opt[1]) {
|
||||||
|
/* concatenated short option and option argument (e.g. `-rLIBRARY`) */
|
||||||
|
*opts->short_opt = 0;
|
||||||
|
return opts->opt + 1;
|
||||||
|
}
|
||||||
|
--opts->argc, ++opts->argv;
|
||||||
|
return opts->argc ? *opts->argv : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
dup_arg_item(mrb_state *mrb, const char *item)
|
dup_arg_item(mrb_state *mrb, const char *item)
|
||||||
{
|
{
|
||||||
@@ -69,40 +127,24 @@ dup_arg_item(mrb_state *mrb, const char *item)
|
|||||||
static int
|
static int
|
||||||
parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
|
parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
|
||||||
{
|
{
|
||||||
char **origargv = argv;
|
|
||||||
static const struct _args args_zero = { 0 };
|
static const struct _args args_zero = { 0 };
|
||||||
|
struct options opts[1];
|
||||||
|
const char *opt, *item;
|
||||||
|
|
||||||
*args = args_zero;
|
*args = args_zero;
|
||||||
|
options_init(opts, argc, argv);
|
||||||
for (argc--,argv++; argc > 0; argc--,argv++) {
|
while ((opt = options_opt(opts))) {
|
||||||
char *item;
|
if (strcmp(opt, "b") == 0) {
|
||||||
if (argv[0][0] != '-') break;
|
|
||||||
|
|
||||||
if (strlen(*argv) <= 1) {
|
|
||||||
argc--; argv++;
|
|
||||||
args->rfp = stdin;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
item = argv[0] + 1;
|
|
||||||
switch (*item++) {
|
|
||||||
case 'b':
|
|
||||||
args->mrbfile = TRUE;
|
args->mrbfile = TRUE;
|
||||||
break;
|
}
|
||||||
case 'c':
|
else if (strcmp(opt, "c") == 0) {
|
||||||
args->check_syntax = TRUE;
|
args->check_syntax = TRUE;
|
||||||
break;
|
}
|
||||||
case 'd':
|
else if (strcmp(opt, "d") == 0) {
|
||||||
args->debug = TRUE;
|
args->debug = TRUE;
|
||||||
break;
|
}
|
||||||
case 'e':
|
else if (strcmp(opt, "e") == 0) {
|
||||||
if (item[0]) {
|
if ((item = options_arg(opts))) {
|
||||||
goto append_cmdline;
|
|
||||||
}
|
|
||||||
else if (argc > 1) {
|
|
||||||
argc--; argv++;
|
|
||||||
item = argv[0];
|
|
||||||
append_cmdline:
|
|
||||||
if (!args->cmdline) {
|
if (!args->cmdline) {
|
||||||
args->cmdline = dup_arg_item(mrb, item);
|
args->cmdline = dup_arg_item(mrb, item);
|
||||||
}
|
}
|
||||||
@@ -119,55 +161,65 @@ append_cmdline:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printf("%s: No code specified for -e\n", *origargv);
|
fprintf(stderr, "%s: No code specified for -e\n", opts->program);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 'r':
|
else if (strcmp(opt, "h") == 0) {
|
||||||
if (!item[0]) {
|
usage(opts->program);
|
||||||
if (argc <= 1) {
|
exit(EXIT_SUCCESS);
|
||||||
printf("%s: No library specified for -r\n", *origargv);
|
}
|
||||||
return EXIT_FAILURE;
|
else if (strcmp(opt, "r") == 0) {
|
||||||
|
if ((item = options_arg(opts))) {
|
||||||
|
if (args->libc == 0) {
|
||||||
|
args->libv = (char**)mrb_malloc(mrb, sizeof(char*));
|
||||||
}
|
}
|
||||||
argc--; argv++;
|
else {
|
||||||
item = argv[0];
|
args->libv = (char**)mrb_realloc(mrb, args->libv, sizeof(char*) * (args->libc + 1));
|
||||||
}
|
}
|
||||||
if (args->libc == 0) {
|
args->libv[args->libc++] = dup_arg_item(mrb, item);
|
||||||
args->libv = (char**)mrb_malloc(mrb, sizeof(char*));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
args->libv = (char**)mrb_realloc(mrb, args->libv, sizeof(char*) * (args->libc + 1));
|
fprintf(stderr, "%s: No library specified for -r\n", opts->program);
|
||||||
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
args->libv[args->libc++] = dup_arg_item(mrb, item);
|
}
|
||||||
break;
|
else if (strcmp(opt, "v") == 0) {
|
||||||
case 'v':
|
if (!args->verbose) {
|
||||||
if (!args->verbose) mrb_show_version(mrb);
|
|
||||||
args->verbose = TRUE;
|
|
||||||
break;
|
|
||||||
case '-':
|
|
||||||
if (strcmp((*argv) + 2, "version") == 0) {
|
|
||||||
mrb_show_version(mrb);
|
mrb_show_version(mrb);
|
||||||
exit(EXIT_SUCCESS);
|
args->version = TRUE;
|
||||||
}
|
}
|
||||||
else if (strcmp((*argv) + 2, "verbose") == 0) {
|
args->verbose = TRUE;
|
||||||
args->verbose = TRUE;
|
}
|
||||||
break;
|
else if (strcmp(opt, "version") == 0) {
|
||||||
}
|
mrb_show_version(mrb);
|
||||||
else if (strcmp((*argv) + 2, "copyright") == 0) {
|
exit(EXIT_SUCCESS);
|
||||||
mrb_show_copyright(mrb);
|
}
|
||||||
exit(EXIT_SUCCESS);
|
else if (strcmp(opt, "verbose") == 0) {
|
||||||
}
|
args->verbose = TRUE;
|
||||||
default:
|
}
|
||||||
|
else if (strcmp(opt, "copyright") == 0) {
|
||||||
|
mrb_show_copyright(mrb);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "%s: invalid option %s%s (-h will show valid options)\n",
|
||||||
|
opts->program, opt[1] ? "--" : "-", opt);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args->rfp == NULL && args->cmdline == NULL) {
|
argc = opts->argc; argv = opts->argv;
|
||||||
if (*argv == NULL) args->rfp = stdin;
|
if (args->cmdline == NULL) {
|
||||||
|
if (*argv == NULL) {
|
||||||
|
if (args->version) exit(EXIT_SUCCESS);
|
||||||
|
args->rfp = stdin;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r");
|
args->rfp = strcmp(argv[0], "-") == 0 ?
|
||||||
|
stdin : fopen(argv[0], args->mrbfile ? "rb" : "r");
|
||||||
if (args->rfp == NULL) {
|
if (args->rfp == NULL) {
|
||||||
printf("%s: Cannot open program file. (%s)\n", *origargv, *argv);
|
fprintf(stderr, "%s: Cannot open program file: %s\n", opts->program, argv[0]);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
args->fname = TRUE;
|
args->fname = TRUE;
|
||||||
@@ -212,14 +264,13 @@ main(int argc, char **argv)
|
|||||||
mrb_sym zero_sym;
|
mrb_sym zero_sym;
|
||||||
|
|
||||||
if (mrb == NULL) {
|
if (mrb == NULL) {
|
||||||
fputs("Invalid mrb_state, exiting mruby\n", stderr);
|
fprintf(stderr, "%s: Invalid mrb_state, exiting mruby\n", *argv);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = parse_args(mrb, argc, argv, &args);
|
n = parse_args(mrb, argc, argv, &args);
|
||||||
if (n == EXIT_FAILURE || (args.cmdline == NULL && args.rfp == NULL)) {
|
if (n == EXIT_FAILURE || (args.cmdline == NULL && args.rfp == NULL)) {
|
||||||
cleanup(mrb, &args);
|
cleanup(mrb, &args);
|
||||||
usage(argv[0]);
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -258,7 +309,7 @@ main(int argc, char **argv)
|
|||||||
for (i = 0; i < args.libc; i++) {
|
for (i = 0; i < args.libc; i++) {
|
||||||
FILE *lfp = fopen(args.libv[i], args.mrbfile ? "rb" : "r");
|
FILE *lfp = fopen(args.libv[i], args.mrbfile ? "rb" : "r");
|
||||||
if (lfp == NULL) {
|
if (lfp == NULL) {
|
||||||
printf("Cannot open library file: %s\n", args.libv[i]);
|
fprintf(stderr, "%s: Cannot open library file: %s\n", *argv, args.libv[i]);
|
||||||
mrbc_context_free(mrb, c);
|
mrbc_context_free(mrb, c);
|
||||||
cleanup(mrb, &args);
|
cleanup(mrb, &args);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@@ -289,19 +340,16 @@ main(int argc, char **argv)
|
|||||||
mrb_gc_arena_restore(mrb, ai);
|
mrb_gc_arena_restore(mrb, ai);
|
||||||
mrbc_context_free(mrb, c);
|
mrbc_context_free(mrb, c);
|
||||||
if (mrb->exc) {
|
if (mrb->exc) {
|
||||||
if (mrb_undef_p(v)) {
|
if (!mrb_undef_p(v)) {
|
||||||
mrb_p(mrb, mrb_obj_value(mrb->exc));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mrb_print_error(mrb);
|
mrb_print_error(mrb);
|
||||||
}
|
}
|
||||||
n = -1;
|
n = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
else if (args.check_syntax) {
|
else if (args.check_syntax) {
|
||||||
printf("Syntax OK\n");
|
puts("Syntax OK");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cleanup(mrb, &args);
|
cleanup(mrb, &args);
|
||||||
|
|
||||||
return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
return n;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
#include <stdio.h>
|
#include <mruby.h>
|
||||||
|
|
||||||
|
#ifdef MRB_DISABLE_STDIO
|
||||||
|
# error mruby-bin-strip conflicts 'MRB_DISABLE_STDIO' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mruby.h>
|
|
||||||
#include <mruby/irep.h>
|
#include <mruby/irep.h>
|
||||||
#include <mruby/dump.h>
|
#include <mruby/dump.h>
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,17 @@
|
|||||||
static mrb_value
|
static mrb_value
|
||||||
mrb_mod_name(mrb_state *mrb, mrb_value self)
|
mrb_mod_name(mrb_state *mrb, mrb_value self)
|
||||||
{
|
{
|
||||||
mrb_value name = mrb_class_path(mrb, mrb_class_ptr(self));
|
mrb_value name = mrb_class_path(mrb, mrb_class_ptr(self));
|
||||||
return mrb_nil_p(name)? name : mrb_str_dup(mrb, name);
|
if (mrb_string_p(name)) {
|
||||||
|
MRB_SET_FROZEN_FLAG(mrb_basic_ptr(name));
|
||||||
|
}
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
static mrb_value
|
static mrb_value
|
||||||
mrb_mod_singleton_class_p(mrb_state *mrb, mrb_value self)
|
mrb_mod_singleton_class_p(mrb_state *mrb, mrb_value self)
|
||||||
{
|
{
|
||||||
return mrb_bool_value(mrb_type(self) == MRB_TT_SCLASS);
|
return mrb_bool_value(mrb_sclass_p(self));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -40,14 +43,15 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
|
|||||||
const mrb_value *argv;
|
const mrb_value *argv;
|
||||||
mrb_int argc;
|
mrb_int argc;
|
||||||
mrb_value blk;
|
mrb_value blk;
|
||||||
|
struct RClass *c;
|
||||||
|
|
||||||
mrb_get_args(mrb, "*&", &argv, &argc, &blk);
|
mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
|
||||||
|
|
||||||
if (mrb_nil_p(blk)) {
|
c = mrb_class_ptr(self);
|
||||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
|
if (mrb->c->ci->acc < 0) {
|
||||||
|
return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
|
||||||
}
|
}
|
||||||
|
mrb->c->ci->target_class = c;
|
||||||
mrb->c->ci->target_class = mrb_class_ptr(self);
|
|
||||||
return mrb_yield_cont(mrb, blk, self, argc, argv);
|
return mrb_yield_cont(mrb, blk, self, argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,12 +102,13 @@ codegen_error(codegen_scope *s, const char *message)
|
|||||||
while (s->prev) {
|
while (s->prev) {
|
||||||
codegen_scope *tmp = s->prev;
|
codegen_scope *tmp = s->prev;
|
||||||
mrb_free(s->mrb, s->iseq);
|
mrb_free(s->mrb, s->iseq);
|
||||||
|
mrb_free(s->mrb, s->lines);
|
||||||
mrb_pool_close(s->mpool);
|
mrb_pool_close(s->mpool);
|
||||||
s = tmp;
|
s = tmp;
|
||||||
}
|
}
|
||||||
#ifndef MRB_DISABLE_STDIO
|
#ifndef MRB_DISABLE_STDIO
|
||||||
if (s->filename_sym && s->lineno) {
|
if (s->filename_sym && s->lineno) {
|
||||||
const char *filename = mrb_sym2name_len(s->mrb, s->filename_sym, NULL);
|
const char *filename = mrb_sym_name_len(s->mrb, s->filename_sym, NULL);
|
||||||
fprintf(stderr, "codegen error:%s:%d: %s\n", filename, s->lineno, message);
|
fprintf(stderr, "codegen error:%s:%d: %s\n", filename, s->lineno, message);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -272,8 +273,7 @@ genop_W(codegen_scope *s, mrb_code i, uint32_t a)
|
|||||||
#define NOVAL 0
|
#define NOVAL 0
|
||||||
#define VAL 1
|
#define VAL 1
|
||||||
|
|
||||||
//static
|
static mrb_bool
|
||||||
mrb_bool
|
|
||||||
no_optimize(codegen_scope *s)
|
no_optimize(codegen_scope *s)
|
||||||
{
|
{
|
||||||
if (s && s->parser && s->parser->no_optimize)
|
if (s && s->parser && s->parser->no_optimize)
|
||||||
@@ -281,17 +281,8 @@ no_optimize(codegen_scope *s)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
|
||||||
mrb_bool
|
|
||||||
on_eval(codegen_scope *s)
|
|
||||||
{
|
|
||||||
if (s && s->parser && s->parser->on_eval)
|
|
||||||
return TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mrb_insn_data
|
struct mrb_insn_data
|
||||||
mrb_decode_insn(mrb_code *pc)
|
mrb_decode_insn(const mrb_code *pc)
|
||||||
{
|
{
|
||||||
struct mrb_insn_data data = { 0 };
|
struct mrb_insn_data data = { 0 };
|
||||||
mrb_code insn = READ_B();
|
mrb_code insn = READ_B();
|
||||||
@@ -407,9 +398,6 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
|
|||||||
if (no_peephole(s)) {
|
if (no_peephole(s)) {
|
||||||
normal:
|
normal:
|
||||||
genop_2(s, OP_MOVE, dst, src);
|
genop_2(s, OP_MOVE, dst, src);
|
||||||
if (on_eval(s)) {
|
|
||||||
genop_0(s, OP_NOP);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -559,7 +547,7 @@ new_lit(codegen_scope *s, mrb_value val)
|
|||||||
mrb_int len;
|
mrb_int len;
|
||||||
pv = &s->irep->pool[i];
|
pv = &s->irep->pool[i];
|
||||||
|
|
||||||
if (mrb_type(*pv) != MRB_TT_STRING) continue;
|
if (!mrb_string_p(*pv)) continue;
|
||||||
if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
|
if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
|
||||||
if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
|
if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
|
||||||
return i;
|
return i;
|
||||||
@@ -570,7 +558,7 @@ new_lit(codegen_scope *s, mrb_value val)
|
|||||||
for (i=0; i<s->irep->plen; i++) {
|
for (i=0; i<s->irep->plen; i++) {
|
||||||
mrb_float f1, f2;
|
mrb_float f1, f2;
|
||||||
pv = &s->irep->pool[i];
|
pv = &s->irep->pool[i];
|
||||||
if (mrb_type(*pv) != MRB_TT_FLOAT) continue;
|
if (!mrb_float_p(*pv)) continue;
|
||||||
f1 = mrb_float(*pv);
|
f1 = mrb_float(*pv);
|
||||||
f2 = mrb_float(val);
|
f2 = mrb_float(val);
|
||||||
if (f1 == f2 && !signbit(f1) == !signbit(f2)) return i;
|
if (f1 == f2 && !signbit(f1) == !signbit(f2)) return i;
|
||||||
@@ -599,7 +587,7 @@ new_lit(codegen_scope *s, mrb_value val)
|
|||||||
|
|
||||||
switch (mrb_type(val)) {
|
switch (mrb_type(val)) {
|
||||||
case MRB_TT_STRING:
|
case MRB_TT_STRING:
|
||||||
*pv = mrb_str_pool(s->mrb, val);
|
*pv = mrb_str_pool(s->mrb, RSTRING_PTR(val), RSTRING_LEN(val), RSTR_NOFREE_P(RSTRING(val)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifndef MRB_WITHOUT_FLOAT
|
#ifndef MRB_WITHOUT_FLOAT
|
||||||
@@ -674,6 +662,43 @@ lv_idx(codegen_scope *s, mrb_sym id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
search_upvar(codegen_scope *s, mrb_sym id, int *idx)
|
||||||
|
{
|
||||||
|
struct RProc *u;
|
||||||
|
int lv = 0;
|
||||||
|
codegen_scope *up = s->prev;
|
||||||
|
|
||||||
|
while (up) {
|
||||||
|
*idx = lv_idx(up, id);
|
||||||
|
if (*idx > 0) {
|
||||||
|
return lv;
|
||||||
|
}
|
||||||
|
lv ++;
|
||||||
|
up = up->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lv < 1) lv = 1;
|
||||||
|
u = s->parser->upper;
|
||||||
|
while (u && !MRB_PROC_CFUNC_P(u)) {
|
||||||
|
struct mrb_irep *ir = u->body.irep;
|
||||||
|
uint_fast16_t n = ir->nlocals;
|
||||||
|
const struct mrb_locals *v = ir->lv;
|
||||||
|
for (; n > 1; n --, v ++) {
|
||||||
|
if (v->name == id) {
|
||||||
|
*idx = v->r;
|
||||||
|
return lv - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (MRB_PROC_SCOPE_P(u)) break;
|
||||||
|
u = u->upper;
|
||||||
|
lv ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
codegen_error(s, "Can't found local variables");
|
||||||
|
return -1; /* not reached */
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
for_body(codegen_scope *s, node *tree)
|
for_body(codegen_scope *s, node *tree)
|
||||||
{
|
{
|
||||||
@@ -686,9 +711,6 @@ for_body(codegen_scope *s, node *tree)
|
|||||||
codegen(s, tree->cdr->car, VAL);
|
codegen(s, tree->cdr->car, VAL);
|
||||||
/* generate loop-block */
|
/* generate loop-block */
|
||||||
s = scope_new(s->mrb, s, NULL);
|
s = scope_new(s->mrb, s, NULL);
|
||||||
if (s == NULL) {
|
|
||||||
raise_error(prev, "unexpected scope");
|
|
||||||
}
|
|
||||||
|
|
||||||
push(); /* push for a block parameter */
|
push(); /* push for a block parameter */
|
||||||
|
|
||||||
@@ -724,9 +746,6 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|||||||
{
|
{
|
||||||
codegen_scope *parent = s;
|
codegen_scope *parent = s;
|
||||||
s = scope_new(s->mrb, s, tree->car);
|
s = scope_new(s->mrb, s, tree->car);
|
||||||
if (s == NULL) {
|
|
||||||
raise_error(parent, "unexpected scope");
|
|
||||||
}
|
|
||||||
|
|
||||||
s->mscope = !blk;
|
s->mscope = !blk;
|
||||||
|
|
||||||
@@ -777,7 +796,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|||||||
s->ainfo = (((ma+oa) & 0x3f) << 7) /* (12bits = 5:1:5:1) */
|
s->ainfo = (((ma+oa) & 0x3f) << 7) /* (12bits = 5:1:5:1) */
|
||||||
| ((ra & 0x1) << 6)
|
| ((ra & 0x1) << 6)
|
||||||
| ((pa & 0x1f) << 1)
|
| ((pa & 0x1f) << 1)
|
||||||
| (kd & 0x1);
|
| ((ka | kd) != 0 ? 0x01 : 0x00);
|
||||||
genop_W(s, OP_ENTER, a);
|
genop_W(s, OP_ENTER, a);
|
||||||
/* generate jump table for optional arguments initializer */
|
/* generate jump table for optional arguments initializer */
|
||||||
pos = new_label(s);
|
pos = new_label(s);
|
||||||
@@ -792,12 +811,19 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|||||||
i = 0;
|
i = 0;
|
||||||
while (opt) {
|
while (opt) {
|
||||||
int idx;
|
int idx;
|
||||||
|
mrb_sym id = nsym(opt->car->car);
|
||||||
|
|
||||||
dispatch(s, pos+i*3+1);
|
dispatch(s, pos+i*3+1);
|
||||||
codegen(s, opt->car->cdr, VAL);
|
codegen(s, opt->car->cdr, VAL);
|
||||||
pop();
|
pop();
|
||||||
idx = lv_idx(s, nsym(opt->car->car));
|
idx = lv_idx(s, id);
|
||||||
gen_move(s, idx, cursp(), 0);
|
if (idx > 0) {
|
||||||
|
gen_move(s, idx, cursp(), 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int lv = search_upvar(s, id, &idx);
|
||||||
|
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
opt = opt->cdr;
|
opt = opt->cdr;
|
||||||
}
|
}
|
||||||
@@ -824,11 +850,19 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|||||||
mrb_assert(nint(kwd->car) == NODE_KW_ARG);
|
mrb_assert(nint(kwd->car) == NODE_KW_ARG);
|
||||||
|
|
||||||
if (def_arg) {
|
if (def_arg) {
|
||||||
|
int idx;
|
||||||
genop_2(s, OP_KEY_P, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
|
genop_2(s, OP_KEY_P, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
|
||||||
jmpif_key_p = genjmp2(s, OP_JMPIF, lv_idx(s, kwd_sym), 0, 0);
|
jmpif_key_p = genjmp2(s, OP_JMPIF, lv_idx(s, kwd_sym), 0, 0);
|
||||||
codegen(s, def_arg, VAL);
|
codegen(s, def_arg, VAL);
|
||||||
pop();
|
pop();
|
||||||
gen_move(s, lv_idx(s, kwd_sym), cursp(), 0);
|
idx = lv_idx(s, kwd_sym);
|
||||||
|
if (idx > 0) {
|
||||||
|
gen_move(s, idx, cursp(), 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int lv = search_upvar(s, kwd_sym, &idx);
|
||||||
|
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
||||||
|
}
|
||||||
jmp_def_set = genjmp(s, OP_JMP, 0);
|
jmp_def_set = genjmp(s, OP_JMP, 0);
|
||||||
dispatch(s, jmpif_key_p);
|
dispatch(s, jmpif_key_p);
|
||||||
}
|
}
|
||||||
@@ -888,9 +922,6 @@ static int
|
|||||||
scope_body(codegen_scope *s, node *tree, int val)
|
scope_body(codegen_scope *s, node *tree, int val)
|
||||||
{
|
{
|
||||||
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
|
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
|
||||||
if (scope == NULL) {
|
|
||||||
codegen_error(s, "unexpected scope");
|
|
||||||
}
|
|
||||||
|
|
||||||
codegen(scope, tree->cdr, VAL);
|
codegen(scope, tree->cdr, VAL);
|
||||||
gen_return(scope, OP_RETURN, scope->sp-1);
|
gen_return(scope, OP_RETURN, scope->sp-1);
|
||||||
@@ -922,7 +953,7 @@ attrsym(codegen_scope *s, mrb_sym a)
|
|||||||
mrb_int len;
|
mrb_int len;
|
||||||
char *name2;
|
char *name2;
|
||||||
|
|
||||||
name = mrb_sym2name_len(s->mrb, a, &len);
|
name = mrb_sym_name_len(s->mrb, a, &len);
|
||||||
name2 = (char *)codegen_palloc(s,
|
name2 = (char *)codegen_palloc(s,
|
||||||
(size_t)len
|
(size_t)len
|
||||||
+ 1 /* '=' */
|
+ 1 /* '=' */
|
||||||
@@ -956,7 +987,12 @@ gen_values(codegen_scope *s, node *t, int val, int extra)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pop_n(n);
|
pop_n(n);
|
||||||
genop_2(s, OP_ARRAY, cursp(), n);
|
if (n == 0 && is_splat) {
|
||||||
|
genop_1(s, OP_LOADNIL, cursp());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
genop_2(s, OP_ARRAY, cursp(), n);
|
||||||
|
}
|
||||||
push();
|
push();
|
||||||
codegen(s, t->car, VAL);
|
codegen(s, t->car, VAL);
|
||||||
pop(); pop();
|
pop(); pop();
|
||||||
@@ -1041,7 +1077,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
|
|||||||
pop_n(n+1);
|
pop_n(n+1);
|
||||||
{
|
{
|
||||||
mrb_int symlen;
|
mrb_int symlen;
|
||||||
const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
|
const char *symname = mrb_sym_name_len(s->mrb, sym, &symlen);
|
||||||
|
|
||||||
if (!noop && symlen == 1 && symname[0] == '+' && n == 1) {
|
if (!noop && symlen == 1 && symname[0] == '+' && n == 1) {
|
||||||
gen_addsub(s, OP_ADD, cursp());
|
gen_addsub(s, OP_ADD, cursp());
|
||||||
@@ -1107,25 +1143,18 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
|
|||||||
if (idx > 0) {
|
if (idx > 0) {
|
||||||
if (idx != sp) {
|
if (idx != sp) {
|
||||||
gen_move(s, idx, sp, val);
|
gen_move(s, idx, sp, val);
|
||||||
if (val && on_eval(s)) genop_0(s, OP_NOP);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else { /* upvar */
|
else { /* upvar */
|
||||||
int lv = 0;
|
int lv = search_upvar(s, nsym(tree), &idx);
|
||||||
codegen_scope *up = s->prev;
|
genop_3(s, OP_SETUPVAR, sp, idx, lv);
|
||||||
|
|
||||||
while (up) {
|
|
||||||
idx = lv_idx(up, nsym(tree));
|
|
||||||
if (idx > 0) {
|
|
||||||
genop_3(s, OP_SETUPVAR, sp, idx, lv);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lv++;
|
|
||||||
up = up->prev;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case NODE_NVAR:
|
||||||
|
idx = nint(tree);
|
||||||
|
codegen_error(s, "Can't assign to numbered parameter");
|
||||||
|
break;
|
||||||
case NODE_IVAR:
|
case NODE_IVAR:
|
||||||
idx = new_sym(s, nsym(tree));
|
idx = new_sym(s, nsym(tree));
|
||||||
genop_2(s, OP_SETIV, sp, idx);
|
genop_2(s, OP_SETIV, sp, idx);
|
||||||
@@ -1401,7 +1430,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
}
|
}
|
||||||
if (s->irep && s->filename_index != tree->filename_index) {
|
if (s->irep && s->filename_index != tree->filename_index) {
|
||||||
mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index);
|
mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index);
|
||||||
const char *filename = mrb_sym2name_len(s->mrb, fname, NULL);
|
const char *filename = mrb_sym_name_len(s->mrb, fname, NULL);
|
||||||
|
|
||||||
mrb_debug_info_append_file(s->mrb, s->irep->debug_info,
|
mrb_debug_info_append_file(s->mrb, s->irep->debug_info,
|
||||||
filename, s->lines, s->debug_start_pos, s->pc);
|
filename, s->lines, s->debug_start_pos, s->pc);
|
||||||
@@ -1553,7 +1582,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
|
|
||||||
case NODE_IF:
|
case NODE_IF:
|
||||||
{
|
{
|
||||||
int pos1, pos2;
|
int pos1, pos2, nil_p = FALSE;
|
||||||
node *elsepart = tree->cdr->cdr->car;
|
node *elsepart = tree->cdr->cdr->car;
|
||||||
|
|
||||||
if (!tree->car) {
|
if (!tree->car) {
|
||||||
@@ -1570,32 +1599,59 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
case NODE_NIL:
|
case NODE_NIL:
|
||||||
codegen(s, elsepart, val);
|
codegen(s, elsepart, val);
|
||||||
goto exit;
|
goto exit;
|
||||||
|
case NODE_CALL:
|
||||||
|
{
|
||||||
|
node *n = tree->car->cdr;
|
||||||
|
mrb_sym mid = nsym(n->cdr->car);
|
||||||
|
mrb_sym mnil = mrb_intern_lit(s->mrb, "nil?");
|
||||||
|
if (mid == mnil && n->cdr->cdr->car == NULL) {
|
||||||
|
nil_p = TRUE;
|
||||||
|
codegen(s, n->car, VAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!nil_p) {
|
||||||
|
codegen(s, tree->car, VAL);
|
||||||
}
|
}
|
||||||
codegen(s, tree->car, VAL);
|
|
||||||
pop();
|
pop();
|
||||||
pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val);
|
if (val || tree->cdr->car) {
|
||||||
|
if (nil_p) {
|
||||||
codegen(s, tree->cdr->car, val);
|
pos2 = genjmp2(s, OP_JMPNIL, cursp(), 0, val);
|
||||||
if (elsepart) {
|
pos1 = genjmp(s, OP_JMP, 0);
|
||||||
|
dispatch(s, pos2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pos1 = genjmp2(s, OP_JMPNOT, cursp(), 0, val);
|
||||||
|
}
|
||||||
|
codegen(s, tree->cdr->car, val);
|
||||||
if (val) pop();
|
if (val) pop();
|
||||||
pos2 = genjmp(s, OP_JMP, 0);
|
if (elsepart || val) {
|
||||||
dispatch(s, pos1);
|
|
||||||
codegen(s, elsepart, val);
|
|
||||||
dispatch(s, pos2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (val) {
|
|
||||||
pop();
|
|
||||||
pos2 = genjmp(s, OP_JMP, 0);
|
pos2 = genjmp(s, OP_JMP, 0);
|
||||||
dispatch(s, pos1);
|
dispatch(s, pos1);
|
||||||
genop_1(s, OP_LOADNIL, cursp());
|
codegen(s, elsepart, val);
|
||||||
dispatch(s, pos2);
|
dispatch(s, pos2);
|
||||||
push();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dispatch(s, pos1);
|
dispatch(s, pos1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else { /* empty then-part */
|
||||||
|
if (elsepart) {
|
||||||
|
if (nil_p) {
|
||||||
|
pos1 = genjmp2(s, OP_JMPNIL, cursp(), 0, val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pos1 = genjmp2(s, OP_JMPIF, cursp(), 0, val);
|
||||||
|
}
|
||||||
|
codegen(s, elsepart, val);
|
||||||
|
dispatch(s, pos1);
|
||||||
|
}
|
||||||
|
else if (val && !nil_p) {
|
||||||
|
genop_1(s, OP_LOADNIL, cursp());
|
||||||
|
push();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1833,7 +1889,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
tree = tree->cdr;
|
tree = tree->cdr;
|
||||||
if (val && len == 255) {
|
if (val && cursp() > 127) {
|
||||||
pop_n(len*2);
|
pop_n(len*2);
|
||||||
if (!update) {
|
if (!update) {
|
||||||
genop_2(s, OP_HASH, cursp(), len);
|
genop_2(s, OP_HASH, cursp(), len);
|
||||||
@@ -1955,7 +2011,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
{
|
{
|
||||||
mrb_sym sym = nsym(tree->cdr->car);
|
mrb_sym sym = nsym(tree->cdr->car);
|
||||||
mrb_int len;
|
mrb_int len;
|
||||||
const char *name = mrb_sym2name_len(s->mrb, sym, &len);
|
const char *name = mrb_sym_name_len(s->mrb, sym, &len);
|
||||||
int idx, callargs = -1, vsp = -1;
|
int idx, callargs = -1, vsp = -1;
|
||||||
|
|
||||||
if ((len == 2 && name[0] == '|' && name[1] == '|') &&
|
if ((len == 2 && name[0] == '|' && name[1] == '|') &&
|
||||||
@@ -2297,26 +2353,25 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
|
|
||||||
if (idx > 0) {
|
if (idx > 0) {
|
||||||
gen_move(s, cursp(), idx, val);
|
gen_move(s, cursp(), idx, val);
|
||||||
if (val && on_eval(s)) genop_0(s, OP_NOP);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int lv = 0;
|
int lv = search_upvar(s, nsym(tree), &idx);
|
||||||
codegen_scope *up = s->prev;
|
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
||||||
|
|
||||||
while (up) {
|
|
||||||
idx = lv_idx(up, nsym(tree));
|
|
||||||
if (idx > 0) {
|
|
||||||
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lv++;
|
|
||||||
up = up->prev;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
push();
|
push();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NODE_NVAR:
|
||||||
|
if (val) {
|
||||||
|
int idx = nint(tree);
|
||||||
|
|
||||||
|
gen_move(s, cursp(), idx, val);
|
||||||
|
|
||||||
|
push();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case NODE_GVAR:
|
case NODE_GVAR:
|
||||||
{
|
{
|
||||||
int sym = new_sym(s, nsym(tree));
|
int sym = new_sym(s, nsym(tree));
|
||||||
@@ -2353,10 +2408,6 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NODE_DEFINED:
|
|
||||||
codegen(s, tree, val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NODE_BACK_REF:
|
case NODE_BACK_REF:
|
||||||
if (val) {
|
if (val) {
|
||||||
char buf[] = {'$', nchar(tree)};
|
char buf[] = {'$', nchar(tree)};
|
||||||
@@ -2373,7 +2424,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
mrb_value str;
|
mrb_value str;
|
||||||
int sym;
|
int sym;
|
||||||
|
|
||||||
str = mrb_format(mrb, "$%S", mrb_fixnum_value(nint(tree)));
|
str = mrb_format(mrb, "$%d", nint(tree));
|
||||||
sym = new_sym(s, mrb_intern_str(mrb, str));
|
sym = new_sym(s, mrb_intern_str(mrb, str));
|
||||||
genop_2(s, OP_GETGV, cursp(), sym);
|
genop_2(s, OP_GETGV, cursp(), sym);
|
||||||
push();
|
push();
|
||||||
@@ -2406,12 +2457,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
if (i < 0) {
|
||||||
else if (i < 0) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
||||||
|
else if (i >= -0xff) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
||||||
|
else if (i >= -0x8000) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
||||||
|
else goto lit_int;
|
||||||
|
}
|
||||||
else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
|
else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
|
||||||
else if (i <= 0xffff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
|
else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
|
||||||
|
else if (i <= 0x7fff) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
||||||
else {
|
else {
|
||||||
int off = new_lit(s, mrb_fixnum_value(i));
|
int off;
|
||||||
|
|
||||||
|
lit_int:
|
||||||
|
off = new_lit(s, mrb_fixnum_value(i));
|
||||||
genop_2(s, OP_LOADL, cursp(), off);
|
genop_2(s, OP_LOADL, cursp(), off);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2467,9 +2526,12 @@ codegen(codegen_scope *s, node *tree, int val)
|
|||||||
else {
|
else {
|
||||||
#endif
|
#endif
|
||||||
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
||||||
else if (i >= -0xffff) {
|
else if (i >= -0xff) {
|
||||||
genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
||||||
}
|
}
|
||||||
|
else if (i >= -0x8000) {
|
||||||
|
genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
int off = new_lit(s, mrb_fixnum_value(i));
|
int off = new_lit(s, mrb_fixnum_value(i));
|
||||||
genop_2(s, OP_LOADL, cursp(), off);
|
genop_2(s, OP_LOADL, cursp(), off);
|
||||||
@@ -2944,7 +3006,11 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
|
|||||||
mrb_pool *pool = mrb_pool_open(mrb);
|
mrb_pool *pool = mrb_pool_open(mrb);
|
||||||
codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
|
codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
|
||||||
|
|
||||||
if (!p) return NULL;
|
if (!p) {
|
||||||
|
if (prev)
|
||||||
|
codegen_error(prev, "unexpected scope");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
*p = codegen_scope_zero;
|
*p = codegen_scope_zero;
|
||||||
p->mrb = mrb;
|
p->mrb = mrb;
|
||||||
p->mpool = pool;
|
p->mpool = pool;
|
||||||
@@ -3020,6 +3086,9 @@ scope_finish(codegen_scope *s)
|
|||||||
mrb_state *mrb = s->mrb;
|
mrb_state *mrb = s->mrb;
|
||||||
mrb_irep *irep = s->irep;
|
mrb_irep *irep = s->irep;
|
||||||
|
|
||||||
|
if (s->nlocals >= 0x3ff) {
|
||||||
|
codegen_error(s, "too many local variables");
|
||||||
|
}
|
||||||
irep->flags = 0;
|
irep->flags = 0;
|
||||||
if (s->iseq) {
|
if (s->iseq) {
|
||||||
irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
|
irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
|
||||||
@@ -3030,7 +3099,7 @@ scope_finish(codegen_scope *s)
|
|||||||
irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
|
irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
|
||||||
if (s->filename_sym) {
|
if (s->filename_sym) {
|
||||||
mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index);
|
mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index);
|
||||||
const char *filename = mrb_sym2name_len(s->mrb, fname, NULL);
|
const char *filename = mrb_sym_name_len(s->mrb, fname, NULL);
|
||||||
|
|
||||||
mrb_debug_info_append_file(s->mrb, s->irep->debug_info,
|
mrb_debug_info_append_file(s->mrb, s->irep->debug_info,
|
||||||
filename, s->lines, s->debug_start_pos, s->pc);
|
filename, s->lines, s->debug_start_pos, s->pc);
|
||||||
@@ -3134,9 +3203,6 @@ generate_code(mrb_state *mrb, parser_state *p, int val)
|
|||||||
struct RProc *proc;
|
struct RProc *proc;
|
||||||
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
|
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
|
||||||
|
|
||||||
if (!scope) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
scope->mrb = mrb;
|
scope->mrb = mrb;
|
||||||
scope->parser = p;
|
scope->parser = p;
|
||||||
scope->filename_sym = p->filename_sym;
|
scope->filename_sym = p->filename_sym;
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
%{
|
%{
|
||||||
struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;};
|
struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;};
|
||||||
const struct kwtable *mrb_reserved_word(const char *, unsigned int);
|
|
||||||
static const struct kwtable *reserved_word(const char *, unsigned int);
|
|
||||||
#define mrb_reserved_word(str, len) reserved_word(str, len)
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
struct kwtable;
|
struct kwtable;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* ANSI-C code produced by gperf version 3.0.4 */
|
/* ANSI-C code produced by gperf version 3.1 */
|
||||||
/* Command-line: gperf -L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k'1,3,$' /home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords */
|
/* Command-line: gperf -L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k'1,3,$' /home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords */
|
||||||
|
|
||||||
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
||||||
@@ -25,16 +25,13 @@
|
|||||||
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
||||||
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
||||||
/* The character set is not based on ISO-646. */
|
/* The character set is not based on ISO-646. */
|
||||||
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#line 1 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
#line 1 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
|
||||||
struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;};
|
struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;};
|
||||||
const struct kwtable *mrb_reserved_word(const char *, unsigned int);
|
#line 5 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
static const struct kwtable *reserved_word(const char *, unsigned int);
|
|
||||||
#define mrb_reserved_word(str, len) reserved_word(str, len)
|
|
||||||
#line 8 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
struct kwtable;
|
struct kwtable;
|
||||||
|
|
||||||
#define TOTAL_KEYWORDS 40
|
#define TOTAL_KEYWORDS 40
|
||||||
@@ -52,7 +49,7 @@ inline
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
static unsigned int
|
static unsigned int
|
||||||
hash (const char *str, unsigned int len)
|
hash (register const char *str, register size_t len)
|
||||||
{
|
{
|
||||||
static const unsigned char asso_values[] =
|
static const unsigned char asso_values[] =
|
||||||
{
|
{
|
||||||
@@ -83,7 +80,7 @@ hash (const char *str, unsigned int len)
|
|||||||
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
||||||
51, 51, 51, 51, 51, 51
|
51, 51, 51, 51, 51, 51
|
||||||
};
|
};
|
||||||
int hval = len;
|
register unsigned int hval = len;
|
||||||
|
|
||||||
switch (hval)
|
switch (hval)
|
||||||
{
|
{
|
||||||
@@ -98,109 +95,103 @@ hash (const char *str, unsigned int len)
|
|||||||
return hval + asso_values[(unsigned char)str[len - 1]];
|
return hval + asso_values[(unsigned char)str[len - 1]];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
__inline
|
|
||||||
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
|
|
||||||
__attribute__ ((__gnu_inline__))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
const struct kwtable *
|
const struct kwtable *
|
||||||
mrb_reserved_word (const char *str, unsigned int len)
|
mrb_reserved_word (register const char *str, register size_t len)
|
||||||
{
|
{
|
||||||
static const struct kwtable wordlist[] =
|
static const struct kwtable wordlist[] =
|
||||||
{
|
{
|
||||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||||
#line 18 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"break", {keyword_break, keyword_break}, EXPR_MID},
|
|
||||||
#line 23 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"else", {keyword_else, keyword_else}, EXPR_BEG},
|
|
||||||
#line 33 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"nil", {keyword_nil, keyword_nil}, EXPR_END},
|
|
||||||
#line 26 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG},
|
|
||||||
#line 25 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"end", {keyword_end, keyword_end}, EXPR_END},
|
|
||||||
#line 42 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"then", {keyword_then, keyword_then}, EXPR_BEG},
|
|
||||||
#line 34 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"not", {keyword_not, keyword_not}, EXPR_ARG},
|
|
||||||
#line 27 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"false", {keyword_false, keyword_false}, EXPR_END},
|
|
||||||
#line 40 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"self", {keyword_self, keyword_self}, EXPR_END},
|
|
||||||
#line 24 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
|
|
||||||
#line 37 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID},
|
|
||||||
#line 43 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"true", {keyword_true, keyword_true}, EXPR_END},
|
|
||||||
#line 46 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"until", {keyword_until, modifier_until}, EXPR_VALUE},
|
|
||||||
#line 45 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"unless", {keyword_unless, modifier_unless}, EXPR_VALUE},
|
|
||||||
#line 39 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"return", {keyword_return, keyword_return}, EXPR_MID},
|
|
||||||
#line 21 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"def", {keyword_def, keyword_def}, EXPR_FNAME},
|
|
||||||
#line 16 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"and", {keyword_and, keyword_and}, EXPR_VALUE},
|
|
||||||
#line 22 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"do", {keyword_do, keyword_do}, EXPR_BEG},
|
|
||||||
#line 49 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"yield", {keyword_yield, keyword_yield}, EXPR_ARG},
|
|
||||||
#line 28 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"for", {keyword_for, keyword_for}, EXPR_VALUE},
|
|
||||||
#line 44 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},
|
|
||||||
#line 35 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"or", {keyword_or, keyword_or}, EXPR_VALUE},
|
|
||||||
#line 30 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"in", {keyword_in, keyword_in}, EXPR_VALUE},
|
|
||||||
#line 47 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"when", {keyword_when, keyword_when}, EXPR_VALUE},
|
|
||||||
#line 38 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"retry", {keyword_retry, keyword_retry}, EXPR_END},
|
|
||||||
#line 29 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"if", {keyword_if, modifier_if}, EXPR_VALUE},
|
|
||||||
#line 19 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"case", {keyword_case, keyword_case}, EXPR_VALUE},
|
|
||||||
#line 36 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"redo", {keyword_redo, keyword_redo}, EXPR_END},
|
|
||||||
#line 32 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"next", {keyword_next, keyword_next}, EXPR_MID},
|
|
||||||
#line 41 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"super", {keyword_super, keyword_super}, EXPR_ARG},
|
|
||||||
#line 31 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"module", {keyword_module, keyword_module}, EXPR_VALUE},
|
|
||||||
#line 17 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"begin", {keyword_begin, keyword_begin}, EXPR_BEG},
|
|
||||||
#line 12 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END},
|
|
||||||
#line 11 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END},
|
|
||||||
#line 10 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
|
|
||||||
#line 14 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
|
||||||
{"END", {keyword_END, keyword_END}, EXPR_END},
|
|
||||||
#line 15 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
#line 15 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
{"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},
|
{"break", {keyword_break, keyword_break}, EXPR_MID},
|
||||||
|
#line 20 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"else", {keyword_else, keyword_else}, EXPR_BEG},
|
||||||
|
#line 30 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"nil", {keyword_nil, keyword_nil}, EXPR_END},
|
||||||
|
#line 23 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG},
|
||||||
|
#line 22 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"end", {keyword_end, keyword_end}, EXPR_END},
|
||||||
|
#line 39 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"then", {keyword_then, keyword_then}, EXPR_BEG},
|
||||||
|
#line 31 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"not", {keyword_not, keyword_not}, EXPR_ARG},
|
||||||
|
#line 24 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"false", {keyword_false, keyword_false}, EXPR_END},
|
||||||
|
#line 37 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"self", {keyword_self, keyword_self}, EXPR_END},
|
||||||
|
#line 21 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
|
||||||
|
#line 34 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID},
|
||||||
|
#line 40 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"true", {keyword_true, keyword_true}, EXPR_END},
|
||||||
|
#line 43 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"until", {keyword_until, modifier_until}, EXPR_VALUE},
|
||||||
|
#line 42 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"unless", {keyword_unless, modifier_unless}, EXPR_VALUE},
|
||||||
|
#line 36 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"return", {keyword_return, keyword_return}, EXPR_MID},
|
||||||
|
#line 18 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"def", {keyword_def, keyword_def}, EXPR_FNAME},
|
||||||
#line 13 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
#line 13 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"and", {keyword_and, keyword_and}, EXPR_VALUE},
|
||||||
|
#line 19 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"do", {keyword_do, keyword_do}, EXPR_BEG},
|
||||||
|
#line 46 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"yield", {keyword_yield, keyword_yield}, EXPR_ARG},
|
||||||
|
#line 25 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"for", {keyword_for, keyword_for}, EXPR_VALUE},
|
||||||
|
#line 41 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},
|
||||||
|
#line 32 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"or", {keyword_or, keyword_or}, EXPR_VALUE},
|
||||||
|
#line 27 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"in", {keyword_in, keyword_in}, EXPR_VALUE},
|
||||||
|
#line 44 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"when", {keyword_when, keyword_when}, EXPR_VALUE},
|
||||||
|
#line 35 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"retry", {keyword_retry, keyword_retry}, EXPR_END},
|
||||||
|
#line 26 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"if", {keyword_if, modifier_if}, EXPR_VALUE},
|
||||||
|
#line 16 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"case", {keyword_case, keyword_case}, EXPR_VALUE},
|
||||||
|
#line 33 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"redo", {keyword_redo, keyword_redo}, EXPR_END},
|
||||||
|
#line 29 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"next", {keyword_next, keyword_next}, EXPR_MID},
|
||||||
|
#line 38 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"super", {keyword_super, keyword_super}, EXPR_ARG},
|
||||||
|
#line 28 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"module", {keyword_module, keyword_module}, EXPR_VALUE},
|
||||||
|
#line 14 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"begin", {keyword_begin, keyword_begin}, EXPR_BEG},
|
||||||
|
#line 9 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END},
|
||||||
|
#line 8 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END},
|
||||||
|
#line 7 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
|
||||||
|
#line 11 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"END", {keyword_END, keyword_END}, EXPR_END},
|
||||||
|
#line 12 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
{"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},
|
||||||
|
#line 10 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
{"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
|
{"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
|
||||||
{""},
|
{""},
|
||||||
#line 20 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
#line 17 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
{"class", {keyword_class, keyword_class}, EXPR_CLASS},
|
{"class", {keyword_class, keyword_class}, EXPR_CLASS},
|
||||||
{""}, {""},
|
{""}, {""},
|
||||||
#line 48 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
#line 45 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
{"while", {keyword_while, modifier_while}, EXPR_VALUE}
|
{"while", {keyword_while, modifier_while}, EXPR_VALUE}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||||
{
|
{
|
||||||
int key = hash (str, len);
|
register unsigned int key = hash (str, len);
|
||||||
|
|
||||||
if (key <= MAX_HASH_VALUE && key >= 0)
|
if (key <= MAX_HASH_VALUE)
|
||||||
{
|
{
|
||||||
const char *s = wordlist[key].name;
|
register const char *s = wordlist[key].name;
|
||||||
|
|
||||||
if (*str == *s && !strcmp (str + 1, s + 1))
|
if (*str == *s && !strcmp (str + 1, s + 1))
|
||||||
return &wordlist[key];
|
return &wordlist[key];
|
||||||
@@ -208,4 +199,5 @@ mrb_reserved_word (const char *str, unsigned int len)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#line 50 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
#line 47 "/home/matz/work/mruby/mrbgems/mruby-compiler/core/keywords"
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ enum node_type {
|
|||||||
NODE_IVAR,
|
NODE_IVAR,
|
||||||
NODE_CONST,
|
NODE_CONST,
|
||||||
NODE_CVAR,
|
NODE_CVAR,
|
||||||
|
NODE_NVAR,
|
||||||
NODE_NTH_REF,
|
NODE_NTH_REF,
|
||||||
NODE_BACK_REF,
|
NODE_BACK_REF,
|
||||||
NODE_MATCH,
|
NODE_MATCH,
|
||||||
|
|||||||
+688
-272
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,35 +3,33 @@ MRuby::Gem::Specification.new 'mruby-compiler' do |spec|
|
|||||||
spec.author = 'mruby developers'
|
spec.author = 'mruby developers'
|
||||||
spec.summary = 'mruby compiler library'
|
spec.summary = 'mruby compiler library'
|
||||||
|
|
||||||
current_dir = spec.dir
|
lex_def = "#{dir}/core/lex.def"
|
||||||
current_build_dir = spec.build_dir
|
core_objs = Dir.glob("#{dir}/core/*.c").map { |f|
|
||||||
|
|
||||||
lex_def = "#{current_dir}/core/lex.def"
|
|
||||||
core_objs = Dir.glob("#{current_dir}/core/*.c").map { |f|
|
|
||||||
next nil if build.cxx_exception_enabled? and f =~ /(codegen).c$/
|
next nil if build.cxx_exception_enabled? and f =~ /(codegen).c$/
|
||||||
objfile(f.pathmap("#{current_build_dir}/core/%n"))
|
objfile(f.pathmap("#{build_dir}/core/%n"))
|
||||||
}.compact
|
}.compact
|
||||||
|
|
||||||
if build.cxx_exception_enabled?
|
if build.cxx_exception_enabled?
|
||||||
core_objs <<
|
core_objs <<
|
||||||
build.compile_as_cxx("#{current_build_dir}/core/y.tab.c", "#{current_build_dir}/core/y.tab.cxx",
|
build.compile_as_cxx("#{dir}/core/y.tab.c", "#{build_dir}/core/y.tab.cxx",
|
||||||
objfile("#{current_build_dir}/y.tab"), ["#{current_dir}/core"]) <<
|
objfile("#{build_dir}/y.tab"), ["#{dir}/core"]) <<
|
||||||
build.compile_as_cxx("#{current_dir}/core/codegen.c", "#{current_build_dir}/core/codegen.cxx")
|
build.compile_as_cxx("#{dir}/core/codegen.c", "#{build_dir}/core/codegen.cxx")
|
||||||
else
|
else
|
||||||
core_objs << objfile("#{current_build_dir}/core/y.tab")
|
core_objs << objfile("#{build_dir}/core/y.tab")
|
||||||
file objfile("#{current_build_dir}/core/y.tab") => "#{current_build_dir}/core/y.tab.c" do |t|
|
file objfile("#{build_dir}/core/y.tab") => "#{dir}/core/y.tab.c" do |t|
|
||||||
cc.run t.name, t.prerequisites.first, [], ["#{current_dir}/core"]
|
cc.run t.name, t.prerequisites.first, [], ["#{dir}/core"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Parser
|
# Parser
|
||||||
file "#{current_build_dir}/core/y.tab.c" => ["#{current_dir}/core/parse.y", lex_def] do |t|
|
file "#{dir}/core/y.tab.c" => ["#{dir}/core/parse.y", lex_def] do |t|
|
||||||
FileUtils.mkdir_p File.dirname t.name
|
|
||||||
yacc.run t.name, t.prerequisites.first
|
yacc.run t.name, t.prerequisites.first
|
||||||
|
content = File.read(t.name).gsub(/^#line +\d+ +"\K.*$/){$&.relative_path}
|
||||||
|
File.write(t.name, content)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Lexical analyzer
|
# Lexical analyzer
|
||||||
file lex_def => "#{current_dir}/core/keywords" do |t|
|
file lex_def => "#{dir}/core/keywords" do |t|
|
||||||
gperf.run t.name, t.prerequisites.first
|
gperf.run t.name, t.prerequisites.first
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
MRuby::Gem::Specification.new('mruby-complex') do |spec|
|
||||||
|
spec.license = 'MIT'
|
||||||
|
spec.author = 'mruby developers'
|
||||||
|
spec.summary = 'Complex class'
|
||||||
|
|
||||||
|
spec.add_dependency 'mruby-math', core: 'mruby-math'
|
||||||
|
end
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
class Complex < Numeric
|
||||||
|
def self.polar(abs, arg = 0)
|
||||||
|
Complex(abs * Math.cos(arg), abs * Math.sin(arg))
|
||||||
|
end
|
||||||
|
|
||||||
|
def inspect
|
||||||
|
"(#{to_s})"
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
"#{real}#{'+' unless imaginary < 0}#{imaginary}i"
|
||||||
|
end
|
||||||
|
|
||||||
|
def +@
|
||||||
|
Complex(real, imaginary)
|
||||||
|
end
|
||||||
|
|
||||||
|
def -@
|
||||||
|
Complex(-real, -imaginary)
|
||||||
|
end
|
||||||
|
|
||||||
|
def +(rhs)
|
||||||
|
if rhs.is_a? Complex
|
||||||
|
Complex(real + rhs.real, imaginary + rhs.imaginary)
|
||||||
|
elsif rhs.is_a? Numeric
|
||||||
|
Complex(real + rhs, imaginary)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def -(rhs)
|
||||||
|
if rhs.is_a? Complex
|
||||||
|
Complex(real - rhs.real, imaginary - rhs.imaginary)
|
||||||
|
elsif rhs.is_a? Numeric
|
||||||
|
Complex(real - rhs, imaginary)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def *(rhs)
|
||||||
|
if rhs.is_a? Complex
|
||||||
|
Complex(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
|
||||||
|
elsif rhs.is_a? Numeric
|
||||||
|
Complex(real * rhs, imaginary * rhs)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def /(rhs)
|
||||||
|
if rhs.is_a? Complex
|
||||||
|
__div__(rhs)
|
||||||
|
elsif rhs.is_a? Numeric
|
||||||
|
Complex(real / rhs, imaginary / rhs)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
alias_method :quo, :/
|
||||||
|
|
||||||
|
def ==(rhs)
|
||||||
|
if rhs.is_a? Complex
|
||||||
|
real == rhs.real && imaginary == rhs.imaginary
|
||||||
|
elsif rhs.is_a? Numeric
|
||||||
|
imaginary == 0 && real == rhs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def abs
|
||||||
|
Math.hypot imaginary, real
|
||||||
|
end
|
||||||
|
alias_method :magnitude, :abs
|
||||||
|
|
||||||
|
def abs2
|
||||||
|
real * real + imaginary * imaginary
|
||||||
|
end
|
||||||
|
|
||||||
|
def arg
|
||||||
|
Math.atan2 imaginary, real
|
||||||
|
end
|
||||||
|
alias_method :angle, :arg
|
||||||
|
alias_method :phase, :arg
|
||||||
|
|
||||||
|
def conjugate
|
||||||
|
Complex(real, -imaginary)
|
||||||
|
end
|
||||||
|
alias_method :conj, :conjugate
|
||||||
|
|
||||||
|
def fdiv(numeric)
|
||||||
|
Complex(real.to_f / numeric, imaginary.to_f / numeric)
|
||||||
|
end
|
||||||
|
|
||||||
|
def polar
|
||||||
|
[abs, arg]
|
||||||
|
end
|
||||||
|
|
||||||
|
def real?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def rectangular
|
||||||
|
[real, imaginary]
|
||||||
|
end
|
||||||
|
alias_method :rect, :rectangular
|
||||||
|
|
||||||
|
def to_r
|
||||||
|
raise RangeError.new "can't convert #{to_s} into Rational" unless imaginary.zero?
|
||||||
|
Rational(real, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
alias_method :imag, :imaginary
|
||||||
|
|
||||||
|
[Fixnum, Float].each do |cls|
|
||||||
|
[:+, :-, :*, :/, :==].each do |op|
|
||||||
|
cls.instance_eval do
|
||||||
|
original_operator_name = :"__original_operator_#{op}_complex"
|
||||||
|
alias_method original_operator_name, op
|
||||||
|
define_method op do |rhs|
|
||||||
|
if rhs.is_a? Complex
|
||||||
|
Complex(self).__send__(op, rhs)
|
||||||
|
else
|
||||||
|
__send__(original_operator_name, rhs)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,248 @@
|
|||||||
|
#include <mruby.h>
|
||||||
|
#include <mruby/class.h>
|
||||||
|
#include <mruby/numeric.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#ifdef MRB_WITHOUT_FLOAT
|
||||||
|
# error Complex conflicts 'MRB_WITHOUT_FLOAT' configuration in your 'build_config.rb'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct mrb_complex {
|
||||||
|
mrb_float real;
|
||||||
|
mrb_float imaginary;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef MRB_USE_FLOAT
|
||||||
|
#define F(x) x##f
|
||||||
|
#else
|
||||||
|
#define F(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MRB_64BIT) || defined(MRB_USE_FLOAT)
|
||||||
|
|
||||||
|
#define COMPLEX_USE_ISTRUCT
|
||||||
|
/* use TT_ISTRUCT */
|
||||||
|
#include <mruby/istruct.h>
|
||||||
|
|
||||||
|
#define complex_ptr(mrb, v) (struct mrb_complex*)mrb_istruct_ptr(v)
|
||||||
|
|
||||||
|
static struct RBasic*
|
||||||
|
complex_alloc(mrb_state *mrb, struct RClass *c, struct mrb_complex **p)
|
||||||
|
{
|
||||||
|
struct RIStruct *s;
|
||||||
|
|
||||||
|
s = (struct RIStruct*)mrb_obj_alloc(mrb, MRB_TT_ISTRUCT, c);
|
||||||
|
*p = (struct mrb_complex*)s->inline_data;
|
||||||
|
|
||||||
|
return (struct RBasic*)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* use TT_DATA */
|
||||||
|
#include <mruby/data.h>
|
||||||
|
|
||||||
|
static const struct mrb_data_type mrb_complex_type = {"Complex", mrb_free};
|
||||||
|
|
||||||
|
static struct RBasic*
|
||||||
|
complex_alloc(mrb_state *mrb, struct RClass *c, struct mrb_complex **p)
|
||||||
|
{
|
||||||
|
struct RData *d;
|
||||||
|
|
||||||
|
Data_Make_Struct(mrb, c, struct mrb_complex, &mrb_complex_type, *p, d);
|
||||||
|
|
||||||
|
return (struct RBasic*)d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct mrb_complex*
|
||||||
|
complex_ptr(mrb_state *mrb, mrb_value v)
|
||||||
|
{
|
||||||
|
struct mrb_complex *p;
|
||||||
|
|
||||||
|
p = DATA_GET_PTR(mrb, v, &mrb_complex_type, struct mrb_complex);
|
||||||
|
if (!p) {
|
||||||
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized complex");
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_new(mrb_state *mrb, mrb_float real, mrb_float imaginary)
|
||||||
|
{
|
||||||
|
struct RClass *c = mrb_class_get(mrb, "Complex");
|
||||||
|
struct mrb_complex *p;
|
||||||
|
struct RBasic *comp = complex_alloc(mrb, c, &p);
|
||||||
|
p->real = real;
|
||||||
|
p->imaginary = imaginary;
|
||||||
|
MRB_SET_FROZEN_FLAG(comp);
|
||||||
|
|
||||||
|
return mrb_obj_value(comp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_real(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
struct mrb_complex *p = complex_ptr(mrb, self);
|
||||||
|
return mrb_float_value(mrb, p->real);
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_imaginary(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
struct mrb_complex *p = complex_ptr(mrb, self);
|
||||||
|
return mrb_float_value(mrb, p->imaginary);
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_s_rect(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
mrb_float real, imaginary = 0.0;
|
||||||
|
|
||||||
|
mrb_get_args(mrb, "f|f", &real, &imaginary);
|
||||||
|
return complex_new(mrb, real, imaginary);
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_to_f(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
struct mrb_complex *p = complex_ptr(mrb, self);
|
||||||
|
|
||||||
|
if (p->imaginary != 0) {
|
||||||
|
mrb_raisef(mrb, E_RANGE_ERROR, "can't convert %v into Float", self);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mrb_float_value(mrb, p->real);
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_to_i(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
struct mrb_complex *p = complex_ptr(mrb, self);
|
||||||
|
|
||||||
|
if (p->imaginary != 0) {
|
||||||
|
mrb_raisef(mrb, E_RANGE_ERROR, "can't convert %v into Float", self);
|
||||||
|
}
|
||||||
|
return mrb_int_value(mrb, p->real);
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_to_c(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Arithmetic on (significand, exponent) pairs avoids premature overflow in
|
||||||
|
complex division */
|
||||||
|
struct float_pair {
|
||||||
|
mrb_float s;
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_pair(struct float_pair *s, struct float_pair const *a,
|
||||||
|
struct float_pair const *b)
|
||||||
|
{
|
||||||
|
if (b->s == 0.0F) {
|
||||||
|
*s = *a;
|
||||||
|
} else if (a->s == 0.0F) {
|
||||||
|
*s = *b;
|
||||||
|
} else if (a->x >= b->x) {
|
||||||
|
s->s = a->s + F(ldexp)(b->s, b->x - a->x);
|
||||||
|
s->x = a->x;
|
||||||
|
} else {
|
||||||
|
s->s = F(ldexp)(a->s, a->x - b->x) + b->s;
|
||||||
|
s->x = b->x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mul_pair(struct float_pair *p, struct float_pair const *a,
|
||||||
|
struct float_pair const *b)
|
||||||
|
{
|
||||||
|
p->s = a->s * b->s;
|
||||||
|
p->x = a->x + b->x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
div_pair(struct float_pair *q, struct float_pair const *a,
|
||||||
|
struct float_pair const *b)
|
||||||
|
{
|
||||||
|
q->s = a->s / b->s;
|
||||||
|
q->x = a->x - b->x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static mrb_value
|
||||||
|
complex_div(mrb_state *mrb, mrb_value self)
|
||||||
|
{
|
||||||
|
mrb_value rhs = mrb_get_arg1(mrb);
|
||||||
|
struct mrb_complex *a, *b;
|
||||||
|
struct float_pair ar, ai, br, bi;
|
||||||
|
struct float_pair br2, bi2;
|
||||||
|
struct float_pair div;
|
||||||
|
struct float_pair ar_br, ai_bi;
|
||||||
|
struct float_pair ai_br, ar_bi;
|
||||||
|
struct float_pair zr, zi;
|
||||||
|
|
||||||
|
a = complex_ptr(mrb, self);
|
||||||
|
b = complex_ptr(mrb, rhs);
|
||||||
|
|
||||||
|
/* Split floating point components into significand and exponent */
|
||||||
|
ar.s = F(frexp)(a->real, &ar.x);
|
||||||
|
ai.s = F(frexp)(a->imaginary, &ai.x);
|
||||||
|
br.s = F(frexp)(b->real, &br.x);
|
||||||
|
bi.s = F(frexp)(b->imaginary, &bi.x);
|
||||||
|
|
||||||
|
/* Perform arithmetic on (significand, exponent) pairs to produce
|
||||||
|
the result: */
|
||||||
|
|
||||||
|
/* the divisor */
|
||||||
|
mul_pair(&br2, &br, &br);
|
||||||
|
mul_pair(&bi2, &bi, &bi);
|
||||||
|
add_pair(&div, &br2, &bi2);
|
||||||
|
|
||||||
|
/* real component */
|
||||||
|
mul_pair(&ar_br, &ar, &br);
|
||||||
|
mul_pair(&ai_bi, &ai, &bi);
|
||||||
|
add_pair(&zr, &ar_br, &ai_bi);
|
||||||
|
div_pair(&zr, &zr, &div);
|
||||||
|
|
||||||
|
/* imaginary component */
|
||||||
|
mul_pair(&ai_br, &ai, &br);
|
||||||
|
mul_pair(&ar_bi, &ar, &bi);
|
||||||
|
ar_bi.s = -ar_bi.s;
|
||||||
|
add_pair(&zi, &ai_br, &ar_bi);
|
||||||
|
div_pair(&zi, &zi, &div);
|
||||||
|
|
||||||
|
/* assemble the result */
|
||||||
|
return complex_new(mrb, F(ldexp)(zr.s, zr.x), F(ldexp)(zi.s, zi.x));
|
||||||
|
}
|
||||||
|
|
||||||
|
void mrb_mruby_complex_gem_init(mrb_state *mrb)
|
||||||
|
{
|
||||||
|
struct RClass *comp;
|
||||||
|
|
||||||
|
#ifdef COMPLEX_USE_ISTRUCT
|
||||||
|
mrb_assert(sizeof(struct mrb_complex) < ISTRUCT_DATA_SIZE);
|
||||||
|
#endif
|
||||||
|
comp = mrb_define_class(mrb, "Complex", mrb_class_get(mrb, "Numeric"));
|
||||||
|
#ifdef COMPLEX_USE_ISTRUCT
|
||||||
|
MRB_SET_INSTANCE_TT(comp, MRB_TT_ISTRUCT);
|
||||||
|
#else
|
||||||
|
MRB_SET_INSTANCE_TT(comp, MRB_TT_DATA);
|
||||||
|
#endif
|
||||||
|
mrb_undef_class_method(mrb, comp, "new");
|
||||||
|
mrb_define_class_method(mrb, comp, "rectangular", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
|
||||||
|
mrb_define_class_method(mrb, comp, "rect", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
|
||||||
|
mrb_define_method(mrb, mrb->kernel_module, "Complex", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
|
||||||
|
mrb_define_method(mrb, comp, "real", complex_real, MRB_ARGS_NONE());
|
||||||
|
mrb_define_method(mrb, comp, "imaginary", complex_imaginary, MRB_ARGS_NONE());
|
||||||
|
mrb_define_method(mrb, comp, "to_f", complex_to_f, MRB_ARGS_NONE());
|
||||||
|
mrb_define_method(mrb, comp, "to_i", complex_to_i, MRB_ARGS_NONE());
|
||||||
|
mrb_define_method(mrb, comp, "to_c", complex_to_c, MRB_ARGS_NONE());
|
||||||
|
mrb_define_method(mrb, comp, "__div__", complex_div, MRB_ARGS_REQ(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mrb_mruby_complex_gem_final(mrb_state* mrb)
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
def assert_complex(real, exp)
|
||||||
|
assert "assert_complex" do
|
||||||
|
assert_float real.real, exp.real
|
||||||
|
assert_float real.imaginary, exp.imaginary
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex' do
|
||||||
|
c = 123i
|
||||||
|
assert_equal Complex, c.class
|
||||||
|
assert_equal [c.real, c.imaginary], [0, 123]
|
||||||
|
c = 123 + -1.23i
|
||||||
|
assert_equal Complex, c.class
|
||||||
|
assert_equal [c.real, c.imaginary], [123, -1.23]
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex::polar' do
|
||||||
|
assert_complex Complex.polar(3, 0), (3 + 0i)
|
||||||
|
assert_complex Complex.polar(3, Math::PI/2), (0 + 3i)
|
||||||
|
assert_complex Complex.polar(3, Math::PI), (-3 + 0i)
|
||||||
|
assert_complex Complex.polar(3, -Math::PI/2), (0 + -3i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex::rectangular' do
|
||||||
|
assert_complex Complex.rectangular(1, 2), (1 + 2i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#*' do
|
||||||
|
assert_complex Complex(2, 3) * Complex(2, 3), (-5 + 12i)
|
||||||
|
assert_complex Complex(900) * Complex(1), (900 + 0i)
|
||||||
|
assert_complex Complex(-2, 9) * Complex(-9, 2), (0 - 85i)
|
||||||
|
assert_complex Complex(9, 8) * 4, (36 + 32i)
|
||||||
|
assert_complex Complex(20, 9) * 9.8, (196.0 + 88.2i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#+' do
|
||||||
|
assert_complex Complex(2, 3) + Complex(2, 3) , (4 + 6i)
|
||||||
|
assert_complex Complex(900) + Complex(1) , (901 + 0i)
|
||||||
|
assert_complex Complex(-2, 9) + Complex(-9, 2), (-11 + 11i)
|
||||||
|
assert_complex Complex(9, 8) + 4 , (13 + 8i)
|
||||||
|
assert_complex Complex(20, 9) + 9.8 , (29.8 + 9i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#-' do
|
||||||
|
assert_complex Complex(2, 3) - Complex(2, 3) , (0 + 0i)
|
||||||
|
assert_complex Complex(900) - Complex(1) , (899 + 0i)
|
||||||
|
assert_complex Complex(-2, 9) - Complex(-9, 2), (7 + 7i)
|
||||||
|
assert_complex Complex(9, 8) - 4 , (5 + 8i)
|
||||||
|
assert_complex Complex(20, 9) - 9.8 , (10.2 + 9i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#-@' do
|
||||||
|
assert_complex(-Complex(1, 2), (-1 - 2i))
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#/' do
|
||||||
|
assert_complex Complex(2, 3) / Complex(2, 3) , (1 + 0i)
|
||||||
|
assert_complex Complex(900) / Complex(1) , (900 + 0i)
|
||||||
|
assert_complex Complex(-2, 9) / Complex(-9, 2), ((36 / 85) - (77i / 85))
|
||||||
|
assert_complex Complex(9, 8) / 4 , ((9 / 4) + 2i)
|
||||||
|
assert_complex Complex(20, 9) / 9.8 , (2.0408163265306123 + 0.9183673469387754i)
|
||||||
|
if 1e39.infinite? then
|
||||||
|
# MRB_USE_FLOAT in effect
|
||||||
|
ten = 1e21
|
||||||
|
one = 1e20
|
||||||
|
else
|
||||||
|
ten = 1e201
|
||||||
|
one = 1e200
|
||||||
|
end
|
||||||
|
assert_complex Complex(ten, ten) / Complex(one, one), Complex(10.0, 0.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#==' do
|
||||||
|
assert_true Complex(2, 3) == Complex(2, 3)
|
||||||
|
assert_true Complex(5) == 5
|
||||||
|
assert_true Complex(0) == 0.0
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#abs' do
|
||||||
|
assert_float Complex(-1).abs, 1
|
||||||
|
assert_float Complex(3.0, -4.0).abs, 5.0
|
||||||
|
if 1e39.infinite? then
|
||||||
|
# MRB_USE_FLOAT in effect
|
||||||
|
exp = 125
|
||||||
|
else
|
||||||
|
exp = 1021
|
||||||
|
end
|
||||||
|
assert_true Complex(3.0*2.0**exp, 4.0*2.0**exp).abs.finite?
|
||||||
|
assert_float Complex(3.0*2.0**exp, 4.0*2.0**exp).abs, 5.0*2.0**exp
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#abs2' do
|
||||||
|
assert_float Complex(-1).abs2, 1
|
||||||
|
assert_float Complex(3.0, -4.0).abs2, 25.0
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#arg' do
|
||||||
|
assert_float Complex.polar(3, Math::PI/2).arg, 1.5707963267948966
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#conjugate' do
|
||||||
|
assert_complex Complex(1, 2).conjugate, (1 - 2i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#fdiv' do
|
||||||
|
assert_complex Complex(11, 22).fdiv(3), (3.6666666666666665 + 7.333333333333333i)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#imaginary' do
|
||||||
|
assert_float Complex(7).imaginary , 0
|
||||||
|
assert_float Complex(9, -4).imaginary, -4
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#polar' do
|
||||||
|
assert_equal Complex(1, 2).polar, [2.23606797749979, 1.1071487177940904]
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#real' do
|
||||||
|
assert_float Complex(7).real, 7
|
||||||
|
assert_float Complex(9, -4).real, 9
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#real?' do
|
||||||
|
assert_false Complex(1).real?
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex::rectangular' do
|
||||||
|
assert_equal Complex(1, 2).rectangular, [1, 2]
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex::to_c' do
|
||||||
|
assert_equal Complex(1, 2).to_c, Complex(1, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex::to_f' do
|
||||||
|
assert_float Complex(1, 0).to_f, 1.0
|
||||||
|
assert_raise(RangeError) do
|
||||||
|
Complex(1, 2).to_f
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex::to_i' do
|
||||||
|
assert_equal Complex(1, 0).to_i, 1
|
||||||
|
assert_raise(RangeError) do
|
||||||
|
Complex(1, 2).to_i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert 'Complex#frozen?' do
|
||||||
|
assert_predicate(1i, :frozen?)
|
||||||
|
assert_predicate(Complex(2,3), :frozen?)
|
||||||
|
assert_predicate(4+5i, :frozen?)
|
||||||
|
end
|
||||||
@@ -6,28 +6,30 @@ module Enumerable
|
|||||||
def chain(*args)
|
def chain(*args)
|
||||||
Enumerator::Chain.new(self, *args)
|
Enumerator::Chain.new(self, *args)
|
||||||
end
|
end
|
||||||
|
|
||||||
def +(other)
|
|
||||||
Enumerator::Chain.new(self, other)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class Enumerator
|
class Enumerator
|
||||||
|
def +(other)
|
||||||
|
Chain.new(self, other)
|
||||||
|
end
|
||||||
|
|
||||||
class Chain
|
class Chain
|
||||||
include Enumerable
|
include Enumerable
|
||||||
|
|
||||||
def initialize(*args)
|
def initialize(*args)
|
||||||
@enums = args
|
@enums = args.freeze
|
||||||
end
|
@pos = -1
|
||||||
|
|
||||||
def initialize_copy(orig)
|
|
||||||
@enums = orig.__copy_enums
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def each(&block)
|
def each(&block)
|
||||||
return to_enum unless block_given?
|
return to_enum unless block
|
||||||
|
|
||||||
@enums.each { |e| e.each(&block) }
|
i = 0
|
||||||
|
while i < @enums.size
|
||||||
|
@pos = i
|
||||||
|
@enums[i].each(&block)
|
||||||
|
i += 1
|
||||||
|
end
|
||||||
|
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
@@ -40,21 +42,21 @@ class Enumerator
|
|||||||
end
|
end
|
||||||
|
|
||||||
def rewind
|
def rewind
|
||||||
@enums.reverse_each do |e|
|
while 0 <= @pos && @pos < @enums.size
|
||||||
|
e = @enums[@pos]
|
||||||
e.rewind if e.respond_to?(:rewind)
|
e.rewind if e.respond_to?(:rewind)
|
||||||
|
@pos -= 1
|
||||||
end
|
end
|
||||||
|
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def +(other)
|
||||||
|
self.class.new(self, other)
|
||||||
|
end
|
||||||
|
|
||||||
def inspect
|
def inspect
|
||||||
"#<#{self.class}: #{@enums.inspect}>"
|
"#<#{self.class}: #{@enums.inspect}>"
|
||||||
end
|
end
|
||||||
|
|
||||||
def __copy_enums
|
|
||||||
@enums.each_with_object([]) do |e, a|
|
|
||||||
a << e.clone
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ assert("Enumerable#chain") do
|
|||||||
assert_raise(NoMethodError) { c.chain }
|
assert_raise(NoMethodError) { c.chain }
|
||||||
end
|
end
|
||||||
|
|
||||||
assert("Enumerable#+") do
|
assert("Enumerator#+") do
|
||||||
a = [].each
|
a = [].each
|
||||||
b = {}.reverse_each
|
b = {}.each
|
||||||
c = Object.new # not has #each method
|
c = Object.new # not has #each method
|
||||||
|
|
||||||
assert_kind_of Enumerator::Chain, a + b
|
assert_kind_of Enumerator::Chain, a + b
|
||||||
@@ -24,7 +24,7 @@ assert("Enumerable#+") do
|
|||||||
assert_raise(NoMethodError) { c + a }
|
assert_raise(NoMethodError) { c + a }
|
||||||
end
|
end
|
||||||
|
|
||||||
assert("Enumerator.new") do
|
assert("Enumerator::Chain.new") do
|
||||||
a = []
|
a = []
|
||||||
b = {}
|
b = {}
|
||||||
c = Object.new # not has #each method
|
c = Object.new # not has #each method
|
||||||
@@ -46,13 +46,13 @@ assert("Enumerator::Chain#each") do
|
|||||||
assert_kind_of Enumerator, aa.each
|
assert_kind_of Enumerator, aa.each
|
||||||
assert_equal [1, 2, 3, 1, 2, 3], aa.each.to_a
|
assert_equal [1, 2, 3, 1, 2, 3], aa.each.to_a
|
||||||
|
|
||||||
aa = a.chain(a.reverse_each)
|
aa = a.chain(6..9)
|
||||||
assert_kind_of Enumerator, aa.each
|
assert_kind_of Enumerator, aa.each
|
||||||
assert_equal [1, 2, 3, 3, 2, 1], aa.each.to_a
|
assert_equal [1, 2, 3, 6, 7, 8, 9], aa.each.to_a
|
||||||
|
|
||||||
aa = a.chain(a.reverse_each, a)
|
aa = a.chain((-3..-2).each_with_index, a)
|
||||||
assert_kind_of Enumerator, aa.each
|
assert_kind_of Enumerator, aa.each
|
||||||
assert_equal [1, 2, 3, 3, 2, 1, 1, 2, 3], aa.each.to_a
|
assert_equal [1, 2, 3, [-3, 0], [-2, 1], 1, 2, 3], aa.each.to_a
|
||||||
|
|
||||||
aa = a.chain(Object.new)
|
aa = a.chain(Object.new)
|
||||||
assert_kind_of Enumerator, aa.each
|
assert_kind_of Enumerator, aa.each
|
||||||
@@ -65,12 +65,44 @@ assert("Enumerator::Chain#size") do
|
|||||||
aa = a.chain(a)
|
aa = a.chain(a)
|
||||||
assert_equal 6, aa.size
|
assert_equal 6, aa.size
|
||||||
|
|
||||||
aa = a.chain(a.reverse_each)
|
aa = a.chain(3..4)
|
||||||
assert_nil aa.size
|
assert_nil aa.size
|
||||||
|
|
||||||
aa = a.chain(a.reverse_each, a)
|
aa = a.chain(3..4, a)
|
||||||
assert_nil aa.size
|
assert_nil aa.size
|
||||||
|
|
||||||
aa = a.chain(Object.new)
|
aa = a.chain(Object.new)
|
||||||
assert_nil aa.size
|
assert_nil aa.size
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert("Enumerator::Chain#rewind") do
|
||||||
|
rewound = nil
|
||||||
|
e1 = [1, 2]
|
||||||
|
e2 = (4..6)
|
||||||
|
(class << e1; self end).define_method(:rewind) { rewound << self }
|
||||||
|
(class << e2; self end).define_method(:rewind) { rewound << self }
|
||||||
|
c = e1.chain(e2)
|
||||||
|
|
||||||
|
rewound = []
|
||||||
|
c.rewind
|
||||||
|
assert_equal [], rewound
|
||||||
|
|
||||||
|
rewound = []
|
||||||
|
c.each{break c}.rewind
|
||||||
|
assert_equal [e1], rewound
|
||||||
|
|
||||||
|
rewound = []
|
||||||
|
c.each{}.rewind
|
||||||
|
assert_equal [e2, e1], rewound
|
||||||
|
end
|
||||||
|
|
||||||
|
assert("Enumerator::Chain#+") do
|
||||||
|
a = [].chain
|
||||||
|
b = {}.chain
|
||||||
|
c = Object.new # not has #each method
|
||||||
|
|
||||||
|
assert_kind_of Enumerator::Chain, a + b
|
||||||
|
assert_kind_of Enumerator::Chain, a + c
|
||||||
|
assert_kind_of Enumerator::Chain, b + a
|
||||||
|
assert_kind_of Enumerator::Chain, b + c
|
||||||
|
end
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user