Unified · Split
| @@ -1029,29 +1029,21 @@ mk_cbuiltin(const char *name, sl_builtinfn f) · 1028 unmodified lines | |||
| 1029 | sl_##name##type = pt; \ | 1029 | sl_##name##type = pt; \ |
| 1030 | }while(0) | 1030 | }while(0) |
| 1031 | 1031 | ||
| 1032 | #define RETURN_NUM_AS(var, type) return mk_##type(var) | ||
| 1033 | |||
| 1034 | sl_constfn | 1032 | sl_constfn |
| 1035 | sl_v | 1033 | sl_v |
| 1036 | return_from_u64(u64int Uaccum) | 1034 | return_from_u64(u64int u) |
| 1037 | { | 1035 | { |
| 1038 | if(fits_fixnum(Uaccum)) | 1036 | if(fits_fixnum(u)) |
| 1039 | return fixnum((sl_fx)Uaccum); | 1037 | return fixnum((sl_fx)u); |
| 1040 | if(sl_unlikely(Uaccum > (u64int)INT64_MAX)) | 1038 | return mk_u64(u); |
| 1041 | RETURN_NUM_AS(Uaccum, u64); | ||
| 1042 | if(Uaccum > (u64int)UINT32_MAX) | ||
| 1043 | RETURN_NUM_AS(Uaccum, s64); | ||
| 1044 | if(Uaccum > (u64int)INT32_MAX) | ||
| 1045 | RETURN_NUM_AS(Uaccum, u32); | ||
| 1046 | RETURN_NUM_AS(Uaccum, s32); | ||
| 1047 | } | 1039 | } |
| 1048 | 1040 | ||
| 1049 | sl_v | 1041 | sl_v |
| 1050 | return_from_s64(s64int Saccum) | 1042 | return_from_s64(s64int s) |
| 1051 | { | 1043 | { |
| 1052 | if(fits_fixnum(Saccum)) | 1044 | if(fits_fixnum(s)) |
| 1053 | return fixnum((sl_fx)Saccum); | 1045 | return fixnum((sl_fx)s); |
| 1054 | RETURN_NUM_AS(vtomp(Saccum, nil), bignum); | 1046 | return mk_bignum(vtomp(s, nil)); |
| 1055 | } | 1047 | } |
| 1056 | 1048 | ||
| 1057 | #define ACCUM_DEFAULT 0 | 1049 | #define ACCUM_DEFAULT 0 |
| @@ -1494,12 +1486,12 @@ BUILTIN("ash", ash) · 436 unmodified lines | |||
| 1494 | if(sl_unlikely(n < -63)) | 1486 | if(sl_unlikely(n < -63)) |
| 1495 | n = -63; | 1487 | n = -63; |
| 1496 | u >>= -n; | 1488 | u >>= -n; |
| 1497 | return fits_fixnum(u) ? fixnum(u) : return_from_u64(u); | 1489 | return return_from_u64(u); |
| 1498 | }else if(n >= 64 || uash_overflow_64(u, n, &u)){ | 1490 | }else if(n >= 64 || uash_overflow_64(u, n, &u)){ |
| 1499 | mp = uvtomp(u, nil); | 1491 | mp = uvtomp(u, nil); |
| 1500 | mpleft(mp, n, mp); | 1492 | mpleft(mp, n, mp); |
| 1501 | }else{ | 1493 | }else{ |
| 1502 | return fits_fixnum(u) ? fixnum(u) : return_from_u64(u); | 1494 | return return_from_u64(u); |
| 1503 | } | 1495 | } |
| 1504 | }else if(isfixnum(a) || isubnum(a)){ | 1496 | }else if(isfixnum(a) || isubnum(a)){ |
| 1505 | accum = isfixnum(a) ? numval(a) : ubnumval(a); | 1497 | accum = isfixnum(a) ? numval(a) : ubnumval(a); |
| @@ -1513,7 +1505,7 @@ signedshift: · 7 unmodified lines | |||
| 1513 | mp = vtomp(accum, nil); | 1505 | mp = vtomp(accum, nil); |
| 1514 | mpleft(mp, n, mp); | 1506 | mpleft(mp, n, mp); |
| 1515 | }else{ | 1507 | }else{ |
| 1516 | return fits_fixnum(accum) ? fixnum(accum) : return_from_s64(accum); | 1508 | return return_from_s64(accum); |
| 1517 | } | 1509 | } |
| 1518 | } | 1510 | } |
| 1519 | if(mp != nil){ | 1511 | if(mp != nil){ |