mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-06 14:58:50 +00:00
fix bug with strings; Now passes all the tests
This commit is contained in:
parent
516a3e190b
commit
aac34c34ea
1 changed files with 23 additions and 1 deletions
|
|
@ -228,6 +228,10 @@ extern void* Barray (int n, ...) {
|
||||||
return r->contents;
|
return r->contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int __IS_VALID_HEAP_POINTER(size_t *p);
|
||||||
|
extern int __IN_PASSIVE_SPACE(size_t * p);
|
||||||
|
extern int __IS_FORWARD_PTR(size_t * p);
|
||||||
|
|
||||||
extern void* Bsexp (int n, ...) {
|
extern void* Bsexp (int n, ...) {
|
||||||
va_list args = (va_list) BOX (NULL);
|
va_list args = (va_list) BOX (NULL);
|
||||||
int i = BOX(0);
|
int i = BOX(0);
|
||||||
|
|
@ -243,6 +247,7 @@ extern void* Bsexp (int n, ...) {
|
||||||
#endif
|
#endif
|
||||||
r = (sexp*) alloc (sizeof(int) * (n+1));
|
r = (sexp*) alloc (sizeof(int) * (n+1));
|
||||||
d = &(r->contents);
|
d = &(r->contents);
|
||||||
|
r->tag = 0;
|
||||||
|
|
||||||
d->tag = SEXP_TAG | ((n-1) << 3);
|
d->tag = SEXP_TAG | ((n-1) << 3);
|
||||||
|
|
||||||
|
|
@ -250,6 +255,13 @@ extern void* Bsexp (int n, ...) {
|
||||||
|
|
||||||
for (i=0; i<n-1; i++) {
|
for (i=0; i<n-1; i++) {
|
||||||
ai = va_arg(args, int);
|
ai = va_arg(args, int);
|
||||||
|
|
||||||
|
p = (size_t*) ai;
|
||||||
|
if (!UNBOXED(p) && __IN_PASSIVE_SPACE(p) && __IS_FORWARD_PTR((size_t*)*(p-1))){
|
||||||
|
printf ("Bsexp: %p\n", p);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
((int*)d->contents)[i] = ai;
|
((int*)d->contents)[i] = ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -456,6 +468,16 @@ static void gc_swap_spaces (void) {
|
||||||
# define IS_FORWARD_PTR(p) \
|
# define IS_FORWARD_PTR(p) \
|
||||||
(!UNBOXED(p) && IN_PASSIVE_SPACE(p))
|
(!UNBOXED(p) && IN_PASSIVE_SPACE(p))
|
||||||
|
|
||||||
|
int __IS_VALID_HEAP_POINTER(size_t *p) {
|
||||||
|
return IS_VALID_HEAP_POINTER(p);
|
||||||
|
}
|
||||||
|
int __IN_PASSIVE_SPACE(size_t * p) {
|
||||||
|
return IN_PASSIVE_SPACE(p);
|
||||||
|
}
|
||||||
|
int __IS_FORWARD_PTR(size_t * p) {
|
||||||
|
return IS_FORWARD_PTR(p);
|
||||||
|
}
|
||||||
|
|
||||||
extern size_t * gc_copy (size_t *obj);
|
extern size_t * gc_copy (size_t *obj);
|
||||||
|
|
||||||
static void copy_elements (size_t *where, size_t *from, int len) {
|
static void copy_elements (size_t *where, size_t *from, int len) {
|
||||||
|
|
@ -559,7 +581,7 @@ extern size_t * gc_copy (size_t *obj) {
|
||||||
*copy = d->tag;
|
*copy = d->tag;
|
||||||
copy++;
|
copy++;
|
||||||
d->tag = (int) copy;
|
d->tag = (int) copy;
|
||||||
strcpy (©[1], (char*) obj);
|
strcpy (©[0], (char*) obj);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SEXP_TAG :
|
case SEXP_TAG :
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue