# HG changeset patch # User Paul Boddie # Date 1480782884 -3600 # Node ID 3a519b510333b3891110587bf2ce47a2b20cf3f6 # Parent eb828fda0a2fda5d8ab0a01097a60097e09972ae Fixed int serialisation to string again. Also added maxint and minint accessors. diff -r eb828fda0a2f -r 3a519b510333 lib/native.py --- a/lib/native.py Sat Dec 03 17:16:15 2016 +0100 +++ b/lib/native.py Sat Dec 03 17:34:44 2016 +0100 @@ -31,6 +31,11 @@ def _is(x, y): pass def _is_not(x, y): pass +# Limit definition. + +def _get_maxint(): pass +def _get_minint(): pass + # Integer operations. def _int_add(self, other): pass diff -r eb828fda0a2f -r 3a519b510333 lib/sys.py --- a/lib/sys.py Sat Dec 03 17:16:15 2016 +0100 +++ b/lib/sys.py Sat Dec 03 17:34:44 2016 +0100 @@ -19,7 +19,12 @@ this program. If not, see . """ -from native import _exit, _get_argv, _get_path +import native + +# Limits. + +maxint = native._get_maxint() +minint = native._get_minint() # Standard streams. @@ -29,12 +34,12 @@ # NOTE: Environment details to be implemented. -argv = _get_argv() -path = _get_path() +argv = native._get_argv() +path = native._get_path() # Functions to be implemented natively. def exit(status=0): - _exit(int(status)) + native._exit(int(status)) # vim: tabstop=4 expandtab shiftwidth=4 diff -r eb828fda0a2f -r 3a519b510333 templates/native.c --- a/templates/native.c Sat Dec 03 17:16:15 2016 +0100 +++ b/templates/native.c Sat Dec 03 17:34:44 2016 +0100 @@ -103,6 +103,20 @@ return x->value != y->value ? __builtins___boolean_True : __builtins___boolean_False; } +__attr __fn_native__get_maxint(__attr __args[]) +{ + __attr * const status = &__args[1]; + + return __new_int(INT_MAX); +} + +__attr __fn_native__get_minint(__attr __args[]) +{ + __attr * const status = &__args[1]; + + return __new_int(INT_MIN); +} + __attr __fn_native__int_add(__attr __args[]) { __attr * const _data = &__args[1]; @@ -332,10 +346,11 @@ __attr * const _data = &__args[1]; /* _data interpreted as int */ int i = _data->intvalue; - int n = i != 0 ? (int) ceil(log10(abs(i)+1)) + 1 : 2; + /* Employ a buffer big enough to fit the largest integer plus an extra + character, a minus sign, and the null terminator. */ + unsigned int n = (int) log10(INT_MAX) + 3; char *s = (char *) __ALLOCATE(n, sizeof(char)); - if (i < 0) n++; snprintf(s, n, "%d", i); /* Return a new string. */ diff -r eb828fda0a2f -r 3a519b510333 templates/native.h --- a/templates/native.h Sat Dec 03 17:16:15 2016 +0100 +++ b/templates/native.h Sat Dec 03 17:34:44 2016 +0100 @@ -10,6 +10,9 @@ __attr __fn_native__is(__attr __args[]); __attr __fn_native__is_not(__attr __args[]); +__attr __fn_native__get_maxint(__attr __args[]); +__attr __fn_native__get_minint(__attr __args[]); + __attr __fn_native__int_add(__attr __args[]); __attr __fn_native__int_div(__attr __args[]); __attr __fn_native__int_mod(__attr __args[]); diff -r eb828fda0a2f -r 3a519b510333 tests/numbers.py --- a/tests/numbers.py Sat Dec 03 17:16:15 2016 +0100 +++ b/tests/numbers.py Sat Dec 03 17:34:44 2016 +0100 @@ -1,3 +1,10 @@ +import sys + +print sys.maxint +print sys.minint + +print sys.maxint + sys.minint + i = 2 ** 30 print i # 1073741824