mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-24 06:49:02 +00:00
Make improvements
- Get mprotect_test working on aarch64 - Get completion working on python.com repl again - Improve quality of printvideo.com and printimage.com - Fix bug in openpty() so examples/script.c works again
This commit is contained in:
parent
b94b29d79c
commit
61b9677c05
11 changed files with 107 additions and 134 deletions
|
@ -38,11 +38,11 @@
|
||||||
|
|
||||||
signed char g_magikarp[8];
|
signed char g_magikarp[8];
|
||||||
const signed char kMagikarp[8][8] = {
|
const signed char kMagikarp[8][8] = {
|
||||||
{-1, -3, 3, 17, 17, 3, -3, -1}, /* 1331+161 derived w/ one off cas */
|
{-1, -1, 3, 15, 15, 3, -1, -1}, // magic kernel sharp
|
||||||
{-1, -3, 6, 28, 6, -3, -1, 0}, /* no due to the convolution theorem? */
|
{-1, -3, 6, 28, 6, -3, -1, 0}, //
|
||||||
{0, 0, -11, 53, -11, 0, 0, 0}, /* no plus, some random experimenting */
|
{0, 0, -11, 53, -11, 0, 0, 0}, //
|
||||||
{-2, -6, 2, 22, 22, 2, -6, -2}, /* one a line please clang-format? */
|
{-2, -6, 2, 22, 22, 2, -6, -2}, //
|
||||||
{-3, -9, 1, 27, 27, 1, -9, -3},
|
{-3, -9, 1, 27, 27, 1, -9, -3}, //
|
||||||
};
|
};
|
||||||
|
|
||||||
signed char g_magkern[8];
|
signed char g_magkern[8];
|
||||||
|
|
|
@ -99,7 +99,7 @@ int openpty(int *mfd, int *sfd, char *name, //
|
||||||
return efault();
|
return efault();
|
||||||
}
|
}
|
||||||
BLOCK_CANCELLATIONS;
|
BLOCK_CANCELLATIONS;
|
||||||
rc = openpty(mfd, sfd, name, tio, wsz);
|
rc = openpty_impl(mfd, sfd, name, tio, wsz);
|
||||||
ALLOW_CANCELLATIONS;
|
ALLOW_CANCELLATIONS;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,8 @@
|
||||||
*/
|
*/
|
||||||
int mprotect(void *addr, size_t size, int prot) {
|
int mprotect(void *addr, size_t size, int prot) {
|
||||||
int64_t rc;
|
int64_t rc;
|
||||||
if (SupportsWindows() && (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC |
|
if (prot &
|
||||||
PROT_GROWSDOWN | PROT_GROWSUP))) {
|
~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_GROWSDOWN | PROT_GROWSUP)) {
|
||||||
errno = EINVAL; // unix checks prot before checking size
|
errno = EINVAL; // unix checks prot before checking size
|
||||||
rc = -1;
|
rc = -1;
|
||||||
} else if (!size) {
|
} else if (!size) {
|
||||||
|
|
|
@ -70,7 +70,7 @@ int __cxa_atexit(void *, void *, void *) libcesque;
|
||||||
int atfork(void *, void *) libcesque;
|
int atfork(void *, void *) libcesque;
|
||||||
int atexit(void (*)(void)) libcesque;
|
int atexit(void (*)(void)) libcesque;
|
||||||
char *getenv(const char *) nosideeffect libcesque;
|
char *getenv(const char *) nosideeffect libcesque;
|
||||||
int putenv(char *) paramsnonnull();
|
int putenv(char *);
|
||||||
int setenv(const char *, const char *, int);
|
int setenv(const char *, const char *, int);
|
||||||
int unsetenv(const char *);
|
int unsetenv(const char *);
|
||||||
int clearenv(void);
|
int clearenv(void);
|
||||||
|
|
|
@ -32,7 +32,7 @@ struct lconv {
|
||||||
|
|
||||||
int wcwidth(wchar_t) pureconst;
|
int wcwidth(wchar_t) pureconst;
|
||||||
int wcswidth(const wchar_t *, size_t) strlenesque;
|
int wcswidth(const wchar_t *, size_t) strlenesque;
|
||||||
int wcsnwidth(const wchar_t *, size_t, int) strlenesque;
|
int wcsnwidth(const wchar_t *, size_t, size_t) strlenesque;
|
||||||
struct lconv *localeconv(void);
|
struct lconv *localeconv(void);
|
||||||
|
|
||||||
COSMOPOLITAN_C_END_
|
COSMOPOLITAN_C_END_
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
/**
|
/**
|
||||||
* Returns monospace display width of wide character string.
|
* Returns monospace display width of wide character string.
|
||||||
*/
|
*/
|
||||||
int wcsnwidth(const wchar_t *pwcs, size_t n, int o) {
|
int wcsnwidth(const wchar_t *pwcs, size_t n, size_t o) {
|
||||||
int w, width = 0;
|
int w, width = 0;
|
||||||
for (; *pwcs && n-- > 0; pwcs++) {
|
for (; *pwcs && n-- > 0; pwcs++) {
|
||||||
if ((w = wcwidth(*pwcs)) < 0) {
|
if ((w = wcwidth(*pwcs)) < 0) {
|
||||||
|
|
|
@ -23,9 +23,9 @@
|
||||||
#include "libc/fmt/bing.internal.h"
|
#include "libc/fmt/bing.internal.h"
|
||||||
#include "libc/log/check.h"
|
#include "libc/log/check.h"
|
||||||
#include "libc/math.h"
|
#include "libc/math.h"
|
||||||
|
#include "libc/mem/gc.internal.h"
|
||||||
#include "libc/mem/mem.h"
|
#include "libc/mem/mem.h"
|
||||||
#include "libc/nexgen32e/x86feature.h"
|
#include "libc/nexgen32e/x86feature.h"
|
||||||
#include "libc/mem/gc.internal.h"
|
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#include "libc/testlib/ezbench.h"
|
#include "libc/testlib/ezbench.h"
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
|
@ -124,21 +124,21 @@ TEST(magikarp, testHalfYX) {
|
||||||
Magikarp2xX(32, 61, M, 16, 61);
|
Magikarp2xX(32, 61, M, 16, 61);
|
||||||
EXPECT_STREQ(u"\n\
|
EXPECT_STREQ(u"\n\
|
||||||
nooppppqqqqqqqqqqqqqqqqqpppooon\n\
|
nooppppqqqqqqqqqqqqqqqqqpppooon\n\
|
||||||
opppqqqqqppppoppoppppqqqqqppppo\n\
|
opppqqqqqpppppoooppppqqqqqppppo\n\
|
||||||
ppqqqqpppooooommmoooopppqqqqppp\n\
|
ppqqqqpppoooonnnnnooopppqqqqppp\n\
|
||||||
pqqqppponmmllllllllmmmnpppqqqqp\n\
|
pqqqppponnmllllllllmnnnoppqqqqp\n\
|
||||||
qqqppoomllllllllllllllmnoppqqqq\n\
|
qqqppoommlllllllllllllmnoppqqqq\n\
|
||||||
qqppoomlllllllmmmllllllmnoppqqq\n\
|
qqpponmllllllmmmmllllllmnoppqqq\n\
|
||||||
qppponlllllmoqttspnlllllmnoppqq\n\
|
qppponlllllmoqttspolllllmnoppqq\n\
|
||||||
qpponmllllmosyzz{vqnllllmmoppqq\n\
|
qpponmllllmosxzzyvqnllllmmoppqq\n\
|
||||||
qpponmllllmorwzzyupnllllmmoppqq\n\
|
qpponmllllmorwyyyupnllllmmoppqq\n\
|
||||||
qqpponlllllloprrqomlllllmnoppqq\n\
|
qqpponllllllnprrqomlllllmnoppqq\n\
|
||||||
qqpponnmlllllllllllllllmnnppqqq\n\
|
qqpponnmlllllllllllllllmnnppqqq\n\
|
||||||
qqqppponmlllllllllllllnooppqqqp\n\
|
qqqppponmllllllllllllmmooppqqqp\n\
|
||||||
pqqqqpppoommmlllllmmmoopppqqqpp\n\
|
pqqqqppoonmmmlllllmmnoopppqqqpp\n\
|
||||||
pppqqqqpppooooooooooppppqqqqppp\n\
|
pppqqqqpppooooooooooopppqqqqppp\n\
|
||||||
oopppqqqqqqpppppppppqqqqqqpppoo\n\
|
oopppqqqqqqpppppppppqqqqqqpppoo\n\
|
||||||
noopopppqqqqqqqqqqqqqqqppoooonn",
|
noooopppqqqqqqqqqqqqqqqppoooonn",
|
||||||
gc(bingblit(32, 61, M, 16, 31)));
|
gc(bingblit(32, 61, M, 16, 31)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,15 +16,15 @@
|
||||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||||
|
#include "dsp/scale/scale.h"
|
||||||
#include "dsp/core/c1331.h"
|
#include "dsp/core/c1331.h"
|
||||||
#include "dsp/core/c161.h"
|
#include "dsp/core/c161.h"
|
||||||
#include "dsp/core/core.h"
|
#include "dsp/core/core.h"
|
||||||
#include "dsp/core/half.h"
|
#include "dsp/core/half.h"
|
||||||
#include "dsp/scale/scale.h"
|
|
||||||
#include "libc/fmt/bing.internal.h"
|
#include "libc/fmt/bing.internal.h"
|
||||||
#include "libc/macros.internal.h"
|
#include "libc/macros.internal.h"
|
||||||
#include "libc/mem/mem.h"
|
|
||||||
#include "libc/mem/gc.internal.h"
|
#include "libc/mem/gc.internal.h"
|
||||||
|
#include "libc/mem/mem.h"
|
||||||
#include "libc/stdio/stdio.h"
|
#include "libc/stdio/stdio.h"
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#include "libc/testlib/ezbench.h"
|
#include "libc/testlib/ezbench.h"
|
||||||
|
@ -196,41 +196,23 @@ pqpppppppppppppppppoooooooooooooooooooooooppppppppppppppppprp",
|
||||||
Magikarp2xY(32, 61, M[0], 32, 61);
|
Magikarp2xY(32, 61, M[0], 32, 61);
|
||||||
AbsoluteDifference(16, 61, D[0], 16, 61, G[0], 16, 61, M[0]);
|
AbsoluteDifference(16, 61, D[0], 16, 61, G[0], 16, 61, M[0]);
|
||||||
EXPECT_STREQ(u"\n\
|
EXPECT_STREQ(u"\n\
|
||||||
pnpppppppppppppppoooooooooooooooooooooooooooppppppppppppppprp\n\
|
popppppppppppppppooooooonnnnnnnnnnnnnooooooopppppppppppppppqp\n\
|
||||||
ppppppppppooooonnnnmmmmmmmmmmmmmmmmmmmmmmmnnnnooooopppppppppp\n\
|
ppppppppppooooonnnnnmmmmmmmmmmmmmmmmmmmmmnnnnnooooopppppppppp\n\
|
||||||
ppppppoononnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnonoopppppp\n\
|
ppppppoononnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnonoopppppp\n\
|
||||||
pppoononnmmmmmmmmmmmmmmmmmnnnnnnnnnmmmmmmmmmmmmmmmmmnnonooppp\n\
|
pppoononnmmmmmmmmmmmmmmmmmnnnnnnnnnmmmmmmmmmmmmmmmmmnnonooppp\n\
|
||||||
poonnnnmmmmmmmmmmmnnnnoooppppqqqppppooonnnnmmmmmmmmmmmnnnnoop\n\
|
poonnnnmmmmmmmmmmmnnnnoooppppqqqppppooonnnnmmmmmmmmmmmnnnnoop\n\
|
||||||
oonnnnmmmmmmmmmnooppqqrrsstttttttttssrrqqppoonmmmmmmmmmnnnnoo\n\
|
oonnnnmmmmmmmmmnooppqqrrsstttttttttssrrqqppoonmmmmmmmmmnnnnoo\n\
|
||||||
onnnnmmmmmmmnnnoppqrsttuvvwwwwwwwwwvvuttsrqpponnnmmmmmmmnnnno\n\
|
onnnnmmmmmmmnnnoppqqsttuvvwwwwwwwwwvvuttsqqpponnnmmmmmmmnnnno\n\
|
||||||
onnnmmmmmmmmnnoopqrsttuvwwxxyyyyyxxwwvuttsrqpoonnmmmmmmmmnnno\n\
|
onnnmmmmmmmmnnoopqrsttuvwwxxyyyyyxxwwvuttsrqpoonnmmmmmmmmnnno\n\
|
||||||
onnnmmmmmmmmnnoopqrsstuvwwxxyyyyyxxwwvutssrqpoonnmmmmmmmmnnno\n\
|
onnnmmmmmmmmnnoopqrsstuvwwxxyyyyyxxwwvutssrqpoonnmmmmmmmmnnno\n\
|
||||||
oonnnmmmmmmmmnnoopprrsttuuvvwwwwwvvuuttsrrppoonnmmmmmmmmnnnoo\n\
|
oonnnmmmmmmmmnnoopprrsttuuvvwwwwwvvuuttsrrppoonnmmmmmmmmnnnoo\n\
|
||||||
ooonnmmmmmmmmmmmnoopoqqqrrsssssssssrrqqqopoonmmmmmmmmmmmnnooo\n\
|
ooonnmmmmmmmmmmmnoopoqqqrrsssssssssrrqqqopoonmmmmmmmmmmmnnooo\n\
|
||||||
pooonnnmmmmmmmmmmmmmnnnnoooopppppoooonnnnmmmmmmmmmmmmmnnnooop\n\
|
pooonnnmmmmmmmmmmmnmnnnoopoopppppoopoonnnmnmmmmmmmmmmmnnnooop\n\
|
||||||
ppppoononnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnonoopppp\n\
|
ppppoononnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnonoopppp\n\
|
||||||
pppppppoonoonnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnoonooppppppp\n\
|
pppppppoonoonnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnoonooppppppp\n\
|
||||||
pppppppppppoooooonnnnmmmmmmmmmmmmmmmmmmmnnnnooooooppppppppppp\n\
|
pppppppppppoooooonnnnnnmmmmmmmmmmmmmmmnnnnnnooooooppppppppppp\n\
|
||||||
pqpppppppppppppppppoooooooooooooooooooooooppppppppppppppppprp",
|
pqpppppppppppppppppoooooooooooooooooooooooppppppppppppppppprp",
|
||||||
gc(bingblit(16, 61, M[0], 16, 61)));
|
gc(bingblit(16, 61, M[0], 16, 61)));
|
||||||
EXPECT_STREQ(u"\n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
☺ ☺ ☺ ☺ \n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
☺ ☺ ☺ ☺ \n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
☺☺ ☺☺ ☺ \n\
|
|
||||||
",
|
|
||||||
gc(bingblit(16, 61, D[0], 16, 61)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Magikarp2xX, testDecimateX) {
|
TEST(Magikarp2xX, testDecimateX) {
|
||||||
|
@ -274,7 +256,7 @@ ppppppppppooooooooooopppppppppp",
|
||||||
Magikarp2xX(32, 61, M[0], 32, 61);
|
Magikarp2xX(32, 61, M[0], 32, 61);
|
||||||
EXPECT_STREQ(u"\n\
|
EXPECT_STREQ(u"\n\
|
||||||
pppppppppoooooooooooooppppppppp\n\
|
pppppppppoooooooooooooppppppppp\n\
|
||||||
nppppppooonnnnnnnnnnooooppppprp\n\
|
oppppppooonnnnnnnnnnoooopppppqp\n\
|
||||||
pppppooonnnnmmmmmmnnnnooopppppp\n\
|
pppppooonnnnmmmmmmnnnnooopppppp\n\
|
||||||
ppppooonnnmmmmmmmmmmmnnnooppppp\n\
|
ppppooonnnmmmmmmmmmmmnnnooppppp\n\
|
||||||
pppoonnnmmmmmmmmmmmmmmmnnoopppp\n\
|
pppoonnnmmmmmmmmmmmmmmmnnoopppp\n\
|
||||||
|
@ -286,13 +268,13 @@ oonnmmmmnoopqqrrqqpponmmmmmnnoo\n\
|
||||||
onnmmmmmnopqrsssssrqpnnmmmmnnoo\n\
|
onnmmmmmnopqrsssssrqpnnmmmmnnoo\n\
|
||||||
onmmmmmnopqstuuuutsrqoommmmmnoo\n\
|
onmmmmmnopqstuuuutsrqoommmmmnoo\n\
|
||||||
onnmmmmnpqrtuvvvvvtsrponmmmmnno\n\
|
onnmmmmnpqrtuvvvvvtsrponmmmmnno\n\
|
||||||
onmmmmnnpqtuvwxxwwutsponmmmmmno\n\
|
onmmmmnopqsuvwxxwwutsqonmmmmmno\n\
|
||||||
onmmmmnoqrsvwxyyxxvurronmmmmmno\n\
|
onmmmmnoqrsuwxyyxwvusqpnmmmmmno\n\
|
||||||
onmmmmnopstvwxyyyxwutronmmmmmno\n\
|
onmmmmnopstvwxyyyxvusrpnmmmmmno\n\
|
||||||
onmmmmnopssvwxyyyxwtsronmmmmmno\n\
|
onmmmmnoprtvwxyyyxwtsrpnmmmmmno\n\
|
||||||
onmmmmnopqtuvxxxxwvurqpnmmmmmno\n\
|
onmmmmnoprtuvxxxxwvtrqpnmmmmmno\n\
|
||||||
onmmmmmnorsuvwwwwvutrqonmmmmmno\n\
|
onmmmmmnpqstvwwwwvutrqonmmmmmno\n\
|
||||||
onmmmmmnoqrstuvvvutrqpnnmmmmnoo\n\
|
onmmmmmnoqrstuvvvutrqponmmmmnoo\n\
|
||||||
onmmmmmnnoqrsttttssqponmmmmmnoo\n\
|
onmmmmmnnoqrsttttssqponmmmmmnoo\n\
|
||||||
oonmmmmmnooqrrrrrrqpoommmmmmnoo\n\
|
oonmmmmmnooqrrrrrrqpoommmmmmnoo\n\
|
||||||
oonmmmmmnnnoppqqqpponnmmmmmnooo\n\
|
oonmmmmmnnnoppqqqpponnmmmmmnooo\n\
|
||||||
|
@ -307,40 +289,6 @@ qpppppppoooonnnnnnnoooopppppprp\n\
|
||||||
ppppppppppooooooooooopppppppppp",
|
ppppppppppooooooooooopppppppppp",
|
||||||
gc(bingblit(32, 61, M[0], 32, 31)));
|
gc(bingblit(32, 61, M[0], 32, 31)));
|
||||||
AbsoluteDifference(32, 31, D, 32, 31, G[0], 32, 61, M[0]);
|
AbsoluteDifference(32, 31, D, 32, 31, G[0], 32, 61, M[0]);
|
||||||
EXPECT_STREQ(u"\n\
|
|
||||||
\n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
☺ ☺ ☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺☺☺ \n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
☺☺☺ \n\
|
|
||||||
\n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
☺ ☺ ☺ \n\
|
|
||||||
☺ ☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
☺ \n\
|
|
||||||
\n\
|
|
||||||
\n\
|
|
||||||
",
|
|
||||||
gc(bingblit(32, 31, D, 32, 31)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(magikarp_vs_gyarados, testHalf) {
|
TEST(magikarp_vs_gyarados, testHalf) {
|
||||||
|
@ -352,22 +300,22 @@ TEST(magikarp_vs_gyarados, testHalf) {
|
||||||
Magikarp2xX(32, 61, M[0], 16, 61);
|
Magikarp2xX(32, 61, M[0], 16, 61);
|
||||||
AbsoluteDifference(16, 31, D, 16, 31, G[0], 32, 61, M[0]);
|
AbsoluteDifference(16, 31, D, 16, 31, G[0], 32, 61, M[0]);
|
||||||
EXPECT_STREQ(u"\n\
|
EXPECT_STREQ(u"\n\
|
||||||
oppppppppooooooooooooopppppppqp\n\
|
pppppppppooonnnnnnooooppppppppp\n\
|
||||||
pppppooonnmmmmmmmmmmmnnoopppppp\n\
|
pppppooonnmmmmmmmmmmnnnoopppppp\n\
|
||||||
ppponnmmmmmmmmmmmmmmmmmmnnnpppp\n\
|
ppponnmmmmmmmmmmmmmmmmmmnnopppp\n\
|
||||||
ppnommmmmmmmmnnnnnmmmmmmmmnoopp\n\
|
pponmmmmmmmmmnnnnnmmmmmmmmnoopp\n\
|
||||||
pnnnmmmmmnnoppqqpponnnmmmmmnnop\n\
|
pnnnmmmmmnnoppqqpponnnmmmmmnnop\n\
|
||||||
onnmmmmmopqrstttttsrqpnmmmmnnoo\n\
|
onnmmmmnopqrstttttsrqpnmmmmnnoo\n\
|
||||||
onnmmmnnpqtuvwwwwwutsponmmmmnno\n\
|
onnmmmnopqsuvwwwwwutrponmmmmnno\n\
|
||||||
onmmmmnopstvwxyyyxwutronmmmmmno\n\
|
onmmmmnopstvwxyyyxvusrpnmmmmmno\n\
|
||||||
onmmmmnopssvwxyyyxwtsronmmmmmno\n\
|
onmmmmnoprtvwxyyyxwtsrpnmmmmmno\n\
|
||||||
onmmmmmooqstuvwwwvusrponmmmmnoo\n\
|
onmmmmmooqstuvwwwvusrponmmmmnoo\n\
|
||||||
oommmmmmnopqrsssssqqpommmmmmnoo\n\
|
oommmmmmnopqrsssssrqponmmmmmnoo\n\
|
||||||
ponmmmmmmmnnoopppoonnmmmmmmnoop\n\
|
ponmmmmmmnnopoppooonnmmmmmmnoop\n\
|
||||||
ppoonmmmmmmmmmmmmmmmmmmmmmonppp\n\
|
ppoonmmmmmmmmmmmmmmmmmmmmmnoppp\n\
|
||||||
ppppnonmmmmmmmmmmmmmmmmmooopppp\n\
|
ppppoonmmmmmmmmmmmmmmmmmooopppp\n\
|
||||||
ppppppooonnmmmmmmmmmnnooopppppp\n\
|
ppppppooonnnmmmmmmmnnnooopppppp\n\
|
||||||
qpppppppppoooooooooooppppppppqp",
|
ppppppppppoooooooooooppppppppqp",
|
||||||
gc(bingblit(32, 61, M[0], 16, 31)));
|
gc(bingblit(32, 61, M[0], 16, 31)));
|
||||||
EXPECT_STREQ(u"\n\
|
EXPECT_STREQ(u"\n\
|
||||||
ppppppppooooooooooooooopppppppp\n\
|
ppppppppooooooooooooooopppppppp\n\
|
||||||
|
@ -388,22 +336,22 @@ pppppooonnnmmmmmmmmmnnnoooppppp\n\
|
||||||
pppppppppoooooooooooooppppppppq",
|
pppppppppoooooooooooooppppppppq",
|
||||||
gc(bingblit(16, 31, G[0], 16, 31)));
|
gc(bingblit(16, 31, G[0], 16, 31)));
|
||||||
EXPECT_STREQ(u"\n\
|
EXPECT_STREQ(u"\n\
|
||||||
☺ ☺ ☺ ☺ \n\
|
☺ ☺☺☺☺☺☺ ☺ \n\
|
||||||
☺ ☺ ☺ \n\
|
☺ ☺ ☺ ☺ \n\
|
||||||
☺ ☺ ☺☺ \n\
|
☺ ☺ ☺ \n\
|
||||||
☺☺☺☺ ☺ ☺ \n\
|
☺ ☺ ☺ ☺ \n\
|
||||||
☺☺ ☺ ☺☺ ☺\n\
|
☺☺ ☺ ☺☺ ☺\n\
|
||||||
☺☺☺ ☺ ☺ ☺ ☺ \n\
|
☺☺ ☺ ☺ ☺ ☺ \n\
|
||||||
☺ ☺☺☺ ☺☺ ☺ ☺ \n\
|
☺ ☺ ☺☺ ☺☺☺ ☺ ☺ \n\
|
||||||
☺ ☺ ☺ ☺☺☺ \n\
|
☺ ☺ ☺ ☺ ☺ ☺☺ \n\
|
||||||
☺ ☺ ☺ ☺☺☺ \n\
|
☺☺ ☺ ☺☺ \n\
|
||||||
☺ ☺ ☺ ☺ ☺☺ \n\
|
☺ ☺ ☺ ☺ ☺☺ \n\
|
||||||
☺☺ ☺ ☺ ☺ \n\
|
☺☺ ☺ \n\
|
||||||
☺ ☺ ☺ ☺\n\
|
☺ ☺ ☺ ☺☺ ☺ ☺ ☺\n\
|
||||||
☺☺☺ \n\
|
☺ \n\
|
||||||
☺☺☺ ☺☺ ☺ \n\
|
☺ ☺ ☺☺ ☺ \n\
|
||||||
☺ ☺ ☺ ☺ \n\
|
☺ ☺ ☺ ☺ ☺ ☺ \n\
|
||||||
☺ ☺ ☺ ☺☺",
|
☺ ☺ ☺☺",
|
||||||
gc(bingblit(16, 31, D, 16, 31)));
|
gc(bingblit(16, 31, D, 16, 31)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,18 +35,36 @@
|
||||||
#include "libc/x/x.h"
|
#include "libc/x/x.h"
|
||||||
#include "third_party/xed/x86.h"
|
#include "third_party/xed/x86.h"
|
||||||
|
|
||||||
#ifdef __x86_64__
|
|
||||||
|
|
||||||
volatile bool gotsegv;
|
volatile bool gotsegv;
|
||||||
volatile bool gotbusted;
|
volatile bool gotbusted;
|
||||||
struct sigaction old[2];
|
struct sigaction old[2];
|
||||||
char testlib_enable_tmp_setup_teardown;
|
char testlib_enable_tmp_setup_teardown;
|
||||||
|
|
||||||
|
#ifdef __x86_64__
|
||||||
|
static const char kRet31337[] = {
|
||||||
|
0xb8, 0x69, 0x7a, 0x00, 0x00, // mov $31337,%eax
|
||||||
|
0xc3, // ret
|
||||||
|
};
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
static const uint32_t kRet31337[] = {
|
||||||
|
0x528f4d20, // mov w0,#31337
|
||||||
|
0xd65f03c0, // ret
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
#error "unsupported architecture"
|
||||||
|
#endif
|
||||||
|
|
||||||
void SkipOverFaultingInstruction(struct ucontext *ctx) {
|
void SkipOverFaultingInstruction(struct ucontext *ctx) {
|
||||||
|
#ifdef __x86_64__
|
||||||
struct XedDecodedInst xedd;
|
struct XedDecodedInst xedd;
|
||||||
xed_decoded_inst_zero_set_mode(&xedd, XED_MACHINE_MODE_LONG_64);
|
xed_decoded_inst_zero_set_mode(&xedd, XED_MACHINE_MODE_LONG_64);
|
||||||
xed_instruction_length_decode(&xedd, (void *)ctx->uc_mcontext.rip, 15);
|
xed_instruction_length_decode(&xedd, (void *)ctx->uc_mcontext.rip, 15);
|
||||||
ctx->uc_mcontext.rip += xedd.length;
|
ctx->uc_mcontext.rip += xedd.length;
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
ctx->uc_mcontext.pc += 4;
|
||||||
|
#else
|
||||||
|
#error "unsupported architecture"
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnSigSegv(int sig, struct siginfo *si, void *vctx) {
|
void OnSigSegv(int sig, struct siginfo *si, void *vctx) {
|
||||||
|
@ -125,7 +143,7 @@ TEST(mprotect, testSegfault_writeToReadOnlyAnonymous) {
|
||||||
TEST(mprotect, testExecOnly_canExecute) {
|
TEST(mprotect, testExecOnly_canExecute) {
|
||||||
char *p = _mapanon(FRAMESIZE);
|
char *p = _mapanon(FRAMESIZE);
|
||||||
void (*f)(void) = (void *)p;
|
void (*f)(void) = (void *)p;
|
||||||
p[0] = 0xC3; // RET
|
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||||
ASSERT_SYS(0, 0, mprotect(p, FRAMESIZE, PROT_EXEC | PROT_READ));
|
ASSERT_SYS(0, 0, mprotect(p, FRAMESIZE, PROT_EXEC | PROT_READ));
|
||||||
f();
|
f();
|
||||||
// On all supported platforms, PROT_EXEC implies PROT_READ. There is
|
// On all supported platforms, PROT_EXEC implies PROT_READ. There is
|
||||||
|
@ -146,11 +164,6 @@ TEST(mprotect, testProtNone_cantEvenRead) {
|
||||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char kRet31337[] = {
|
|
||||||
0xb8, 0x69, 0x7a, 0x00, 0x00, // mov $31337,%eax
|
|
||||||
0xc3, // ret
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST(mprotect, testExecJit_actuallyWorks) {
|
TEST(mprotect, testExecJit_actuallyWorks) {
|
||||||
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||||
memcpy(p, kRet31337, sizeof(kRet31337));
|
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||||
|
@ -163,6 +176,7 @@ TEST(mprotect, testExecJit_actuallyWorks) {
|
||||||
|
|
||||||
TEST(mprotect, testRwxMap_vonNeumannRules) {
|
TEST(mprotect, testRwxMap_vonNeumannRules) {
|
||||||
if (IsOpenbsd()) return; // boo
|
if (IsOpenbsd()) return; // boo
|
||||||
|
if (IsXnuSilicon()) return; // boo
|
||||||
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||||
memcpy(p, kRet31337, sizeof(kRet31337));
|
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
|
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
|
||||||
|
@ -216,5 +230,3 @@ TEST(mprotect, testZeroSize_doesNothing) {
|
||||||
EXPECT_FALSE(gotsegv);
|
EXPECT_FALSE(gotsegv);
|
||||||
EXPECT_FALSE(gotbusted);
|
EXPECT_FALSE(gotbusted);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __x86_64__ */
|
|
||||||
|
|
5
third_party/python/runpythonmodule.c
vendored
5
third_party/python/runpythonmodule.c
vendored
|
@ -215,7 +215,10 @@ Complete(const char *p, linenoiseCompletions *c)
|
||||||
static void
|
static void
|
||||||
TerminalCompletion(const char *p, linenoiseCompletions *c)
|
TerminalCompletion(const char *p, linenoiseCompletions *c)
|
||||||
{
|
{
|
||||||
// Complete(p, c);
|
PyGILState_STATE gilstate;
|
||||||
|
gilstate = PyGILState_Ensure();
|
||||||
|
Complete(p, c);
|
||||||
|
PyGILState_Release(gilstate);
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1533,6 +1533,7 @@ static void TryToOpenFrameBuffer(void) {
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
sigset_t wut;
|
sigset_t wut;
|
||||||
|
const char *s;
|
||||||
gamma_ = 2.4;
|
gamma_ = 2.4;
|
||||||
volscale_ -= 2;
|
volscale_ -= 2;
|
||||||
dither_ = true;
|
dither_ = true;
|
||||||
|
@ -1546,8 +1547,17 @@ int main(int argc, char *argv[]) {
|
||||||
if (!tuned_) PickDefaults();
|
if (!tuned_) PickDefaults();
|
||||||
if (optind == argc) PrintUsage(EX_USAGE, stderr);
|
if (optind == argc) PrintUsage(EX_USAGE, stderr);
|
||||||
patharg_ = argv[optind];
|
patharg_ = argv[optind];
|
||||||
sox_ = strdup(commandvenv("SOX", "sox"));
|
s = commandvenv("SOX", "sox");
|
||||||
ffplay_ = strdup(commandvenv("FFPLAY", "ffplay"));
|
sox_ = s ? strdup(s) : 0;
|
||||||
|
s = commandvenv("FFPLAY", "ffplay");
|
||||||
|
ffplay_ = s ? strdup(s) : 0;
|
||||||
|
if (!sox_ && !ffplay_) {
|
||||||
|
fprintf(stderr, "please install either the "
|
||||||
|
"`play` (sox) or "
|
||||||
|
"`ffplay` (ffmpeg) "
|
||||||
|
"commands, so printvideo.com can play audio\n");
|
||||||
|
usleep(10000);
|
||||||
|
}
|
||||||
infd_ = STDIN_FILENO;
|
infd_ = STDIN_FILENO;
|
||||||
outfd_ = STDOUT_FILENO;
|
outfd_ = STDOUT_FILENO;
|
||||||
if (!setjmp(jb_)) {
|
if (!setjmp(jb_)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue