feature-2: allocating cells with count = 1; 7 unit tests (all bignums) fail.

This commit is contained in:
Simon Brooke 2026-02-12 10:17:11 +00:00
parent 351ca5bd17
commit 004ff6737c
10 changed files with 209 additions and 114 deletions

View file

@ -61,11 +61,11 @@ struct cons_pointer simplify_ratio( struct cons_pointer pointer ) {
if ( gcd > 1 ) {
if ( drrv / gcd == 1 ) {
result = make_integer( ddrv / gcd, NIL );
result = acquire_integer( ddrv / gcd, NIL );
} else {
result =
make_ratio( make_integer( ddrv / gcd, NIL ),
make_integer( drrv / gcd, NIL ) );
make_ratio( acquire_integer( ddrv / gcd, NIL ),
acquire_integer( drrv / gcd, NIL ) );
}
}
}
@ -110,23 +110,24 @@ struct cons_pointer add_ratio_ratio( struct cons_pointer arg1,
m1, m2 );
if ( dr1v == dr2v ) {
r = make_ratio( make_integer( dd1v + dd2v, NIL ),
r = make_ratio( acquire_integer( dd1v + dd2v, NIL ),
cell1.payload.ratio.divisor );
} else {
struct cons_pointer dd1vm = make_integer( dd1v * m1, NIL ),
dr1vm = make_integer( dr1v * m1, NIL ),
dd2vm = make_integer( dd2v * m2, NIL ),
dr2vm = make_integer( dr2v * m2, NIL ),
struct cons_pointer dd1vm = acquire_integer( dd1v * m1, NIL ),
dr1vm = acquire_integer( dr1v * m1, NIL ),
dd2vm = acquire_integer( dd2v * m2, NIL ),
dr2vm = acquire_integer( dr2v * m2, NIL ),
r1 = make_ratio( dd1vm, dr1vm ),
r2 = make_ratio( dd2vm, dr2vm );
r = add_ratio_ratio( r1, r2 );
if (!eq( r, r1)) { dec_ref( r1);}
if (!eq( r, r2)) { dec_ref( r2);}
/* because the references on dd1vm, dr1vm, dd2vm and dr2vm were
* never incremented except when making r1 and r2, decrementing
* r1 and r2 should be enought to garbage collect them. */
dec_ref( r1 );
dec_ref( r2 );
}
result = simplify_ratio( r );
@ -162,12 +163,12 @@ struct cons_pointer add_integer_ratio( struct cons_pointer intarg,
if ( integerp( intarg ) && ratiop( ratarg ) ) {
// TODO: not longer works
struct cons_pointer one = make_integer( 1, NIL ),
struct cons_pointer one = acquire_integer( 1, NIL ),
ratio = make_ratio( intarg, one );
result = add_ratio_ratio( ratio, ratarg );
dec_ref( one );
release_integer( one );
dec_ref( ratio );
} else {
result =
@ -231,11 +232,15 @@ struct cons_pointer multiply_ratio_ratio( struct
pointer2cell( cell2.payload.ratio.divisor ).payload.integer.value,
ddrv = dd1v * dd2v, drrv = dr1v * dr2v;
struct cons_pointer dividend = acquire_integer( ddrv, NIL );
struct cons_pointer divisor = acquire_integer( drrv, NIL );
struct cons_pointer unsimplified =
make_ratio( make_integer( ddrv, NIL ),
make_integer( drrv, NIL ) );
make_ratio( dividend, divisor);
result = simplify_ratio( unsimplified );
release_integer( dividend);
release_integer( divisor);
if ( !eq( unsimplified, result ) ) {
dec_ref( unsimplified );
}
@ -261,12 +266,11 @@ struct cons_pointer multiply_integer_ratio( struct cons_pointer intarg,
if ( integerp( intarg ) && ratiop( ratarg ) ) {
// TODO: no longer works; fix
struct cons_pointer one = make_integer( 1, NIL ),
struct cons_pointer one = acquire_integer( 1, NIL ),
ratio = make_ratio( intarg, one );
result = multiply_ratio_ratio( ratio, ratarg );
dec_ref( one );
dec_ref( ratio );
release_integer( one );
} else {
result =
throw_exception( c_string_to_lisp_string