1
0
mirror of https://github.com/janet-lang/janet synced 2024-12-26 08:20:27 +00:00

Add more specialization for marshaling integers.

This decreases the core image size by about 16.5k.
This commit is contained in:
Calvin Rose 2019-02-08 10:12:25 -05:00
parent fe27df528c
commit 114a45306d

View File

@ -124,15 +124,20 @@ JanetTable *janet_env_lookup(JanetTable *env) {
/* Marshal an integer onto the buffer */ /* Marshal an integer onto the buffer */
static void pushint(MarshalState *st, int32_t x) { static void pushint(MarshalState *st, int32_t x) {
if (x >= 0 && x < 200) { if (x >= 0 && x < 128) {
janet_buffer_push_u8(st->buf, x); janet_buffer_push_u8(st->buf, x);
} else if (x <= 8191 && x >= -8192) {
uint8_t intbuf[2];
intbuf[0] = ((x >> 8) & 0x3F) | 0x80;
intbuf[1] = x & 0xFF;
janet_buffer_push_bytes(st->buf, intbuf, 2);
} else { } else {
uint8_t intbuf[5]; uint8_t intbuf[5];
intbuf[0] = LB_INTEGER; intbuf[0] = LB_INTEGER;
intbuf[1] = x & 0xFF; intbuf[1] = (x >> 24) & 0xFF;
intbuf[2] = (x >> 8) & 0xFF; intbuf[2] = (x >> 16) & 0xFF;
intbuf[3] = (x >> 16) & 0xFF; intbuf[3] = (x >> 8) & 0xFF;
intbuf[4] = (x >> 24) & 0xFF; intbuf[4] = x & 0xFF;
janet_buffer_push_bytes(st->buf, intbuf, 5); janet_buffer_push_bytes(st->buf, intbuf, 5);
} }
} }
@ -548,14 +553,19 @@ static int32_t readint(UnmarshalState *st, const uint8_t **atdata) {
const uint8_t *data = *atdata; const uint8_t *data = *atdata;
int32_t ret; int32_t ret;
if (data >= st->end) longjmp(st->err, UMR_EOS); if (data >= st->end) longjmp(st->err, UMR_EOS);
if (*data < 200) { if (*data < 128) {
ret = *data++; ret = *data++;
} else if (*data < 192) {
if (data + 2 > st->end) longjmp(st->err, UMR_EOS);
ret = ((data[0] & 0x3F) << 8) + data[1];
ret = ((ret << 18) >> 18);
data += 2;
} else if (*data == LB_INTEGER) { } else if (*data == LB_INTEGER) {
if (data + 5 > st->end) longjmp(st->err, UMR_EOS); if (data + 5 > st->end) longjmp(st->err, UMR_EOS);
ret = (data[1]) | ret = (data[1] << 24) |
(data[2] << 8) | (data[2] << 16) |
(data[3] << 16) | (data[3] << 8) |
(data[4] << 24); data[4];
data += 5; data += 5;
} else { } else {
longjmp(st->err, UMR_EXPECTED_INTEGER); longjmp(st->err, UMR_EXPECTED_INTEGER);
@ -910,8 +920,8 @@ static const uint8_t *unmarshal_one(
EXTRA(1); EXTRA(1);
lead = data[0]; lead = data[0];
if (lead < 200) { if (lead < 200) {
*out = janet_wrap_integer(lead); *out = janet_wrap_integer(readint(st, &data));
return data + 1; return data;
} }
switch (lead) { switch (lead) {
case LB_NIL: case LB_NIL: