mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	added (u)int64 typed arrays back
This commit is contained in:
		| @@ -156,19 +156,7 @@ static bi_uint64 check_bi_uint64(Janet x) { | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* C API */ | ||||||
| static Janet make_bi_int64(Janet x) { |  | ||||||
|     bi_int64 *box = (bi_int64 *)janet_abstract(&bi_int64_type, sizeof(bi_int64)); |  | ||||||
|     *box = check_bi_int64(x); |  | ||||||
|     return janet_wrap_abstract(box); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static Janet make_bi_uint64(Janet x) { |  | ||||||
|     bi_uint64 *box = (bi_uint64 *)janet_abstract(&bi_uint64_type, sizeof(bi_uint64)); |  | ||||||
|     *box = check_bi_uint64(x); |  | ||||||
|     return janet_wrap_abstract(box); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| JanetBigintType janet_is_bigint(Janet x) { | JanetBigintType janet_is_bigint(Janet x) { | ||||||
|     if (!janet_checktype(x, JANET_ABSTRACT)) return JANET_BIGINT_TYPE_none; |     if (!janet_checktype(x, JANET_ABSTRACT)) return JANET_BIGINT_TYPE_none; | ||||||
| @@ -176,17 +164,38 @@ JanetBigintType janet_is_bigint(Janet x) { | |||||||
|     return (at ==  &bi_int64_type) ? JANET_BIGINT_TYPE_int64 : ((at ==  &bi_uint64_type) ? JANET_BIGINT_TYPE_uint64 : JANET_BIGINT_TYPE_none); |     return (at ==  &bi_int64_type) ? JANET_BIGINT_TYPE_int64 : ((at ==  &bi_uint64_type) ? JANET_BIGINT_TYPE_uint64 : JANET_BIGINT_TYPE_none); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | Janet janet_bigint_int64(int64_t x) { | ||||||
|  |     bi_int64 *box = (bi_int64 *)janet_abstract(&bi_int64_type, sizeof(bi_int64)); | ||||||
|  |     *box = (bi_int64)x; | ||||||
|  |     return janet_wrap_abstract(box); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Janet janet_bigint_uint64(uint64_t x) { | ||||||
|  |     bi_uint64 *box = (bi_uint64 *)janet_abstract(&bi_uint64_type, sizeof(bi_uint64)); | ||||||
|  |     *box = (bi_uint64)x; | ||||||
|  |     return janet_wrap_abstract(box); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int64_t janet_checkbigint_int64(Janet x) { | ||||||
|  |     return (int64_t)check_bi_int64(x); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint64_t janet_checkbigint_uint64(Janet x) { | ||||||
|  |     return (uint64_t)check_bi_uint64(x); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static Janet cfun_bi_int64_new(int32_t argc, Janet *argv) { | static Janet cfun_bi_int64_new(int32_t argc, Janet *argv) { | ||||||
|     janet_fixarity(argc, 1); |     janet_fixarity(argc, 1); | ||||||
|     return make_bi_int64(argv[0]); |     return janet_bigint_int64(check_bi_int64(argv[0])); | ||||||
| } | } | ||||||
|  |  | ||||||
| static Janet cfun_bi_uint64_new(int32_t argc, Janet *argv) { | static Janet cfun_bi_uint64_new(int32_t argc, Janet *argv) { | ||||||
|     janet_fixarity(argc, 1); |     janet_fixarity(argc, 1); | ||||||
|     return make_bi_uint64(argv[0]); |     return janet_bigint_uint64(check_bi_uint64(argv[0])); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #define OPMETHOD(type,name,oper) \ | #define OPMETHOD(type,name,oper) \ | ||||||
| static Janet cfun_##type##_##name(int32_t argc, Janet *argv) { \ | static Janet cfun_##type##_##name(int32_t argc, Janet *argv) { \ | ||||||
|     janet_arity(argc, 2, -1); \ |     janet_arity(argc, 2, -1); \ | ||||||
|   | |||||||
| @@ -37,6 +37,10 @@ typedef uint32_t ta_uint32_t; | |||||||
| typedef int32_t ta_int32_t; | typedef int32_t ta_int32_t; | ||||||
| typedef float ta_float32_t; | typedef float ta_float32_t; | ||||||
| typedef double ta_float64_t; | typedef double ta_float64_t; | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  | typedef uint64_t ta_uint64_t; | ||||||
|  | typedef int64_t ta_int64_t; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static char *ta_type_names[] = { | static char *ta_type_names[] = { | ||||||
|     "uint8", |     "uint8", | ||||||
| @@ -45,6 +49,10 @@ static char *ta_type_names[] = { | |||||||
|     "int16", |     "int16", | ||||||
|     "uint32", |     "uint32", | ||||||
|     "int32", |     "int32", | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  |     "uint64", | ||||||
|  |     "int64", | ||||||
|  | #endif | ||||||
|     "float32", |     "float32", | ||||||
|     "float64", |     "float64", | ||||||
|     "any" |     "any" | ||||||
| @@ -57,6 +65,10 @@ static size_t ta_type_sizes[] = { | |||||||
|     sizeof(ta_int16_t), |     sizeof(ta_int16_t), | ||||||
|     sizeof(ta_uint32_t), |     sizeof(ta_uint32_t), | ||||||
|     sizeof(ta_int32_t), |     sizeof(ta_int32_t), | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  |     sizeof(ta_uint64_t), | ||||||
|  |     sizeof(ta_int64_t), | ||||||
|  | #endif | ||||||
|     sizeof(ta_float32_t), |     sizeof(ta_float32_t), | ||||||
|     sizeof(ta_float64_t), |     sizeof(ta_float64_t), | ||||||
|     0 |     0 | ||||||
| @@ -191,6 +203,23 @@ static Janet ta_get_##type(void *p, Janet key) { \ | |||||||
|   return value; \ |   return value; \ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #define DEFINE_VIEW_GETTER_BIGINT(type) \ | ||||||
|  | static Janet ta_get_##type(void *p, Janet key) { \ | ||||||
|  |   Janet value;  \ | ||||||
|  |   size_t index; \ | ||||||
|  |   if (!janet_checksize(key))      \ | ||||||
|  |     janet_panic("expected size as key");     \ | ||||||
|  |   index = (size_t)janet_unwrap_number(key);\ | ||||||
|  |   TA_View_##type *array=(TA_View_##type *)p; \ | ||||||
|  |   if (index >= array->size) { \ | ||||||
|  |     value = janet_wrap_nil(); \ | ||||||
|  |   } else { \ | ||||||
|  |     value = janet_bigint_##type(array->data[index*array->stride]); \ | ||||||
|  |   } \ | ||||||
|  |   return value; \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #define DEFINE_VIEW_SETTER(type) \ | #define DEFINE_VIEW_SETTER(type) \ | ||||||
| void ta_put_##type(void *p, Janet key,Janet value) { \ | void ta_put_##type(void *p, Janet key,Janet value) { \ | ||||||
|   size_t index;\ |   size_t index;\ | ||||||
| @@ -206,6 +235,20 @@ void ta_put_##type(void *p, Janet key,Janet value) { \ | |||||||
|   array->data[index*array->stride]=(ta_##type##_t)janet_unwrap_number(value); \ |   array->data[index*array->stride]=(ta_##type##_t)janet_unwrap_number(value); \ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #define DEFINE_VIEW_SETTER_BIGINT(type) \ | ||||||
|  | void ta_put_##type(void *p, Janet key,Janet value) { \ | ||||||
|  |   size_t index;\ | ||||||
|  |   if (!janet_checksize(key))\ | ||||||
|  |     janet_panic("expected size as key"); \ | ||||||
|  |   index = (size_t)janet_unwrap_number(key); \ | ||||||
|  |   TA_View_##type *array=(TA_View_##type *)p; \ | ||||||
|  |   if (index >= array->size) { \ | ||||||
|  |     janet_panic("index out of bounds"); \ | ||||||
|  |   } \ | ||||||
|  |   array->data[index*array->stride]=(ta_##type##_t)janet_checkbigint_##type(value); \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #define DEFINE_VIEW_INITIALIZER(thetype) \ | #define DEFINE_VIEW_INITIALIZER(thetype) \ | ||||||
|   static JanetTArrayView *ta_init_##thetype(JanetTArrayView *view, \ |   static JanetTArrayView *ta_init_##thetype(JanetTArrayView *view, \ | ||||||
|           JanetTArrayBuffer *buf, size_t size, \ |           JanetTArrayBuffer *buf, size_t size, \ | ||||||
| @@ -236,18 +279,30 @@ DEFINE_VIEW_GETTER(type)  \ | |||||||
| DEFINE_VIEW_SETTER(type) \ | DEFINE_VIEW_SETTER(type) \ | ||||||
| DEFINE_VIEW_INITIALIZER(type) | DEFINE_VIEW_INITIALIZER(type) | ||||||
|  |  | ||||||
|  | #define BUILD_TYPE_BIGINT(type) \ | ||||||
|  | DEFINE_VIEW_TYPE(type)   \ | ||||||
|  | DEFINE_VIEW_GETTER_BIGINT(type)  \ | ||||||
|  | DEFINE_VIEW_SETTER_BIGINT(type) \ | ||||||
|  | DEFINE_VIEW_INITIALIZER(type) | ||||||
|  |  | ||||||
| BUILD_TYPE(uint8) | BUILD_TYPE(uint8) | ||||||
| BUILD_TYPE(int8) | BUILD_TYPE(int8) | ||||||
| BUILD_TYPE(uint16) | BUILD_TYPE(uint16) | ||||||
| BUILD_TYPE(int16) | BUILD_TYPE(int16) | ||||||
| BUILD_TYPE(uint32) | BUILD_TYPE(uint32) | ||||||
| BUILD_TYPE(int32) | BUILD_TYPE(int32) | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  | BUILD_TYPE_BIGINT(uint64) | ||||||
|  | BUILD_TYPE_BIGINT(int64) | ||||||
|  | #endif | ||||||
| BUILD_TYPE(float32) | BUILD_TYPE(float32) | ||||||
| BUILD_TYPE(float64) | BUILD_TYPE(float64) | ||||||
|  |  | ||||||
| #undef DEFINE_VIEW_TYPE | #undef DEFINE_VIEW_TYPE | ||||||
| #undef DEFINE_VIEW_GETTER | #undef DEFINE_VIEW_GETTER | ||||||
| #undef DEFINE_VIEW_SETTER | #undef DEFINE_VIEW_SETTER | ||||||
|  | #undef DEFINE_VIEW_GETTER_BIGINT | ||||||
|  | #undef DEFINE_VIEW_SETTER_BIGINT | ||||||
| #undef DEFINE_VIEW_INITIALIZER | #undef DEFINE_VIEW_INITIALIZER | ||||||
|  |  | ||||||
| #define DEFINE_VIEW_ABSTRACT_TYPE(type) \ | #define DEFINE_VIEW_ABSTRACT_TYPE(type) \ | ||||||
| @@ -268,6 +323,10 @@ static const JanetAbstractType ta_array_types[] = { | |||||||
|     DEFINE_VIEW_ABSTRACT_TYPE(int16), |     DEFINE_VIEW_ABSTRACT_TYPE(int16), | ||||||
|     DEFINE_VIEW_ABSTRACT_TYPE(uint32), |     DEFINE_VIEW_ABSTRACT_TYPE(uint32), | ||||||
|     DEFINE_VIEW_ABSTRACT_TYPE(int32), |     DEFINE_VIEW_ABSTRACT_TYPE(int32), | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  |     DEFINE_VIEW_ABSTRACT_TYPE(uint64), | ||||||
|  |     DEFINE_VIEW_ABSTRACT_TYPE(int64), | ||||||
|  | #endif | ||||||
|     DEFINE_VIEW_ABSTRACT_TYPE(float32), |     DEFINE_VIEW_ABSTRACT_TYPE(float32), | ||||||
|     DEFINE_VIEW_ABSTRACT_TYPE(float64) |     DEFINE_VIEW_ABSTRACT_TYPE(float64) | ||||||
| }; | }; | ||||||
| @@ -308,6 +367,10 @@ JanetTArrayView *janet_tarray_view(JanetTArrayType type, size_t size, size_t str | |||||||
|             CASE_TYPE_INITIALIZE(int16); |             CASE_TYPE_INITIALIZE(int16); | ||||||
|             CASE_TYPE_INITIALIZE(uint32); |             CASE_TYPE_INITIALIZE(uint32); | ||||||
|             CASE_TYPE_INITIALIZE(int32); |             CASE_TYPE_INITIALIZE(int32); | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  |             CASE_TYPE_INITIALIZE(uint64); | ||||||
|  |             CASE_TYPE_INITIALIZE(int64); | ||||||
|  | #endif | ||||||
|             CASE_TYPE_INITIALIZE(float32); |             CASE_TYPE_INITIALIZE(float32); | ||||||
|             CASE_TYPE_INITIALIZE(float64); |             CASE_TYPE_INITIALIZE(float64); | ||||||
|         default : |         default : | ||||||
|   | |||||||
| @@ -1293,6 +1293,10 @@ typedef enum { | |||||||
|     JANET_TARRAY_TYPE_int16, |     JANET_TARRAY_TYPE_int16, | ||||||
|     JANET_TARRAY_TYPE_uint32, |     JANET_TARRAY_TYPE_uint32, | ||||||
|     JANET_TARRAY_TYPE_int32, |     JANET_TARRAY_TYPE_int32, | ||||||
|  | #ifdef JANET_BIGINT | ||||||
|  |     JANET_TARRAY_TYPE_uint64, | ||||||
|  |     JANET_TARRAY_TYPE_int64, | ||||||
|  | #endif | ||||||
|     JANET_TARRAY_TYPE_float32, |     JANET_TARRAY_TYPE_float32, | ||||||
|     JANET_TARRAY_TYPE_float64, |     JANET_TARRAY_TYPE_float64, | ||||||
|     JANET_TARRAY_TYPE_any, |     JANET_TARRAY_TYPE_any, | ||||||
| @@ -1330,7 +1334,10 @@ typedef enum { | |||||||
| } JanetBigintType; | } JanetBigintType; | ||||||
|  |  | ||||||
| JANET_API JanetBigintType janet_is_bigint(Janet x); | JANET_API JanetBigintType janet_is_bigint(Janet x); | ||||||
|  | JANET_API Janet janet_bigint_int64(int64_t x); | ||||||
|  | JANET_API Janet janet_bigint_uint64(uint64_t x); | ||||||
|  | JANET_API int64_t janet_checkbigint_int64(Janet x); | ||||||
|  | JANET_API uint64_t janet_checkbigint_uint64(Janet x); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 J.-F. Cap
					J.-F. Cap