+ native:\r
\r
+ERROR: I/O error: [ "primitive_read_line_fd_8" "Resource temporarily unavailable" ]\r
+\r
+- decide if overflow is a fatal error\r
- f >n: crashes\r
- typecases: type error reporting bad\r
- image output\r
- inspector: sort\r
- index of str\r
- accept: return socket, instead of printing msg\r
-- crash: [ primitives, ] with-image .\r
- enforce bottom-up in native bootstrap\r
\r
+ interactive:\r
$CC $CFLAGS -o f native/*.c
strip f
+
+#export CC=gcc
+#export CFLAGS="-pedantic -Wall -g"
+#
+#$CC $CFLAGS -o f-debug native/*.c
: object-tag BIN: 011 ;
: header-tag BIN: 100 ;
-: fixnum-mask HEX: 1fffffff ;
: immediate ( x tag -- tagged ) swap tag-bits shift< bitor ;
: >header ( id -- tagged ) header-tag immediate ;
dup pooled-object dup [
nip swap fixup
] [
- drop "Not in image: " swap cat2 throw
+ drop "Not in image: " swap word-name cat2 throw
] ifte ;
: fixup-words ( -- )
object-tag here-as swap
11 >header emit
dup str-length emit
- dup hashcode ( fixnum-mask bitand ) emit
+ dup hashcode emit
pack-string
pad ;
USE: kernel
USE: logic
USE: stack
+USE: vectors
: 2list ( a b -- [ a b ] )
#! Construct a proper list of 2 elements.
cons-hashcode r>
xor
] ifte ;
+
+: list>vector ( list -- vector )
+ dup length <vector> swap [ over vector-push ] each ;
+
+: stack>list ( vector -- list )
+ [ ] swap [ swons ] vector-each ;
+
+: vector>list ( vector -- list )
+ stack>list nreverse ;
: set-vector-length ( vector -- length )
"factor.FactorArray" "top" jvar-set ;
-: vector>list ( vector -- list )
- #! Turns a vector into a list.
- [ ] "factor.FactorArray" "toList" jinvoke ;
-
-: stack>list ( vector -- list )
- #! Turns a vector into a list.
- vector>list ;
-
-: list>vector ( list -- vector )
- [ "factor.Cons" ] "factor.FactorArray" jnew ;
-
: vector-nth ( index vector -- )
[ "int" ] "factor.FactorArray" "get" jinvoke ;
"/library/platform/native/prettyprint.factor"
"/library/platform/native/stack.factor"
"/library/platform/native/words.factor"
- "/library/platform/native/vectors.factor"
"/library/platform/native/vocabularies.factor"
"/library/platform/native/unparser.factor"
"/library/platform/native/cross-compiler.factor"
"Bad primitive: "
"Incompatible handle: "
"I/O error: "
+ "Overflow"
] ?nth ;
: ?kernel-error ( cons -- error# param )
drop (str>fixnum)
] ifte
] ifte ;
+
+: parse-number ( str -- num/f )
+ [ str>fixnum ] [ [ drop f ] when ] catch ;
USE: stack
USE: strings
USE: words
+USE: vectors
USE: vocabularies
USE: unparser
: f f parsed ; parsing
! Lists
-: [ f ; parsing
+: [ [ ] ; parsing
: ] nreverse parsed ; parsing
: | ( syntax: | cdr ] )
#! 'parsed' acts accordingly.
"|" ; parsing
+! Vectors
+: { f ; parsing
+: } nreverse list>vector parsed ; parsing
+
! Colon defs
+: CREATE: scan "in" get create ;
+
: :
#! Begin a word definition. Word name follows.
- scan "in" get create f ; parsing
+ CREATE: [ ] ; parsing
: ;
#! End a word definition.
nreverse define ; parsing
! Vocabularies
-: DEFER: scan "in" get create drop ; parsing
+: DEFER: CREATE: drop ; parsing
: USE: scan "use" cons@ ; parsing
: IN: scan dup "use" cons@ "in" set ; parsing
+++ /dev/null
-! :folding=indent:collapseFolds=1:
-
-! $Id$
-!
-! Copyright (C) 2004 Slava Pestov.
-!
-! Redistribution and use in source and binary forms, with or without
-! modification, are permitted provided that the following conditions are met:
-!
-! 1. Redistributions of source code must retain the above copyright notice,
-! this list of conditions and the following disclaimer.
-!
-! 2. Redistributions in binary form must reproduce the above copyright notice,
-! this list of conditions and the following disclaimer in the documentation
-! and/or other materials provided with the distribution.
-!
-! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-IN: vectors
-USE: lists
-USE: stack
-
-: stack>list ( vector -- list )
- [ ] swap [ swons ] vector-each ;
-
-: vector>list ( vector -- list )
- stack>list nreverse ;
IN: vectors
USE: arithmetic
USE: kernel
+USE: lists
USE: stack
: vector-empty? ( obj -- ? )
void fix_stacks(void)
{
- if(env.ds < env.ds_bot + sizeof(ARRAY))
+ if(UNDERFLOW(env.ds,env.ds_bot) || OVERFLOW(env.ds,env.ds_bot))
reset_datastack();
- if(env.cs <= env.cs_bot + sizeof(ARRAY))
+ if(UNDERFLOW(env.cs,env.cs_bot) || OVERFLOW(env.cs,env.cs_bot))
reset_callstack();
}
#define ERROR_BAD_PRIMITIVE (5<<3)
#define ERROR_HANDLE_INCOMPAT (6<<3)
#define ERROR_IO (7<<3)
+#define ERROR_OVERFLOW (8<<3)
void fatal_error(char* msg, CELL tagged);
void critical_error(char* msg, CELL tagged);
CELL tag = TAG(pointer);
CELL header, newpointer;
- if(in_zone(active,pointer))
- critical_error("copy_object given newspace ptr",pointer);
-
if(tag == FIXNUM_TYPE)
{
/* convinience */
+ gc_debug("FIXNUM",pointer);
return;
}
+ if(in_zone(active,pointer))
+ critical_error("copy_object given newspace ptr",pointer);
+
header = get(UNTAG(pointer));
if(TAG(header) == GC_COLLECTED)
break;
case HANDLE_TYPE:
collect_handle((HANDLE*)scan);
+ break;
}
scan += size;
#define UNDERFLOW_CHECKING
+#define UNDERFLOW(stack,bot) ((stack) < UNTAG(bot) + sizeof(ARRAY))
#define OVERFLOW(stack,bot) ((stack) >= UNTAG(bot) + object_size(bot))
INLINE void check_stacks(void)
#ifdef UNDERFLOW_CHECKING
if(OVERFLOW(env.ds,env.ds_bot))
- fatal_error("datastack overflow",env.ds);
+ general_error(ERROR_OVERFLOW,F);
if(OVERFLOW(env.cs,env.cs_bot))
- fatal_error("callstack overflow",env.ds);
+ general_error(ERROR_OVERFLOW,F);
#endif
}
case SBUF_TYPE:
size = sizeof(SBUF);
break;
+ case BIGNUM_TYPE:
+ size = sizeof(BIGNUM);
+ break;
case HANDLE_TYPE:
size = sizeof(HANDLE);
break;
env.dt = array_nth(vector->array,index);
}
-void vector_ensure_capacity(VECTOR* vector, int index)
+void vector_ensure_capacity(VECTOR* vector, CELL index)
{
ARRAY* array = vector->array;
CELL capacity = array->capacity;
void primitive_vector_length(void);
void primitive_set_vector_length(void);
void primitive_vector_nth(void);
-void vector_ensure_capacity(VECTOR* vector, int index);
+void vector_ensure_capacity(VECTOR* vector, CELL index);
void primitive_set_vector_nth(void);
void fixup_vector(VECTOR* vector);
void collect_vector(VECTOR* vector);