Sfoglia il codice sorgente

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 anni fa
parent
commit
9d653c5c87
1 ha cambiato i file con 18 aggiunte e 21 eliminazioni
  1. 18 21
      scm/inc/driver.c

+ 18 - 21
scm/inc/driver.c

23
23
24
#define MAX_MEMORY (1 << 20)
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
		printf("()");
38
		printf("()");
42
	} else if ((*val & cons_mask) == cons_tag) {
39
	} else if ((val & cons_mask) == cons_tag) {
43
		printf("(");
40
		printf("(");
44
		printf("?");
41
		print_value(*(int*)(val-1));
45
		printf(" ");
42
		printf(" ");
46
		printf("?");
43
		print_value(*(int*)(val+3));
47
		printf(")");
44
		printf(")");
48
	} else {
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
		exit(1);
47
		exit(1);
51
	}
48
	}
52
}
49
}
58
		exit(1);
55
		exit(1);
59
	}
56
	}
60
	memset(mem, 0, MAX_MEMORY * sizeof(int));
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
	printf("\n");
60
	printf("\n");
64
	return 0;
61
	return 0;
65
}
62
}