Integer type behind macros

This commit is contained in:
K. Lange 2021-01-14 09:15:44 +09:00
parent 9015176bbb
commit 976db6f954
5 changed files with 23 additions and 11 deletions

View File

@ -439,7 +439,7 @@ static void number(int canAssign) {
}
/* If we got here, it's an integer of some sort. */
long value = strtol(start, NULL, base);
krk_integer_type value = parseStrInt(start, NULL, base);
emitConstant(INTEGER_VAL(value));
}

View File

@ -4,6 +4,18 @@
#include <stddef.h>
#include <stdlib.h>
#ifdef __EMSCRIPTEN__
typedef long long krk_integer_type;
#define PRIkrk_int "%lld"
#define PRIkrk_hex "%llx"
#define parseStrInt strtoll
#else
typedef long krk_integer_type;
#define PRIkrk_int "%ld"
#define PRIkrk_hex "%lx"
#define parseStrInt strtol
#endif
#ifdef DEBUG
#define ENABLE_DISASSEMBLY
#define ENABLE_TRACING

View File

@ -30,7 +30,7 @@ void krk_freeValueArray(KrkValueArray * array) {
void krk_printValue(FILE * f, KrkValue printable) {
if (!IS_OBJECT(printable)) {
switch (printable.type) {
case VAL_INTEGER: fprintf(f, "%ld", AS_INTEGER(printable)); break;
case VAL_INTEGER: fprintf(f, PRIkrk_int, AS_INTEGER(printable)); break;
case VAL_BOOLEAN: fprintf(f, "%s", AS_BOOLEAN(printable) ? "True" : "False"); break;
case VAL_FLOATING: fprintf(f, "%g", AS_FLOATING(printable)); break;
case VAL_NONE: fprintf(f, "None"); break;
@ -47,7 +47,7 @@ void krk_printValue(FILE * f, KrkValue printable) {
} else if (AS_INTEGER(printable) == 0) {
fprintf(f, "{unset default}");
} else {
fprintf(f, "{sentinel=%ld}",AS_INTEGER(printable));
fprintf(f, "{sentinel=" PRIkrk_int "}",AS_INTEGER(printable));
}
break;
}

View File

@ -26,7 +26,7 @@ typedef struct {
KrkValueType type;
union {
char boolean;
long integer;
krk_integer_type integer;
double floating;
KrkJumpTarget handler;
KrkObj * object;

14
vm.c
View File

@ -1262,7 +1262,7 @@ KrkValue krk_callSimple(KrkValue value, int argCount, int isMethod) {
} else if (result == 1) {
return krk_runNext();
}
krk_runtimeError(vm.exceptions.typeError, "Invalid internal method call.");
krk_runtimeError(vm.exceptions.typeError, "Invalid internal method call: %d ('%s')", result, krk_typeName(value));
return NONE_VAL();
}
@ -1460,7 +1460,7 @@ static KrkValue _int_to_floating(int argc, KrkValue argv[]) {
/* int.__chr__() */
static KrkValue _int_to_char(int argc, KrkValue argv[]) {
long value = AS_INTEGER(argv[0]);
krk_integer_type value = AS_INTEGER(argv[0]);
unsigned char out[5] = {0};
if (value > 0xFFFF) {
out[0] = (0xF0 | (value >> 18));
@ -1619,7 +1619,7 @@ static KrkValue _string_int(int argc, KrkValue argv[]) {
base = 8;
start += 2;
}
long value = strtol(start, NULL, base);
krk_integer_type value = parseStrInt(start, NULL, base);
return INTEGER_VAL(value);
}
@ -2557,7 +2557,7 @@ static KrkValue _module_repr(int argc, KrkValue argv[]) {
*/
static KrkValue _int_to_str(int argc, KrkValue argv[]) {
char tmp[100];
size_t l = sprintf(tmp, "%ld", (long)AS_INTEGER(argv[0]));
size_t l = sprintf(tmp, PRIkrk_int, (krk_integer_type)AS_INTEGER(argv[0]));
return OBJECT_VAL(krk_copyString(tmp, l));
}
@ -2698,8 +2698,8 @@ static KrkValue _hex(int argc, KrkValue argv[]) {
return NONE_VAL();
}
char tmp[20];
long x = AS_INTEGER(argv[0]);
size_t len = sprintf(tmp, "%s0x%lx", x < 0 ? "-" : "", x < 0 ? -x : x);
krk_integer_type x = AS_INTEGER(argv[0]);
size_t len = sprintf(tmp, "%s0x" PRIkrk_hex, x < 0 ? "-" : "", x < 0 ? -x : x);
return OBJECT_VAL(krk_copyString(tmp,len));
}
@ -2724,7 +2724,7 @@ static KrkValue _tuple_iter_call(int argc, KrkValue argv[]) {
KrkTuple * myTuple = self->_internal;
KrkValue t = myTuple->values.values[0]; /* Tuple to iterate */
KrkValue i = myTuple->values.values[1]; /* Index value */
if (AS_INTEGER(i) >= (long int)AS_TUPLE(t)->values.count) {
if (AS_INTEGER(i) >= (krk_integer_type)AS_TUPLE(t)->values.count) {
return argv[0];
} else {
myTuple->values.values[1] = INTEGER_VAL(AS_INTEGER(i)+1);