classes.struct: make hashcode and equal? work on structs wrapping null pointers, to fix another obscure issues arising with tuple arrays
parent
53a8f004d0
commit
72dfb3339f
|
@ -245,6 +245,8 @@ STRUCT: struct-test-equality-1
|
||||||
STRUCT: struct-test-equality-2
|
STRUCT: struct-test-equality-2
|
||||||
{ y int } ;
|
{ y int } ;
|
||||||
|
|
||||||
|
[ 0 ] [ struct-test-equality-1 new hashcode ] unit-test
|
||||||
|
|
||||||
[ t ] [
|
[ t ] [
|
||||||
[
|
[
|
||||||
struct-test-equality-1 <struct> 5 >>x
|
struct-test-equality-1 <struct> 5 >>x
|
||||||
|
|
|
@ -48,13 +48,18 @@ M: struct >c-ptr
|
||||||
2 slot { c-ptr } declare ; inline
|
2 slot { c-ptr } declare ; inline
|
||||||
|
|
||||||
M: struct equal?
|
M: struct equal?
|
||||||
{
|
over struct? [
|
||||||
[ [ class ] bi@ = ]
|
2dup [ class ] bi@ = [
|
||||||
[ [ >c-ptr ] [ binary-object ] bi* memory= ]
|
2dup [ >c-ptr ] both?
|
||||||
} 2&& ; inline
|
[ [ >c-ptr ] [ binary-object ] bi* memory= ]
|
||||||
|
[ [ >c-ptr not ] both? ]
|
||||||
|
if
|
||||||
|
] [ 2drop f ] if
|
||||||
|
] [ 2drop f ] if ; inline
|
||||||
|
|
||||||
M: struct hashcode*
|
M: struct hashcode*
|
||||||
binary-object <direct-uchar-array> hashcode* ; inline
|
binary-object over
|
||||||
|
[ <direct-uchar-array> hashcode* ] [ 3drop 0 ] if ; inline
|
||||||
|
|
||||||
: struct-prototype ( class -- prototype ) "prototype" word-prop ; foldable
|
: struct-prototype ( class -- prototype ) "prototype" word-prop ; foldable
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
USING: tuple-arrays sequences tools.test namespaces kernel
|
USING: tuple-arrays sequences tools.test namespaces kernel
|
||||||
math accessors classes.tuple eval ;
|
math accessors classes.tuple eval classes.struct ;
|
||||||
IN: tuple-arrays.tests
|
IN: tuple-arrays.tests
|
||||||
|
|
||||||
SYMBOL: mat
|
SYMBOL: mat
|
||||||
|
@ -41,4 +41,31 @@ TUPLE: non-final x ;
|
||||||
|
|
||||||
[ "IN: tuple-arrays.tests USE: tuple-arrays TUPLE-ARRAY: non-final" eval( -- ) ]
|
[ "IN: tuple-arrays.tests USE: tuple-arrays TUPLE-ARRAY: non-final" eval( -- ) ]
|
||||||
[ error>> not-final? ]
|
[ error>> not-final? ]
|
||||||
must-fail-with
|
must-fail-with
|
||||||
|
|
||||||
|
! Empty tuple
|
||||||
|
TUPLE: empty-tuple ; final
|
||||||
|
|
||||||
|
TUPLE-ARRAY: empty-tuple
|
||||||
|
|
||||||
|
[ 100 ] [ 100 <empty-tuple-array> length ] unit-test
|
||||||
|
[ T{ empty-tuple } ] [ 100 <empty-tuple-array> first ] unit-test
|
||||||
|
[ ] [ T{ empty-tuple } 100 <empty-tuple-array> set-first ] unit-test
|
||||||
|
|
||||||
|
! Changing a tuple into a struct shouldn't break the tuple array to the point
|
||||||
|
! of crashing Factor
|
||||||
|
TUPLE: tuple-to-struct x ; final
|
||||||
|
|
||||||
|
TUPLE-ARRAY: tuple-to-struct
|
||||||
|
|
||||||
|
[ f ] [ tuple-to-struct struct-class? ] unit-test
|
||||||
|
|
||||||
|
! This shouldn't crash
|
||||||
|
[ ] [
|
||||||
|
"IN: tuple-arrays.tests
|
||||||
|
USING: alien.c-types classes.struct ;
|
||||||
|
STRUCT: tuple-to-struct { x int } ;"
|
||||||
|
eval( -- )
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[ t ] [ tuple-to-struct struct-class? ] unit-test
|
Loading…
Reference in New Issue