mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-19 05:39:17 +02:00
WIP for libtommath
This commit is contained in:
parent
2411d3206c
commit
b9c8d2abf4
5 changed files with 62 additions and 10 deletions
|
@ -11,7 +11,7 @@ COMP_CFLAGS ?= -O2 -Wall -I$(PREFIX)/include -L$(PREFIX)/lib
|
||||||
#CFLAGS = -g -Wall
|
#CFLAGS = -g -Wall
|
||||||
#CFLAGS = -g -pg -Wall
|
#CFLAGS = -g -pg -Wall
|
||||||
CC ?= cc
|
CC ?= cc
|
||||||
LIBS = -pthread -lcyclone -lck -lm
|
LIBS = -pthread -lcyclone -lck -lm -ltommath
|
||||||
|
|
||||||
# Commands "baked into" cyclone for invoking the C compiler
|
# Commands "baked into" cyclone for invoking the C compiler
|
||||||
CC_PROG ?= "$(CC) ~src-file~ $(COMP_CFLAGS) -c -o ~exec-file~.o"
|
CC_PROG ?= "$(CC) ~src-file~ $(COMP_CFLAGS) -c -o ~exec-file~.o"
|
||||||
|
|
19
gc.c
19
gc.c
|
@ -417,6 +417,16 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
|
||||||
hp->value = ((integer_type *) obj)->value;
|
hp->value = ((integer_type *) obj)->value;
|
||||||
return (char *)hp;
|
return (char *)hp;
|
||||||
}
|
}
|
||||||
|
case bignum_tag:{
|
||||||
|
bignum_type *hp = dest;
|
||||||
|
mark(hp) = thd->gc_alloc_color;
|
||||||
|
type_of(hp) = bignum_tag;
|
||||||
|
((bignum_type *)hp)->bn.used = ((bignum_type *)obj)->bn.used;
|
||||||
|
((bignum_type *)hp)->bn.alloc = ((bignum_type *)obj)->bn.alloc;
|
||||||
|
((bignum_type *)hp)->bn.sign = ((bignum_type *)obj)->bn.sign;
|
||||||
|
((bignum_type *)hp)->bn.dp = ((bignum_type *)obj)->bn.dp;
|
||||||
|
return (char *)hp;
|
||||||
|
}
|
||||||
case double_tag:{
|
case double_tag:{
|
||||||
double_type *hp = dest;
|
double_type *hp = dest;
|
||||||
mark(hp) = thd->gc_alloc_color;
|
mark(hp) = thd->gc_alloc_color;
|
||||||
|
@ -674,6 +684,8 @@ size_t gc_allocated_bytes(object obj, gc_free_list * q, gc_free_list * r)
|
||||||
}
|
}
|
||||||
if (t == integer_tag)
|
if (t == integer_tag)
|
||||||
return gc_heap_align(sizeof(integer_type));
|
return gc_heap_align(sizeof(integer_type));
|
||||||
|
if (t == bignum_tag)
|
||||||
|
return gc_heap_align(sizeof(bignum_type));
|
||||||
if (t == double_tag)
|
if (t == double_tag)
|
||||||
return gc_heap_align(sizeof(double_type));
|
return gc_heap_align(sizeof(double_type));
|
||||||
if (t == port_tag)
|
if (t == port_tag)
|
||||||
|
@ -869,6 +881,13 @@ size_t gc_sweep(gc_heap * h, int heap_type, size_t * sum_freed_ptr, gc_thread_da
|
||||||
fprintf(stderr, "Error destroying condition variable\n");
|
fprintf(stderr, "Error destroying condition variable\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
} else if (type_of(p) == bignum_tag) {
|
||||||
|
// TODO: this is no good if we abandon bignum's on the stack
|
||||||
|
// in that case the finalizer is never called
|
||||||
|
#if GC_DEBUG_VERBOSE
|
||||||
|
fprintf(stderr, "mp_clear from sweep\n");
|
||||||
|
#endif
|
||||||
|
mp_clear(&(((bignum_type *)p)->bn));
|
||||||
}
|
}
|
||||||
// free p
|
// free p
|
||||||
heap_freed += size;
|
heap_freed += size;
|
||||||
|
|
|
@ -246,6 +246,7 @@ object Cyc_is_null(object o);
|
||||||
object Cyc_is_number(object o);
|
object Cyc_is_number(object o);
|
||||||
object Cyc_is_real(object o);
|
object Cyc_is_real(object o);
|
||||||
object Cyc_is_integer(object o);
|
object Cyc_is_integer(object o);
|
||||||
|
object Cyc_is_bignum(object o);
|
||||||
object Cyc_is_vector(object o);
|
object Cyc_is_vector(object o);
|
||||||
object Cyc_is_bytevector(object o);
|
object Cyc_is_bytevector(object o);
|
||||||
object Cyc_is_port(object o);
|
object Cyc_is_port(object o);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "tommath.h"
|
||||||
|
|
||||||
// Maximum number of args that GC will accept
|
// Maximum number of args that GC will accept
|
||||||
#define NUM_GC_ARGS 128
|
#define NUM_GC_ARGS 128
|
||||||
|
@ -87,14 +88,15 @@ enum object_tag {
|
||||||
, eof_tag // 9
|
, eof_tag // 9
|
||||||
, forward_tag // 10
|
, forward_tag // 10
|
||||||
, integer_tag // 11
|
, integer_tag // 11
|
||||||
, macro_tag // 12
|
, bignum_tag // 12
|
||||||
, mutex_tag // 13
|
, macro_tag // 13
|
||||||
, pair_tag // 14
|
, mutex_tag // 14
|
||||||
, port_tag // 15
|
, pair_tag // 15
|
||||||
, primitive_tag // 16
|
, port_tag // 16
|
||||||
, string_tag // 17
|
, primitive_tag // 17
|
||||||
, symbol_tag // 18
|
, string_tag // 18
|
||||||
, vector_tag // 19
|
, symbol_tag // 19
|
||||||
|
, vector_tag // 20
|
||||||
};
|
};
|
||||||
|
|
||||||
#define type_is_pair_prim(clo) \
|
#define type_is_pair_prim(clo) \
|
||||||
|
@ -356,6 +358,20 @@ typedef struct {
|
||||||
int padding; // Prevent mem corruption if sizeof(int) < sizeof(ptr)
|
int padding; // Prevent mem corruption if sizeof(int) < sizeof(ptr)
|
||||||
} integer_type;
|
} integer_type;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
gc_header_type hdr;
|
||||||
|
tag_type tag;
|
||||||
|
mp_int bn;
|
||||||
|
} bignum_type;
|
||||||
|
|
||||||
|
#define make_empty_bignum(n) \
|
||||||
|
bignum_type n; \
|
||||||
|
n.hdr.mark = gc_color_red; \
|
||||||
|
n.hdr.grayed = 0; \
|
||||||
|
n.tag = bignum_tag; \
|
||||||
|
mp_init(&n);
|
||||||
|
/* TODO: check return value of mp_init */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gc_header_type hdr;
|
gc_header_type hdr;
|
||||||
tag_type tag;
|
tag_type tag;
|
||||||
|
|
18
runtime.c
18
runtime.c
|
@ -43,6 +43,7 @@ const char *tag_names[] = {
|
||||||
/*eof_tag */ , "eof"
|
/*eof_tag */ , "eof"
|
||||||
/*forward_tag */ , ""
|
/*forward_tag */ , ""
|
||||||
/*integer_tag */ , "number"
|
/*integer_tag */ , "number"
|
||||||
|
/*bignum_tag */ , "bignum"
|
||||||
/*macro_tag */ , "macro"
|
/*macro_tag */ , "macro"
|
||||||
/*mutex_tag */ , "mutex"
|
/*mutex_tag */ , "mutex"
|
||||||
/*pair_tag */ , "pair"
|
/*pair_tag */ , "pair"
|
||||||
|
@ -1285,6 +1286,7 @@ object Cyc_is_number(object o)
|
||||||
{
|
{
|
||||||
if ((o != NULL) && (obj_is_int(o) || (!is_value_type(o)
|
if ((o != NULL) && (obj_is_int(o) || (!is_value_type(o)
|
||||||
&& (type_of(o) == integer_tag
|
&& (type_of(o) == integer_tag
|
||||||
|
|| type_of(o) == bignum_tag
|
||||||
|| type_of(o) == double_tag))))
|
|| type_of(o) == double_tag))))
|
||||||
return boolean_t;
|
return boolean_t;
|
||||||
return boolean_f;
|
return boolean_f;
|
||||||
|
@ -1298,7 +1300,15 @@ object Cyc_is_real(object o)
|
||||||
object Cyc_is_integer(object o)
|
object Cyc_is_integer(object o)
|
||||||
{
|
{
|
||||||
if ((o != NULL) && (obj_is_int(o) ||
|
if ((o != NULL) && (obj_is_int(o) ||
|
||||||
(!is_value_type(o) && type_of(o) == integer_tag)))
|
(!is_value_type(o) && type_of(o) == integer_tag) ||
|
||||||
|
(!is_value_type(o) && type_of(o) == bignum_tag)))
|
||||||
|
return boolean_t;
|
||||||
|
return boolean_f;
|
||||||
|
}
|
||||||
|
|
||||||
|
object Cyc_is_bignum(object o)
|
||||||
|
{
|
||||||
|
if ((o != NULL) && !is_value_type(o) && ((list) o)->tag == bignum_tag)
|
||||||
return boolean_t;
|
return boolean_t;
|
||||||
return boolean_f;
|
return boolean_f;
|
||||||
}
|
}
|
||||||
|
@ -4078,6 +4088,11 @@ char *gc_move(char *obj, gc_thread_data * thd, int *alloci, int *heap_grown)
|
||||||
gc_alloc(heap, sizeof(integer_type), obj, thd, heap_grown);
|
gc_alloc(heap, sizeof(integer_type), obj, thd, heap_grown);
|
||||||
return gc_fixup_moved_obj(thd, alloci, obj, hp);
|
return gc_fixup_moved_obj(thd, alloci, obj, hp);
|
||||||
}
|
}
|
||||||
|
case bignum_tag:{
|
||||||
|
bignum_type *hp =
|
||||||
|
gc_alloc(heap, sizeof(bignum_type), obj, thd, heap_grown);
|
||||||
|
return gc_fixup_moved_obj(thd, alloci, obj, hp);
|
||||||
|
}
|
||||||
case double_tag:{
|
case double_tag:{
|
||||||
double_type *hp =
|
double_type *hp =
|
||||||
gc_alloc(heap, sizeof(double_type), obj, thd, heap_grown);
|
gc_alloc(heap, sizeof(double_type), obj, thd, heap_grown);
|
||||||
|
@ -4235,6 +4250,7 @@ int gc_minor(void *data, object low_limit, object high_limit, closure cont,
|
||||||
case bytevector_tag:
|
case bytevector_tag:
|
||||||
case string_tag:
|
case string_tag:
|
||||||
case integer_tag:
|
case integer_tag:
|
||||||
|
case bignum_tag:
|
||||||
case double_tag:
|
case double_tag:
|
||||||
case port_tag:
|
case port_tag:
|
||||||
case cvar_tag:
|
case cvar_tag:
|
||||||
|
|
Loading…
Add table
Reference in a new issue