From 03fb5ff6ae01a680c786d9ee148839543c519411 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Thu, 21 Mar 2019 23:29:10 +0100 Subject: gnu: libgit2: Avoid Python. * gnu/packages/patches/libgit2-avoid-python.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/version-control.scm (libgit2)[source]: Use it. [inputs]: Remove python. [native-inputs]: Add guile-2.2. --- gnu/local.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index b3c54a752a..d85679b2a8 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -972,6 +972,7 @@ dist_patch_DATA = \ %D%/packages/patches/libexif-CVE-2016-6328.patch \ %D%/packages/patches/libexif-CVE-2017-7544.patch \ %D%/packages/patches/libgcrypt-make-yat2m-reproducible.patch \ + %D%/packages/patches/libgit2-avoid-python.patch \ %D%/packages/patches/libgit2-mtime-0.patch \ %D%/packages/patches/libgdata-fix-tests.patch \ %D%/packages/patches/libgdata-glib-duplicate-tests.patch \ -- cgit v1.2.3 From e190d12eae25fff8ab818a94c8fd5302bdc797dd Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Sat, 23 Mar 2019 16:02:35 +0100 Subject: gnu: dropbear: Update to 2019.77. * gnu/packages/ssh.scm (dropbear): Update to 2019.77. [source]: Remove patch. * gnu/packages/patches/dropbear-CVE-2018-15599.patch: Delete file. * gnu/local.mk (dist_patch_DATA): Remove it. --- gnu/local.mk | 1 - gnu/packages/patches/dropbear-CVE-2018-15599.patch | 240 --------------------- gnu/packages/ssh.scm | 21 +- 3 files changed, 10 insertions(+), 252 deletions(-) delete mode 100644 gnu/packages/patches/dropbear-CVE-2018-15599.patch (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index d85679b2a8..594755f693 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -728,7 +728,6 @@ dist_patch_DATA = \ %D%/packages/patches/docker-fix-tests.patch \ %D%/packages/patches/dovecot-trees-support-dovecot-2.3.patch \ %D%/packages/patches/doxygen-test.patch \ - %D%/packages/patches/dropbear-CVE-2018-15599.patch \ %D%/packages/patches/dvd+rw-tools-add-include.patch \ %D%/packages/patches/efl-mesa-compat.patch \ %D%/packages/patches/elfutils-tests-ptrace.patch \ diff --git a/gnu/packages/patches/dropbear-CVE-2018-15599.patch b/gnu/packages/patches/dropbear-CVE-2018-15599.patch deleted file mode 100644 index a474552cd2..0000000000 --- a/gnu/packages/patches/dropbear-CVE-2018-15599.patch +++ /dev/null @@ -1,240 +0,0 @@ -Fix CVE-2018-15599: - -http://lists.ucc.gu.uwa.edu.au/pipermail/dropbear/2018q3/002108.html -https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-15599 - -Patch copied from upstream source repository: - -https://github.com/mkj/dropbear/commit/52adbb34c32d3e2e1bcdb941e20a6f81138b8248 - -From 52adbb34c32d3e2e1bcdb941e20a6f81138b8248 Mon Sep 17 00:00:00 2001 -From: Matt Johnston -Date: Thu, 23 Aug 2018 23:43:12 +0800 -Subject: [PATCH] Wait to fail invalid usernames - ---- - auth.h | 6 +++--- - svr-auth.c | 19 +++++-------------- - svr-authpam.c | 26 ++++++++++++++++++++++---- - svr-authpasswd.c | 27 ++++++++++++++------------- - svr-authpubkey.c | 11 ++++++++++- - 5 files changed, 54 insertions(+), 35 deletions(-) - -diff --git a/auth.h b/auth.h -index da498f5b..98f54683 100644 ---- a/auth.h -+++ b/auth.h -@@ -37,9 +37,9 @@ void recv_msg_userauth_request(void); - void send_msg_userauth_failure(int partial, int incrfail); - void send_msg_userauth_success(void); - void send_msg_userauth_banner(const buffer *msg); --void svr_auth_password(void); --void svr_auth_pubkey(void); --void svr_auth_pam(void); -+void svr_auth_password(int valid_user); -+void svr_auth_pubkey(int valid_user); -+void svr_auth_pam(int valid_user); - - #if DROPBEAR_SVR_PUBKEY_OPTIONS_BUILT - int svr_pubkey_allows_agentfwd(void); -diff --git a/svr-auth.c b/svr-auth.c -index c19c0901..edde86bc 100644 ---- a/svr-auth.c -+++ b/svr-auth.c -@@ -149,10 +149,8 @@ void recv_msg_userauth_request() { - if (methodlen == AUTH_METHOD_PASSWORD_LEN && - strncmp(methodname, AUTH_METHOD_PASSWORD, - AUTH_METHOD_PASSWORD_LEN) == 0) { -- if (valid_user) { -- svr_auth_password(); -- goto out; -- } -+ svr_auth_password(valid_user); -+ goto out; - } - } - #endif -@@ -164,10 +162,8 @@ void recv_msg_userauth_request() { - if (methodlen == AUTH_METHOD_PASSWORD_LEN && - strncmp(methodname, AUTH_METHOD_PASSWORD, - AUTH_METHOD_PASSWORD_LEN) == 0) { -- if (valid_user) { -- svr_auth_pam(); -- goto out; -- } -+ svr_auth_pam(valid_user); -+ goto out; - } - } - #endif -@@ -177,12 +173,7 @@ void recv_msg_userauth_request() { - if (methodlen == AUTH_METHOD_PUBKEY_LEN && - strncmp(methodname, AUTH_METHOD_PUBKEY, - AUTH_METHOD_PUBKEY_LEN) == 0) { -- if (valid_user) { -- svr_auth_pubkey(); -- } else { -- /* pubkey has no failure delay */ -- send_msg_userauth_failure(0, 0); -- } -+ svr_auth_pubkey(valid_user); - goto out; - } - #endif -diff --git a/svr-authpam.c b/svr-authpam.c -index 05e4f3e5..d201bc96 100644 ---- a/svr-authpam.c -+++ b/svr-authpam.c -@@ -178,13 +178,14 @@ pamConvFunc(int num_msg, - * Keyboard interactive would be a lot nicer, but since PAM is synchronous, it - * gets very messy trying to send the interactive challenges, and read the - * interactive responses, over the network. */ --void svr_auth_pam() { -+void svr_auth_pam(int valid_user) { - - struct UserDataS userData = {NULL, NULL}; - struct pam_conv pamConv = { - pamConvFunc, - &userData /* submitted to pamvConvFunc as appdata_ptr */ - }; -+ const char* printable_user = NULL; - - pam_handle_t* pamHandlep = NULL; - -@@ -204,12 +205,23 @@ void svr_auth_pam() { - - password = buf_getstring(ses.payload, &passwordlen); - -+ /* We run the PAM conversation regardless of whether the username is valid -+ in case the conversation function has an inherent delay. -+ Use ses.authstate.username rather than ses.authstate.pw_name. -+ After PAM succeeds we then check the valid_user flag too */ -+ - /* used to pass data to the PAM conversation function - don't bother with - * strdup() etc since these are touched only by our own conversation - * function (above) which takes care of it */ -- userData.user = ses.authstate.pw_name; -+ userData.user = ses.authstate.username; - userData.passwd = password; - -+ if (ses.authstate.pw_name) { -+ printable_user = ses.authstate.pw_name; -+ } else { -+ printable_user = ""; -+ } -+ - /* Init pam */ - if ((rc = pam_start("sshd", NULL, &pamConv, &pamHandlep)) != PAM_SUCCESS) { - dropbear_log(LOG_WARNING, "pam_start() failed, rc=%d, %s", -@@ -242,7 +254,7 @@ void svr_auth_pam() { - rc, pam_strerror(pamHandlep, rc)); - dropbear_log(LOG_WARNING, - "Bad PAM password attempt for '%s' from %s", -- ses.authstate.pw_name, -+ printable_user, - svr_ses.addrstring); - send_msg_userauth_failure(0, 1); - goto cleanup; -@@ -253,12 +265,18 @@ void svr_auth_pam() { - rc, pam_strerror(pamHandlep, rc)); - dropbear_log(LOG_WARNING, - "Bad PAM password attempt for '%s' from %s", -- ses.authstate.pw_name, -+ printable_user, - svr_ses.addrstring); - send_msg_userauth_failure(0, 1); - goto cleanup; - } - -+ if (!valid_user) { -+ /* PAM auth succeeded but the username isn't allowed in for another reason -+ (checkusername() failed) */ -+ send_msg_userauth_failure(0, 1); -+ } -+ - /* successful authentication */ - dropbear_log(LOG_NOTICE, "PAM password auth succeeded for '%s' from %s", - ses.authstate.pw_name, -diff --git a/svr-authpasswd.c b/svr-authpasswd.c -index bdee2aa1..69c7d8af 100644 ---- a/svr-authpasswd.c -+++ b/svr-authpasswd.c -@@ -48,22 +48,14 @@ static int constant_time_strcmp(const char* a, const char* b) { - - /* Process a password auth request, sending success or failure messages as - * appropriate */ --void svr_auth_password() { -+void svr_auth_password(int valid_user) { - - char * passwdcrypt = NULL; /* the crypt from /etc/passwd or /etc/shadow */ - char * testcrypt = NULL; /* crypt generated from the user's password sent */ -- char * password; -+ char * password = NULL; - unsigned int passwordlen; -- - unsigned int changepw; - -- passwdcrypt = ses.authstate.pw_passwd; -- --#ifdef DEBUG_HACKCRYPT -- /* debugging crypt for non-root testing with shadows */ -- passwdcrypt = DEBUG_HACKCRYPT; --#endif -- - /* check if client wants to change password */ - changepw = buf_getbool(ses.payload); - if (changepw) { -@@ -73,12 +65,21 @@ void svr_auth_password() { - } - - password = buf_getstring(ses.payload, &passwordlen); -- -- /* the first bytes of passwdcrypt are the salt */ -- testcrypt = crypt(password, passwdcrypt); -+ if (valid_user) { -+ /* the first bytes of passwdcrypt are the salt */ -+ passwdcrypt = ses.authstate.pw_passwd; -+ testcrypt = crypt(password, passwdcrypt); -+ } - m_burn(password, passwordlen); - m_free(password); - -+ /* After we have got the payload contents we can exit if the username -+ is invalid. Invalid users have already been logged. */ -+ if (!valid_user) { -+ send_msg_userauth_failure(0, 1); -+ return; -+ } -+ - if (testcrypt == NULL) { - /* crypt() with an invalid salt like "!!" */ - dropbear_log(LOG_WARNING, "User account '%s' is locked", -diff --git a/svr-authpubkey.c b/svr-authpubkey.c -index aa6087c9..ff481c87 100644 ---- a/svr-authpubkey.c -+++ b/svr-authpubkey.c -@@ -79,7 +79,7 @@ static int checkfileperm(char * filename); - - /* process a pubkey auth request, sending success or failure message as - * appropriate */ --void svr_auth_pubkey() { -+void svr_auth_pubkey(int valid_user) { - - unsigned char testkey; /* whether we're just checking if a key is usable */ - char* algo = NULL; /* pubkey algo */ -@@ -102,6 +102,15 @@ void svr_auth_pubkey() { - keybloblen = buf_getint(ses.payload); - keyblob = buf_getptr(ses.payload, keybloblen); - -+ if (!valid_user) { -+ /* Return failure once we have read the contents of the packet -+ required to validate a public key. -+ Avoids blind user enumeration though it isn't possible to prevent -+ testing for user existence if the public key is known */ -+ send_msg_userauth_failure(0, 0); -+ goto out; -+ } -+ - /* check if the key is valid */ - if (checkpubkey(algo, algolen, keyblob, keybloblen) == DROPBEAR_FAILURE) { - send_msg_userauth_failure(0, 0); diff --git a/gnu/packages/ssh.scm b/gnu/packages/ssh.scm index f5e069ff05..bd26149872 100644 --- a/gnu/packages/ssh.scm +++ b/gnu/packages/ssh.scm @@ -451,18 +451,17 @@ TCP, not the SSH protocol.") (define-public dropbear (package (name "dropbear") - (version "2018.76") - (source (origin - (method url-fetch) - (uri (string-append - "https://matt.ucc.asn.au/dropbear/releases/" - "dropbear-" version ".tar.bz2")) - (patches (search-patches "dropbear-CVE-2018-15599.patch")) - (sha256 - (base32 - "0rgavbzw7jrs5wslxm0dnwx2m409yzxd9hazd92r7kx8xikr3yzj")))) + (version "2019.77") + (source + (origin + (method url-fetch) + (uri (string-append + "https://matt.ucc.asn.au/dropbear/releases/" + "dropbear-" version ".tar.bz2")) + (sha256 + (base32 "13a55fcy2mx2pvsfj6dh9107k4wnbd9ybdyi3w3ivgikwvmph7yr")))) (build-system gnu-build-system) - (arguments `(#:tests? #f)) ; there is no "make check" or anything similar + (arguments `(#:tests? #f)) ; there is no "make check" or anything similar ;; TODO: Investigate unbundling libtommath and libtomcrypt or at least ;; cherry-picking important bug fixes from them. See ;; for more information. -- cgit v1.2.3 From a9f847adc3f9e996a83bc1a572e9221d4d128def Mon Sep 17 00:00:00 2001 From: Pierre Langlois Date: Thu, 21 Mar 2019 00:22:00 +0000 Subject: gnu: libmygpo-qt: Move to new 'gpodder.scm' file. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/packages/music.scm (libmygpo-qt): Move to 'gpodder.scm'. * gnu/packages/gpodder.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. Signed-off-by: Ludovic Courtès --- gnu/local.mk | 1 + gnu/packages/gpodder.scm | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ gnu/packages/music.scm | 31 +-------------------------- 3 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 gnu/packages/gpodder.scm (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 594755f693..3f07629f4f 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -212,6 +212,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/gobby.scm \ %D%/packages/golang.scm \ %D%/packages/gperf.scm \ + %D%/packages/gpodder.scm \ %D%/packages/gprolog.scm \ %D%/packages/gps.scm \ %D%/packages/graph.scm \ diff --git a/gnu/packages/gpodder.scm b/gnu/packages/gpodder.scm new file mode 100644 index 0000000000..c0150402c4 --- /dev/null +++ b/gnu/packages/gpodder.scm @@ -0,0 +1,56 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2019 Pierre Langlois +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu packages gpodder) + #:use-module (guix download) + #:use-module (guix packages) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix build-system cmake) + #:use-module (gnu packages) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages qt)) + +(define-public libmygpo-qt + (package + (name "libmygpo-qt") + (version "1.1.0") + (source (origin + (method url-fetch) + (uri (string-append "http://stefan.derkits.at/files/" + "libmygpo-qt/libmygpo-qt." version ".tar.gz")) + (sha256 + (base32 + "1kg18qrq2rsswgzhl65r3mlyx7kpqg4wwnbp4yiv6svvmadmlxl2")) + (patches (search-patches "libmygpo-qt-fix-qt-5.11.patch" + "libmygpo-qt-missing-qt5-modules.patch")))) + (build-system cmake-build-system) + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("qt" ,qtbase))) + (arguments + `(#:configure-flags '("-DMYGPO_BUILD_TESTS=ON") + ;; TODO: Enable tests when https://github.com/gpodder/gpodder/issues/446 + ;; is fixed. + #:tests? #f)) + (home-page "http://wiki.gpodder.org/wiki/Libmygpo-qt") + (synopsis "Qt/C++ library wrapping the gpodder web service") + (description "@code{libmygpo-qt} is a Qt/C++ library wrapping the +@url{https://gpodder.net} APIs. It allows applications to discover, manage +and track podcasts.") + (license license:lgpl2.1+))) diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm index b93bcacfcd..5a2358f19a 100644 --- a/gnu/packages/music.scm +++ b/gnu/packages/music.scm @@ -88,6 +88,7 @@ #:use-module (gnu packages gl) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) + #:use-module (gnu packages gpodder) #:use-module (gnu packages graphics) #:use-module (gnu packages gstreamer) #:use-module (gnu packages gtk) @@ -4009,36 +4010,6 @@ OSC connections.") the electronic or dubstep genre.") (license license:gpl3+))) -(define-public libmygpo-qt - (package - (name "libmygpo-qt") - (version "1.1.0") - (source (origin - (method url-fetch) - (uri (string-append "http://stefan.derkits.at/files/" - "libmygpo-qt/libmygpo-qt." version ".tar.gz")) - (sha256 - (base32 - "1kg18qrq2rsswgzhl65r3mlyx7kpqg4wwnbp4yiv6svvmadmlxl2")) - (patches (search-patches "libmygpo-qt-fix-qt-5.11.patch" - "libmygpo-qt-missing-qt5-modules.patch")))) - (build-system cmake-build-system) - (native-inputs - `(("pkg-config" ,pkg-config))) - (inputs - `(("qt" ,qtbase))) - (arguments - `(#:configure-flags '("-DMYGPO_BUILD_TESTS=ON") - ;; TODO: Enable tests when https://github.com/gpodder/gpodder/issues/446 - ;; is fixed. - #:tests? #f)) - (home-page "http://wiki.gpodder.org/wiki/Libmygpo-qt") - (synopsis "Qt/C++ library wrapping the gpodder web service") - (description "@code{libmygpo-qt} is a Qt/C++ library wrapping the -@url{https://gpodder.net} APIs. It allows applications to discover, manage -and track podcasts.") - (license license:lgpl2.1+))) - (define-public sonivox-eas (package (name "sonivox-eas") -- cgit v1.2.3 From abc12b0d6ee61c6399993c8f0a7ed92841eb466a Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Sun, 24 Feb 2019 20:15:49 +0200 Subject: gnu: Add moarvm. * gnu/packages/perl6.scm (moarvm): New variable. --- gnu/local.mk | 3 +- gnu/packages/perl6.scm | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/perl6.scm (limited to 'gnu/local.mk') diff --git a/gnu/local.mk b/gnu/local.mk index 3f07629f4f..f957b8af62 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -10,7 +10,7 @@ # Copyright © 2016, 2017, 2018, 2019 Ricardo Wurmus # Copyright © 2016 Ben Woodcroft # Copyright © 2016, 2017, 2018, 2019 Alex Vong -# Copyright © 2016, 2017 Efraim Flashner +# Copyright © 2016, 2017, 2018, 2019 Efraim Flashner # Copyright © 2016, 2017 Jan Nieuwenhuizen # Copyright © 2017, 2018, 2019 Tobias Geerinckx-Rice # Copyright © 2017, 2018 Clément Lassieur @@ -365,6 +365,7 @@ GNU_SYSTEM_MODULES = \ %D%/packages/perl-check.scm \ %D%/packages/perl-compression.scm \ %D%/packages/perl-web.scm \ + %D%/packages/perl6.scm \ %D%/packages/photo.scm \ %D%/packages/phabricator.scm \ %D%/packages/php.scm \ diff --git a/gnu/packages/perl6.scm b/gnu/packages/perl6.scm new file mode 100644 index 0000000000..6a5fa32ecc --- /dev/null +++ b/gnu/packages/perl6.scm @@ -0,0 +1,96 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2019 Efraim Flashner +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu packages perl6) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix download) + #:use-module (guix packages) + #:use-module (guix build-system perl) + #:use-module (gnu packages bdw-gc) + #:use-module (gnu packages libevent) + #:use-module (gnu packages libffi) + #:use-module (gnu packages multiprecision) + #:use-module (gnu packages pkg-config)) + +(define-public moarvm + (package + (name "moarvm") + (version "2019.03") + (source + (origin + (method url-fetch) + (uri (string-append "https://moarvm.org/releases/MoarVM-" + version ".tar.gz")) + (sha256 + (base32 + "017w1zvr6yl0cgjfc1b3ddlc6vjw9q8p7alw1vvsckw95190xc14")) + (modules '((guix build utils))) + (snippet + '(begin + ;(delete-file-recursively "3rdparty/dynasm") ; JIT + (delete-file-recursively "3rdparty/dyncall") + (delete-file-recursively "3rdparty/freebsd") + (delete-file-recursively "3rdparty/libatomicops") + (delete-file-recursively "3rdparty/libuv") + (delete-file-recursively "3rdparty/libtommath") + (delete-file-recursively "3rdparty/msinttypes") + #t)))) + (build-system perl-build-system) + (arguments + '(#:phases + (modify-phases %standard-phases + (replace 'configure + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (pkg-config (assoc-ref inputs "pkg-config"))) + (setenv "LDFLAGS" (string-append "-Wl,-rpath=" out "/lib")) + (invoke "perl" "Configure.pl" + "--prefix" out + "--pkgconfig" (string-append pkg-config "/bin/pkg-config") + "--has-libtommath" + "--has-libatomic_ops" + "--has-libffi" + "--has-libuv"))))))) + (home-page "https://moarvm.org/") + ;; These should be inputs but moar.h can't find them when building rakudo + (propagated-inputs + `(("libatomic-ops" ,libatomic-ops) + ("libtommath" ,libtommath-1.0) + ("libuv" ,libuv))) + (inputs + `(("libffi" ,libffi))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (synopsis "VM for NQP And Rakudo Perl 6") + (description + "Short for \"Metamodel On A Runtime\", MoarVM is a modern virtual machine +built for the Rakudo Perl 6 compiler and the NQP Compiler Toolchain. Highlights +include: + +@itemize +@item Great Unicode support, with strings represented at grapheme level +@item Dynamic analysis of running code to identify hot functions and loops, and +perform a range of optimizations, including type specialization and inlining +@item Support for threads, a range of concurrency control constructs, and +asynchronous sockets, timers, processes, and more +@item Generational, parallel, garbage collection +@item Support for numerous language features, including first class functions, +exceptions, continuations, runtime loading of code, big integers and interfacing +with native libraries. +@end itemize") + (license license:artistic2.0))) -- cgit v1.2.3