/src/tools/compiler/asm/marshall/liberty_asm_positions.e

http://github.com/tybor/Liberty · Specman e · 186 lines · 143 code · 29 blank · 14 comment · 1 complexity · 613ef1648a9f0c93eac36da8596ab431 MD5 · raw file

  1. -- This file is part of Liberty Eiffel.
  2. --
  3. -- Liberty Eiffel is free software: you can redistribute it and/or modify
  4. -- it under the terms of the GNU General Public License as published by
  5. -- the Free Software Foundation, version 3 of the License.
  6. --
  7. -- Liberty Eiffel is distributed in the hope that it will be useful,
  8. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. -- GNU General Public License for more details.
  11. --
  12. -- You should have received a copy of the GNU General Public License
  13. -- along with Liberty Eiffel. If not, see <http://www.gnu.org/licenses/>.
  14. --
  15. class LIBERTY_ASM_POSITIONS
  16. inherit
  17. LIBERTY_ASM_INSTRUCTION_VISITOR
  18. LIBERTY_ASM_PROXY_VISITOR
  19. insert
  20. LIBERTY_ASM_CODES
  21. create {LIBERTY_ASM_CODES}
  22. make
  23. feature {}
  24. make is
  25. do
  26. end
  27. feature {LIBERTY_ASM_CODES}
  28. set_positions (a_types: COLLECTION[LIBERTY_ASM_TYPE]) is
  29. require
  30. a_types /= Void
  31. do
  32. a_types.do_all(agent visit_type)
  33. end
  34. sizeof (a_instruction: LIBERTY_ASM_INSTRUCTION): INTEGER is
  35. do
  36. counter := 0
  37. a_instruction.accept(Current)
  38. Result := counter
  39. end
  40. feature {}
  41. visit_type (a_type: LIBERTY_ASM_TYPE) is
  42. require
  43. a_type /= Void
  44. do
  45. a_type.do_all_methods(agent visit_method)
  46. end
  47. visit_method (a_method: LIBERTY_ASM_METHOD) is
  48. require
  49. a_method /= Void
  50. do
  51. visit_code(a_method.code, agent a_method.set_code_size)
  52. visit_code(a_method.retry_code, agent a_method.set_retry_size)
  53. visit_code(a_method.precondition, agent a_method.set_precondition_size)
  54. visit_code(a_method.postcondition, agent a_method.set_postcondition_size)
  55. end
  56. visit_code (a_code: LIBERTY_ASM_INSTRUCTION; size_setter: PROCEDURE[TUPLE[INTEGER]]) is
  57. local
  58. code: LIBERTY_ASM_INSTRUCTION
  59. do
  60. if a_code /= Void then
  61. counter := 0
  62. from
  63. code := a_code
  64. until
  65. code = Void
  66. loop
  67. code.accept(Current)
  68. code := code.next
  69. end
  70. check
  71. counter > 0
  72. end
  73. size_setter.call([counter])
  74. end
  75. end
  76. counter: INTEGER
  77. set_position (a_instruction: LIBERTY_ASM_INSTRUCTION; size: INTEGER) is
  78. require
  79. a_instruction /= Void
  80. size > 0
  81. do
  82. a_instruction.set_position(counter)
  83. counter := counter + size
  84. ensure
  85. a_instruction.position = old counter
  86. counter = old counter + size
  87. end
  88. feature {LIBERTY_ASM_INSTRUCTION}
  89. visit_and (a_instruction: LIBERTY_ASM_AND) is
  90. do
  91. set_position(a_instruction, 1)
  92. end
  93. visit_invoke (a_instruction: LIBERTY_ASM_INVOKE) is
  94. do
  95. set_position(a_instruction, 9)
  96. end
  97. visit_proxy_invoke (a_instruction: LIBERTY_ASM_INSTRUCTION_PROXY; method_id, type_id: INTEGER) is
  98. do
  99. set_position(a_instruction, 9)
  100. end
  101. visit_jump (a_instruction: LIBERTY_ASM_JUMP) is
  102. do
  103. set_position(a_instruction, 5)
  104. end
  105. visit_proxy_jump (a_instruction: LIBERTY_ASM_INSTRUCTION_PROXY; position: INTEGER) is
  106. do
  107. set_position(a_instruction, 5)
  108. end
  109. visit_new (a_instruction: LIBERTY_ASM_NEW) is
  110. do
  111. set_position(a_instruction, 5)
  112. end
  113. visit_proxy_new (a_instruction: LIBERTY_ASM_INSTRUCTION_PROXY; type_id: INTEGER) is
  114. do
  115. set_position(a_instruction, 5)
  116. end
  117. visit_not (a_instruction: LIBERTY_ASM_NOT) is
  118. do
  119. set_position(a_instruction, 1)
  120. end
  121. visit_or (a_instruction: LIBERTY_ASM_OR) is
  122. do
  123. set_position(a_instruction, 1)
  124. end
  125. visit_return (a_instruction: LIBERTY_ASM_RETURN) is
  126. do
  127. set_position(a_instruction, 1)
  128. end
  129. visit_load_int (a_instruction: LIBERTY_ASM_LOAD_INT) is
  130. do
  131. set_position(a_instruction, 5)
  132. end
  133. visit_add_int (a_instruction: LIBERTY_ASM_ADD_INT) is
  134. do
  135. set_position(a_instruction, 1)
  136. end
  137. visit_sub_int (a_instruction: LIBERTY_ASM_SUB_INT) is
  138. do
  139. set_position(a_instruction, 1)
  140. end
  141. visit_mul_int (a_instruction: LIBERTY_ASM_MUL_INT) is
  142. do
  143. set_position(a_instruction, 1)
  144. end
  145. visit_div_int (a_instruction: LIBERTY_ASM_DIV_INT) is
  146. do
  147. set_position(a_instruction, 1)
  148. end
  149. visit_rem_int (a_instruction: LIBERTY_ASM_REM_INT) is
  150. do
  151. set_position(a_instruction, 1)
  152. end
  153. visit_call_native (a_instruction: LIBERTY_ASM_CALL_NATIVE) is
  154. do
  155. set_position(a_instruction, 6 + a_instruction.arguments.count)
  156. end
  157. end -- class LIBERTY_ASM_WRITER