Moved implementation of safe make-vector to foreign-call.
This commit is contained in:
parent
4c16c8b340
commit
3056d26a9d
|
@ -1 +1 @@
|
||||||
1159
|
1160
|
||||||
|
|
|
@ -358,6 +358,14 @@
|
||||||
[(P len) (K #t)]
|
[(P len) (K #t)]
|
||||||
[(E len) (nop)])
|
[(E len) (nop)])
|
||||||
|
|
||||||
|
(define-primop make-vector safe
|
||||||
|
[(V len)
|
||||||
|
(with-tmp ([x (make-forcall "ikrt_make_vector1" (list (T len)))])
|
||||||
|
(interrupt-when (prm '= x (K 0)))
|
||||||
|
x)])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define-primop $vector-ref unsafe
|
(define-primop $vector-ref unsafe
|
||||||
[(V x i)
|
[(V x i)
|
||||||
(or
|
(or
|
||||||
|
|
|
@ -1055,6 +1055,36 @@ ikrt_getenv(ikp bv, ikpcb* pcb){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ikp
|
||||||
|
ikrt_make_vector1(ikp len, ikpcb* pcb){
|
||||||
|
if(is_fixnum(len) && (((int)len) >= 0)){
|
||||||
|
ikp s = ik_safe_alloc(pcb, align(((int)len) + disp_vector_data));
|
||||||
|
ref(s, 0) = len;
|
||||||
|
memset(s+disp_vector_data, 0, (int)len);
|
||||||
|
return s+vector_tag;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
ikp
|
||||||
|
ikrt_make_vector2(ikp len, ikp obj, ikpcb* pcb){
|
||||||
|
if(is_fixnum(len) && ((len >> 31)!=0)){
|
||||||
|
pcb->root0 = &obj;
|
||||||
|
ikp s = ik_safe_alloc(pcb, align(((int)len) + disp_vector_data));
|
||||||
|
pcb->root0 = 0;
|
||||||
|
ref(s, 0) = len;
|
||||||
|
|
||||||
|
memset(s+disp_vector_data, 0, (int)len);
|
||||||
|
return s+vector_tag;
|
||||||
|
} else {
|
||||||
|
return false_object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
ikp
|
ikp
|
||||||
ikrt_setenv(ikp key, ikp val, ikp overwrite){
|
ikrt_setenv(ikp key, ikp val, ikp overwrite){
|
||||||
fprintf(stderr, "setenv busted!\n");
|
fprintf(stderr, "setenv busted!\n");
|
||||||
|
|
Loading…
Reference in New Issue