PageRenderTime 57ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/fth/member.fth

https://github.com/cataska/pforth
Forth | 155 lines | 130 code | 23 blank | 2 comment | 7 complexity | b7ba847d64901fcba84392abfa3db560 MD5 | raw file
  1. \ @(#) member.fth 98/01/26 1.2
  2. \ This files, along with c_struct.fth, supports the definition of
  3. \ structure members similar to those used in 'C'.
  4. \
  5. \ Some of this same code is also used by ODE,
  6. \ the Object Development Environment.
  7. \
  8. \ Author: Phil Burk
  9. \ Copyright 1994 3DO, Phil Burk, Larry Polansky, Devid Rosenboom
  10. \
  11. \ The pForth software code is dedicated to the public domain,
  12. \ and any third party may reproduce, distribute and modify
  13. \ the pForth software code or any derivative works thereof
  14. \ without any compensation or license. The pForth software
  15. \ code is provided on an "as is" basis without any warranty
  16. \ of any kind, including, without limitation, the implied
  17. \ warranties of merchantability and fitness for a particular
  18. \ purpose and their equivalents under the laws of any jurisdiction.
  19. \
  20. \ MOD: PLB 1/16/87 Use abort" instead of er.report.
  21. \ MOD: PLB 2/19/87 Made OB.MEMBER immediate, use literal.
  22. \ MOD: PLB/MDH 6/7/88 Use 16 bit values in member defs.
  23. \ MOD: PLB 7/31/88 Add USHORT and UBYTE.
  24. \ MOD: PLB 1/20/89 Treat LITERAL as state sensitive.
  25. \ MOD: RDG 9/19/90 Add floating point member support.
  26. \ MOD: PLB 6/10/91 Add RPTR
  27. \ 00001 PLB 8/3/92 Make RPTR a -4 for S@ and S!
  28. \ 941102 RDG port to pforth
  29. \ 941108 PLB more porting to pforth. Use ?LITERAL instead os smart literal.
  30. \ 960710 PLB align long members for SUN
  31. ANEW TASK-MEMBER.FTH
  32. decimal
  33. : FIND.BODY ( -- , pfa true | $name false , look for word in dict. )
  34. \ Return address of parameter data.
  35. 32 word find
  36. IF >body true
  37. ELSE false
  38. THEN
  39. ;
  40. \ Variables shared with object oriented code.
  41. VARIABLE OB-STATE ( Compilation state. )
  42. VARIABLE OB-CURRENT-CLASS ( ABS_CLASS_BASE of current class )
  43. 1 constant OB_DEF_CLASS ( defining a class )
  44. 2 constant OB_DEF_STRUCT ( defining a structure )
  45. 4 constant OB_OFFSET_SIZE
  46. : OB.OFFSET@ ( member_def -- offset ) @ ;
  47. : OB.OFFSET, ( value -- ) , ;
  48. : OB.SIZE@ ( member_def -- offset )
  49. ob_offset_size + @ ;
  50. : OB.SIZE, ( value -- ) , ;
  51. ( Members are associated with an offset from the base of a structure. )
  52. : OB.MAKE.MEMBER ( +-bytes -- , make room in an object at compile time)
  53. dup >r ( -- +-b , save #bytes )
  54. ABS ( -- |+-b| )
  55. ob-current-class @ ( -- b addr-space)
  56. tuck @ ( as #b c , current space needed )
  57. over 3 and 0= ( multiple of four? )
  58. IF
  59. aligned
  60. ELSE
  61. over 1 and 0= ( multiple of two? )
  62. IF
  63. even-up
  64. THEN
  65. THEN
  66. swap over + rot ! ( update space needed )
  67. \ Save data in member definition. %M
  68. ob.offset, ( save old offset for ivar )
  69. r> ob.size, ( store size in bytes for ..! and ..@ )
  70. ;
  71. \ Unions allow one to address the same memory as different members.
  72. \ Unions work by saving the current offset for members on
  73. \ the stack and then reusing it for different members.
  74. : UNION{ ( -- offset , Start union definition. )
  75. ob-current-class @ @
  76. ;
  77. : }UNION{ ( old-offset -- new-offset , Middle of union )
  78. union{ ( Get current for }UNION to compare )
  79. swap ob-current-class @ ! ( Set back to old )
  80. ;
  81. : }UNION ( offset -- , Terminate union definition, check lengths. )
  82. union{ = NOT
  83. abort" }UNION - Two parts of UNION are not the same size!"
  84. ;
  85. \ Make members compile their offset, for "disposable includes".
  86. : OB.MEMBER ( #bytes -- , make room in an object at compile time)
  87. ( -- offset , run time for structure )
  88. CREATE ob.make.member immediate
  89. DOES> ob.offset@ ( get offset ) ?literal
  90. ;
  91. : OB.FINDIT ( <thing> -- pfa , get pfa of thing or error )
  92. find.body not
  93. IF cr count type ." ???"
  94. true abort" OB.FINDIT - Word not found!"
  95. THEN
  96. ;
  97. : OB.STATS ( member_pfa -- offset #bytes )
  98. dup ob.offset@ swap
  99. ob.size@
  100. ;
  101. : OB.STATS? ( <member> -- offset #bytes )
  102. ob.findit ob.stats
  103. ;
  104. : SIZEOF() ( <struct>OR<class> -- #bytes , lookup size of object )
  105. ob.findit @
  106. ?literal
  107. ; immediate
  108. \ Basic word for defining structure members.
  109. : BYTES ( #bytes -- , error check for structure only )
  110. ob-state @ ob_def_struct = not
  111. abort" BYTES - Only valid in :STRUCT definitions."
  112. ob.member
  113. ;
  114. \ Declare various types of structure members.
  115. \ Negative size indicates a signed member.
  116. : BYTE ( <name> -- , declare space for a byte )
  117. -1 bytes ;
  118. : SHORT ( <name> -- , declare space for a 16 bit value )
  119. -2 bytes ;
  120. : LONG ( <name> -- )
  121. cell bytes ;
  122. : UBYTE ( <name> -- , declare space for signed byte )
  123. 1 bytes ;
  124. : USHORT ( <name> -- , declare space for signed 16 bit value )
  125. 2 bytes ;
  126. \ Aliases
  127. : APTR ( <name> -- ) long ;
  128. : RPTR ( <name> -- ) -4 bytes ; \ relative relocatable pointer 00001
  129. : ULONG ( <name> -- ) long ;
  130. : STRUCT ( <struct> <new_ivar> -- , define a structure as an ivar )
  131. [compile] sizeof() bytes
  132. ;