Bladeren bron

Fix accessing cons by switching to a long

This ensures it has the same size as pointers (64 bits) on amd64, which
fixes the pointer "conversion" and arithmetic in C.
Lucas Stadler 8 jaren geleden
bovenliggende
commit
9d653c5c87
1 gewijzigde bestanden met toevoegingen van 18 en 21 verwijderingen
  1. 18 21
      scm/inc/driver.c

+ 18 - 21
scm/inc/driver.c

@ -23,30 +23,27 @@
23 23
24 24
#define MAX_MEMORY (1 << 20)
25 25
26
int scheme_entry(int *memory);
27
28
int print_hex(int i) {
29
	printf("0x%x\n", i);
30
	return i;
31
}
32
33
void print_value(int *val) {
34
	if ((*val & fixnum_mask) == fixnum_tag) {
35
		printf("%d", *val >> fixnum_shift);
36
	} else if ((*val & char_mask) == char_tag) {
37
		printf("#\\%c", *val >> char_shift);
38
	} else if ((*val & boolean_mask) == boolean_tag) {
39
		printf("#%s", (*val >> boolean_shift) == 1 ? "t" : "f");
40
	} else if (*val == empty_list) {
26
typedef long ptr;
27
28
ptr scheme_entry(int *heap);
29
30
void print_value(ptr val) {
31
	if ((val & fixnum_mask) == fixnum_tag) {
32
		printf("%d", (int)val >> fixnum_shift);
33
	} else if ((val & char_mask) == char_tag) {
34
		printf("#\\%c", (int)val >> char_shift);
35
	} else if ((val & boolean_mask) == boolean_tag) {
36
		printf("#%s", (val >> boolean_shift) == 1 ? "t" : "f");
37
	} else if (val == empty_list) {
41 38
		printf("()");
42
	} else if ((*val & cons_mask) == cons_tag) {
39
	} else if ((val & cons_mask) == cons_tag) {
43 40
		printf("(");
44
		printf("?");
41
		print_value(*(int*)(val-1));
45 42
		printf(" ");
46
		printf("?");
43
		print_value(*(int*)(val+3));
47 44
		printf(")");
48 45
	} else {
49
		printf("\nError: unhandled value: %d 0x%x 0x%p\n", *val, *val, val);
46
		printf("\nError: unhandled value: %d 0x%x 0x%p\n", (int)val, (int)val, (int*)val);
50 47
		exit(1);
51 48
	}
52 49
}
@ -58,8 +55,8 @@ int main(int argc, char **argv) {
58 55
		exit(1);
59 56
	}
60 57
	memset(mem, 0, MAX_MEMORY * sizeof(int));
61
	int val = scheme_entry(mem);
62
	print_value(&val);
58
	ptr val = scheme_entry(mem);
59
	print_value(val);
63 60
	printf("\n");
64 61
	return 0;
65 62
}