From e918e9cddcfc9af483fa92dfcc160d92e2f8b073 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 30 Aug 2009 21:01:44 -0500 Subject: [PATCH] classes.struct: add more unit tests for clone method, and fix clone breakage when the struct class word is not a symbol --- basis/classes/struct/struct-tests.factor | 27 ++++++++++++++++++++++-- basis/classes/struct/struct.factor | 3 ++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/basis/classes/struct/struct-tests.factor b/basis/classes/struct/struct-tests.factor index 0cd91da370..f015556bec 100644 --- a/basis/classes/struct/struct-tests.factor +++ b/basis/classes/struct/struct-tests.factor @@ -6,7 +6,7 @@ kernel libc literals math multiline namespaces prettyprint prettyprint.config see sequences specialized-arrays.ushort system tools.test compiler.tree.debugger struct-arrays classes.tuple.private specialized-arrays.direct.int -compiler.units ; +compiler.units byte-arrays specialized-arrays.char ; IN: classes.struct.tests << @@ -204,4 +204,27 @@ STRUCT: struct-test-optimization [ f ] [ [ memory>struct y>> ] { memory>struct y>> } inlined? ] unit-test -[ f ] [ struct-test-foo dup clone [ >c-ptr ] bi@ eq? ] unit-test +! Test cloning structs +STRUCT: clone-test-struct { x int } { y char[3] } ; + +[ 1 char-array{ 9 1 1 } ] [ + clone-test-struct + 1 >>x char-array{ 9 1 1 } >>y + clone + [ x>> ] [ y>> >char-array ] bi +] unit-test + +[ t 1 char-array{ 9 1 1 } ] [ + [ + clone-test-struct malloc-struct &free + 1 >>x char-array{ 9 1 1 } >>y + clone + [ >c-ptr byte-array? ] [ x>> ] [ y>> >char-array ] tri + ] with-destructors +] unit-test + +STRUCT: struct-that's-a-word { x int } ; + +: struct-that's-a-word ( -- ) "OOPS" throw ; + +[ -77 ] [ S{ struct-that's-a-word { x -77 } } clone x>> ] unit-test diff --git a/basis/classes/struct/struct.factor b/basis/classes/struct/struct.factor index 6954c0680b..09c1d23c4e 100644 --- a/basis/classes/struct/struct.factor +++ b/basis/classes/struct/struct.factor @@ -131,7 +131,8 @@ M: struct-class writer-quot [ >c-ptr ] [ byte-length ] bi memory>byte-array ; inline : (define-clone-method) ( class -- ) - [ \ clone ] [ \ clone-underlying swap \ memory>struct [ ] 3sequence ] bi + [ \ clone ] + [ \ clone-underlying swap literalize \ memory>struct [ ] 3sequence ] bi define-inline-method ; : slot>field ( slot -- field )