mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Add more specialization for marshaling integers.
This decreases the core image size by about 16.5k.
This commit is contained in:
		| @@ -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: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose