/src/tools/interpreter/builtins/liberty_interpreter_external_type_integers_builtins.e

http://github.com/tybor/Liberty · Specman e · 151 lines · 122 code · 15 blank · 14 comment · 0 complexity · 004e36449f79a990c20c78b047d55845 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. deferred class LIBERTY_INTERPRETER_EXTERNAL_TYPE_INTEGERS_BUILTINS[E_ -> INTEGRAL]
  16. inherit
  17. LIBERTY_INTERPRETER_EXTERNAL_TYPED_BUILTINS[E_]
  18. undefine
  19. target, left, right
  20. redefine
  21. call_add, call_subtract, call_times, call_divide,
  22. call_less_or_equal, call_less_than, call_greater_or_equal, call_greater_than,
  23. call_negative,
  24. call_other
  25. end
  26. feature {}
  27. new_integer (value: E_): LIBERTY_INTERPRETER_OBJECT_NATIVE[INTEGER_64] is
  28. deferred
  29. end
  30. int64_target: INTEGER_64 is
  31. local
  32. obj: LIBERTY_INTERPRETER_OBJECT_NATIVE[INTEGER_64]
  33. do
  34. obj ::= builtin_call.target
  35. Result := obj.item
  36. end
  37. right_as_integer_8: INTEGER_8 is
  38. local
  39. obj: LIBERTY_INTERPRETER_OBJECT_NATIVE[INTEGER_64]
  40. do
  41. builtin_call.evaluate_parameters
  42. obj ::= builtin_call.parameters.first
  43. Result := obj.item.to_integer_8
  44. end
  45. feature {LIBERTY_FEATURE_LOCAL_CONTEXT}
  46. call_add (f: LIBERTY_FEATURE) is
  47. do
  48. returned := new_integer(left + right)
  49. end
  50. call_subtract (f: LIBERTY_FEATURE) is
  51. do
  52. returned := new_integer(left - right)
  53. end
  54. call_times (f: LIBERTY_FEATURE) is
  55. do
  56. returned := new_integer(left * right)
  57. end
  58. call_divide (f: LIBERTY_FEATURE) is
  59. do
  60. returned := interpreter.new_real(left / right, builtin_call.position)
  61. end
  62. call_less_or_equal (f: LIBERTY_FEATURE) is
  63. do
  64. returned := interpreter.new_boolean(left <= right, builtin_call.position)
  65. end
  66. call_less_than (f: LIBERTY_FEATURE) is
  67. do
  68. returned := interpreter.new_boolean(left < right, builtin_call.position)
  69. end
  70. call_greater_or_equal (f: LIBERTY_FEATURE) is
  71. do
  72. returned := interpreter.new_boolean(left >= right, builtin_call.position)
  73. end
  74. call_greater_than (f: LIBERTY_FEATURE) is
  75. do
  76. returned := interpreter.new_boolean(left > right, builtin_call.position)
  77. end
  78. call_negative (f: LIBERTY_FEATURE) is
  79. do
  80. returned := new_integer(-target)
  81. end
  82. call_other (f: LIBERTY_FEATURE) is
  83. do
  84. inspect
  85. builtin_call.name
  86. when "to_character" then
  87. returned := interpreter.new_character(target.to_character, builtin_call.position)
  88. when "to_integer_8" then
  89. returned := interpreter.new_integer_8(int64_target.to_integer_8, builtin_call.position)
  90. when "to_integer_16" then
  91. returned := interpreter.new_integer_16(int64_target.to_integer_16, builtin_call.position)
  92. when "to_integer_32" then
  93. returned := interpreter.new_integer_32(int64_target.to_integer_32, builtin_call.position)
  94. when "to_integer_64" then
  95. returned := interpreter.new_integer_64(int64_target, builtin_call.position)
  96. when "to_natural_8" then
  97. not_yet_implemented
  98. when "to_natural_16" then
  99. not_yet_implemented
  100. when "to_natural_32" then
  101. not_yet_implemented
  102. when "to_natural_64" then
  103. not_yet_implemented
  104. when "infix |>>", "bit_shift_right" then
  105. returned := new_integer(left |>> right_as_integer_8)
  106. when "infix |>>>", "bit_shift_right_unsigned" then
  107. returned := new_integer(left |>>> right_as_integer_8)
  108. when "infix |<<", "bit_shift_left" then
  109. returned := new_integer(left |<< right_as_integer_8)
  110. when "infix #>>", "bit_rotate_right" then
  111. returned := new_integer(left #>> right_as_integer_8)
  112. when "infix #<<", "bit_rotate_left" then
  113. returned := new_integer(left #<< right_as_integer_8)
  114. when "bit_rotate" then
  115. returned := new_integer(left.bit_rotate(right_as_integer_8))
  116. when "prefix ~", "bit_not" then
  117. returned := new_integer(~left)
  118. when "infix &", "bit_and" then
  119. returned := new_integer(left & right)
  120. when "infix |", "bit_or" then
  121. returned := new_integer(left | right)
  122. when "bit_xor" then
  123. returned := new_integer(left.bit_xor(right))
  124. when "infix #+" then
  125. returned := new_integer(left #+ right)
  126. when "infix #-" then
  127. returned := new_integer(left #- right)
  128. when "infix #*" then
  129. returned := new_integer(left #* right)
  130. when "infix #//" then
  131. returned := new_integer(left #// right)
  132. when "infix #\\" then
  133. returned := new_integer(left #\\ right)
  134. end
  135. end
  136. end -- class LIBERTY_INTERPRETER_EXTERNAL_TYPE_INTEGERS_BUILTINS