diff --git a/basis/classes/struct/struct.factor b/basis/classes/struct/struct.factor index 7e99328652..63f2ad282e 100755 --- a/basis/classes/struct/struct.factor +++ b/basis/classes/struct/struct.factor @@ -103,6 +103,8 @@ M: struct-class boa>object [ ] [ struct-slots ] bi [ [ (writer-quot) call( value struct -- ) ] with 2each ] curry keep ; +M: struct-class initial-value* ; inline + ! Struct slot accessors GENERIC: struct-slot-values ( struct -- sequence ) @@ -113,6 +115,9 @@ M: struct-class reader-quot M: struct-class writer-quot nip (writer-quot) ; +: offset-of ( field struct -- offset ) + struct-slots slot-named offset>> ; inline + ! c-types TUPLE: struct-c-type < abstract-c-type @@ -202,15 +207,29 @@ M: struct byte-length class "struct-size" word-prop ; foldable ! class definition c-ptr ] bi + [ *uchar zero? ] curry all? ; + +: struct-needs-prototype? ( class -- ? ) + struct-slots [ initial>> binary-zero? ] all? not ; + : make-struct-prototype ( class -- prototype ) - [ "struct-size" word-prop ] - [ memory>struct ] - [ struct-slots ] tri - [ - [ initial>> ] - [ (writer-quot) ] bi - over [ swapd [ call( value struct -- ) ] curry keep ] [ 2drop ] if - ] each ; + dup struct-needs-prototype? [ + [ "struct-size" word-prop ] + [ memory>struct ] + [ struct-slots ] tri + [ + [ initial>> ] + [ (writer-quot) ] bi + over [ swapd [ call( value struct -- ) ] curry keep ] [ 2drop ] if + ] each + ] [ drop f ] if ; : (struct-methods) ( class -- ) [ (define-struct-slot-values-method) ] diff --git a/basis/vm/vm.factor b/basis/vm/vm.factor index ab5a98ab3c..3ea501b561 100644 --- a/basis/vm/vm.factor +++ b/basis/vm/vm.factor @@ -1,23 +1,21 @@ ! Copyright (C) 2009 Phil Dawes. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.structs alien.syntax ; +USING: classes.struct alien.syntax ; IN: vm TYPEDEF: void* cell -C-STRUCT: zone - { "cell" "start" } - { "cell" "here" } - { "cell" "size" } - { "cell" "end" } - ; +STRUCT: zone + { start cell } + { here cell } + { size cell } + { end cell } ; -C-STRUCT: vm - { "context*" "stack_chain" } - { "zone" "nursery" } - { "cell" "cards_offset" } - { "cell" "decks_offset" } - { "cell[70]" "userenv" } - ; +STRUCT: vm + { stack_chain context* } + { nursery zone } + { cards_offset cell } + { decks_offset cell } + { userenv cell[70] } ; -: vm-field-offset ( field -- offset ) "vm" offset-of ; \ No newline at end of file +: vm-field-offset ( field -- offset ) vm offset-of ; inline