LIBPATH = -L/usr/X11R6/lib
ifdef DEBUG
- CFLAGS = -g
+ CFLAGS = -g -std=gnu99
STRIP = touch
else
CFLAGS = -Wall -O3 -ffast-math -std=gnu99 $(SITE_CFLAGS)
: %prologue ( n -- )
\ stack-reserve set stack-reg stack-increment SUB ;
-: %epilogue ( -- )
- stack-reg stack-increment ADD ;
+: %epilogue ( -- ) stack-reg stack-increment ADD ;
IN: temporary
-USING: errors compiler test namespaces sequences kernel-internals ;
+USING: errors compiler test namespaces sequences
+kernel-internals kernel math ;
+
+: nice-stack-trace
+ error-stack-trace get symbolic-stack-trace [ second ] map ;
: foo 3 throw 7 ;
: bar foo 4 ;
: baz bar 5 ;
\ baz compile
[ 3 ] [ [ baz ] catch ] unit-test
-[ { foo bar baz } ] [
- error-stack-trace get symbolic-stack-trace
- [ second ] map [ ] subset
+[ { foo bar baz } ] [ nice-stack-trace ] unit-test
+
+: bleh [ 3 + ] map [ 0 > ] subset ;
+\ bleh compile
+
+: stack-trace-contains? nice-stack-trace memq? ;
+
+[ t ] [
+ [ { 1 "hi" } bleh ] catch drop \ + stack-trace-contains?
+] unit-test
+
+[ f t ] [
+ [ { C{ 1 2 } } bleh ] catch drop
+ \ + stack-trace-contains?
+ \ > stack-trace-contains?
] unit-test
.globl MANGLE(native_stack_pointer)
MANGLE(native_stack_pointer):
mov %rsp,%rax
- add $8,%rax
ret
void *native_stack_pointer(void);
-typedef struct _F_STACK_FRAME {
- struct _F_STACK_FRAME *previous;
- CELL return_address;
-} F_STACK_FRAME;
+typedef CELL F_STACK_FRAME;
-#define PREVIOUS_FRAME(frame) (frame->previous)
-#define RETURN_ADDRESS(frame) (frame->return_address)
+#define PREVIOUS_FRAME(frame) (frame + 1)
+#define RETURN_ADDRESS(frame) (*(frame))
GROWABLE_ADD(array,cell);
}
- if(PREVIOUS_FRAME(frame) <= frame)
+ F_STACK_FRAME *prev = PREVIOUS_FRAME(frame);
+
+ if(prev <= frame)
{
fprintf(stderr,"*** Unusual C stack layout (why?)\n");
fflush(stderr);
break;
}
- frame = PREVIOUS_FRAME(frame);
+ frame = prev;
}
GROWABLE_TRIM(array);
/* size is in bytes this time */
F_ARRAY *allot_byte_array(F_FIXNUM size)
{
- F_FIXNUM byte_size = (F_FIXNUM)(size + sizeof(CELL) - 1)
- / (F_FIXNUM)sizeof(CELL);
+ if(size < 0)
+ {
+ general_error(ERROR_NEGATIVE_ARRAY_SIZE,allot_integer(size),F,true);
+ return NULL;
+ }
+
+ CELL byte_size = (size + sizeof(CELL) - 1) / sizeof(CELL);
return allot_array(BYTE_ARRAY_TYPE,byte_size,0);
}