therubyracer 0.7.4 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of therubyracer might be problematic. Click here for more details.

Files changed (482) hide show
  1. data/History.txt +11 -0
  2. data/Rakefile +1 -1
  3. data/ext/v8/extconf.rb +0 -18
  4. data/ext/v8/rr.cpp +2 -2
  5. data/ext/v8/upstream/{2.1.10 → 2.3.3}/AUTHORS +1 -0
  6. data/ext/v8/upstream/{2.1.10 → 2.3.3}/ChangeLog +239 -0
  7. data/ext/v8/upstream/{2.1.10 → 2.3.3}/LICENSE +0 -0
  8. data/ext/v8/upstream/{2.1.10 → 2.3.3}/SConstruct +29 -17
  9. data/ext/v8/upstream/{2.1.10 → 2.3.3}/include/v8-debug.h +61 -3
  10. data/ext/v8/upstream/{2.1.10 → 2.3.3}/include/v8-profiler.h +182 -5
  11. data/ext/v8/upstream/{2.1.10 → 2.3.3}/include/v8.h +458 -257
  12. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/SConscript +2 -5
  13. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/accessors.cc +2 -2
  14. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/accessors.h +0 -0
  15. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/allocation.cc +0 -0
  16. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/allocation.h +0 -0
  17. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/api.cc +574 -30
  18. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/api.h +12 -10
  19. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/apinatives.js +0 -0
  20. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/apiutils.h +0 -0
  21. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arguments.h +0 -0
  22. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/assembler-arm-inl.h +38 -15
  23. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/assembler-arm.cc +646 -101
  24. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/assembler-arm.h +174 -15
  25. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/builtins-arm.cc +56 -47
  26. data/ext/v8/upstream/2.3.3/src/arm/codegen-arm-inl.h +48 -0
  27. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/codegen-arm.cc +2957 -1448
  28. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/codegen-arm.h +230 -74
  29. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/constants-arm.cc +25 -1
  30. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/constants-arm.h +16 -1
  31. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/cpu-arm.cc +4 -0
  32. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/debug-arm.cc +76 -6
  33. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/disasm-arm.cc +168 -20
  34. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/fast-codegen-arm.cc +5 -2
  35. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/frames-arm.cc +4 -4
  36. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/frames-arm.h +0 -0
  37. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/full-codegen-arm.cc +1558 -248
  38. data/ext/v8/upstream/2.3.3/src/arm/ic-arm.cc +2258 -0
  39. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/jump-target-arm.cc +55 -103
  40. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/macro-assembler-arm.cc +358 -185
  41. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/macro-assembler-arm.h +136 -41
  42. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/regexp-macro-assembler-arm.cc +26 -5
  43. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/regexp-macro-assembler-arm.h +0 -0
  44. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/register-allocator-arm-inl.h +0 -0
  45. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/register-allocator-arm.cc +4 -0
  46. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/register-allocator-arm.h +0 -0
  47. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/simulator-arm.cc +203 -22
  48. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/simulator-arm.h +7 -0
  49. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/stub-cache-arm.cc +531 -324
  50. data/ext/v8/upstream/2.3.3/src/arm/virtual-frame-arm-inl.h +59 -0
  51. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/virtual-frame-arm.cc +247 -81
  52. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/virtual-frame-arm.h +99 -83
  53. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/array.js +2 -2
  54. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/assembler.cc +6 -13
  55. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/assembler.h +36 -10
  56. data/ext/v8/upstream/2.3.3/src/ast-inl.h +81 -0
  57. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ast.cc +14 -0
  58. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ast.h +20 -35
  59. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/bootstrapper.cc +32 -1
  60. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/bootstrapper.h +0 -4
  61. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/builtins.cc +50 -33
  62. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/builtins.h +2 -0
  63. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/bytecodes-irregexp.h +0 -0
  64. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cached-powers.h +0 -0
  65. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/char-predicates-inl.h +0 -0
  66. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/char-predicates.h +0 -0
  67. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/checks.cc +0 -0
  68. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/checks.h +8 -6
  69. data/ext/v8/upstream/2.3.3/src/circular-queue-inl.h +53 -0
  70. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/circular-queue.cc +0 -0
  71. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/circular-queue.h +0 -26
  72. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/code-stubs.cc +2 -4
  73. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/code-stubs.h +1 -0
  74. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/code.h +0 -0
  75. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/codegen-inl.h +0 -0
  76. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/codegen.cc +44 -13
  77. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/codegen.h +310 -31
  78. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compilation-cache.cc +28 -0
  79. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compilation-cache.h +3 -0
  80. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compiler.cc +45 -14
  81. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compiler.h +0 -0
  82. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/contexts.cc +11 -11
  83. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/contexts.h +0 -0
  84. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/conversions-inl.h +0 -0
  85. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/conversions.cc +25 -11
  86. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/conversions.h +0 -0
  87. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/counters.cc +0 -0
  88. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/counters.h +0 -0
  89. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu-profiler-inl.h +2 -1
  90. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu-profiler.cc +68 -24
  91. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu-profiler.h +19 -11
  92. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu.h +0 -0
  93. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-debug.cc +0 -0
  94. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-debug.h +0 -0
  95. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-posix.cc +0 -0
  96. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-readline.cc +0 -0
  97. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-windows.cc +0 -0
  98. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8.cc +3 -0
  99. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8.h +0 -0
  100. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8.js +55 -2
  101. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/data-flow.cc +3 -0
  102. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/data-flow.h +0 -0
  103. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/date.js +68 -137
  104. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dateparser-inl.h +0 -0
  105. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dateparser.cc +2 -8
  106. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dateparser.h +0 -0
  107. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug-agent.cc +3 -3
  108. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug-agent.h +0 -0
  109. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug-debugger.js +81 -23
  110. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug.cc +275 -81
  111. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug.h +85 -6
  112. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/disasm.h +0 -0
  113. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/disassembler.cc +1 -1
  114. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/disassembler.h +0 -0
  115. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/diy-fp.cc +0 -0
  116. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/diy-fp.h +0 -0
  117. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/double.h +0 -0
  118. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dtoa-config.c +0 -0
  119. data/ext/v8/upstream/2.3.3/src/dtoa.cc +77 -0
  120. data/ext/v8/upstream/2.3.3/src/dtoa.h +81 -0
  121. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/execution.cc +111 -3
  122. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/execution.h +12 -1
  123. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/factory.cc +25 -3
  124. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/factory.h +16 -9
  125. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-codegen.cc +0 -0
  126. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-codegen.h +0 -0
  127. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-dtoa.cc +2 -9
  128. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-dtoa.h +1 -2
  129. data/ext/v8/upstream/2.3.3/src/fixed-dtoa.cc +405 -0
  130. data/ext/v8/upstream/{2.1.10/src/jump-target-light.cc → 2.3.3/src/fixed-dtoa.h} +22 -53
  131. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flag-definitions.h +14 -6
  132. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flags.cc +5 -9
  133. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flags.h +0 -0
  134. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flow-graph.cc +0 -0
  135. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flow-graph.h +0 -0
  136. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frame-element.cc +0 -0
  137. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frame-element.h +0 -0
  138. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frames-inl.h +0 -0
  139. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frames.cc +5 -2
  140. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frames.h +1 -0
  141. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/full-codegen.cc +387 -20
  142. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/full-codegen.h +102 -5
  143. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/func-name-inferrer.cc +0 -0
  144. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/func-name-inferrer.h +0 -0
  145. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/global-handles.cc +8 -4
  146. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/global-handles.h +0 -0
  147. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/globals.h +44 -7
  148. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/handles-inl.h +0 -0
  149. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/handles.cc +19 -0
  150. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/handles.h +8 -0
  151. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/hashmap.cc +0 -0
  152. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/hashmap.h +0 -0
  153. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap-inl.h +56 -14
  154. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap-profiler.cc +85 -1
  155. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap-profiler.h +45 -1
  156. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap.cc +994 -396
  157. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap.h +220 -65
  158. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/assembler-ia32-inl.h +41 -12
  159. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/assembler-ia32.cc +94 -24
  160. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/assembler-ia32.h +32 -4
  161. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/builtins-ia32.cc +42 -30
  162. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/codegen-ia32-inl.h +0 -0
  163. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/codegen-ia32.cc +1758 -916
  164. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/codegen-ia32.h +67 -74
  165. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/cpu-ia32.cc +4 -0
  166. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/debug-ia32.cc +46 -0
  167. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/disasm-ia32.cc +37 -6
  168. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/fast-codegen-ia32.cc +4 -0
  169. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/fast-codegen-ia32.h +0 -0
  170. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/frames-ia32.cc +4 -0
  171. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/frames-ia32.h +0 -0
  172. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/full-codegen-ia32.cc +1465 -198
  173. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/ic-ia32.cc +688 -367
  174. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/jump-target-ia32.cc +4 -0
  175. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/macro-assembler-ia32.cc +82 -180
  176. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/macro-assembler-ia32.h +41 -25
  177. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/regexp-macro-assembler-ia32.cc +68 -24
  178. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/regexp-macro-assembler-ia32.h +1 -2
  179. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/register-allocator-ia32-inl.h +0 -0
  180. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/register-allocator-ia32.cc +4 -0
  181. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/register-allocator-ia32.h +0 -0
  182. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/simulator-ia32.cc +0 -0
  183. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/simulator-ia32.h +0 -0
  184. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/stub-cache-ia32.cc +649 -302
  185. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/virtual-frame-ia32.cc +23 -1
  186. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/virtual-frame-ia32.h +18 -27
  187. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ic-inl.h +30 -3
  188. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ic.cc +384 -66
  189. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ic.h +65 -24
  190. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/interpreter-irregexp.cc +0 -0
  191. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/interpreter-irregexp.h +0 -0
  192. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/json.js +3 -3
  193. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jsregexp.cc +20 -4
  194. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jsregexp.h +0 -0
  195. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-heavy-inl.h +0 -0
  196. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-heavy.cc +79 -13
  197. data/ext/v8/upstream/{2.1.10/src/jump-target.h → 2.3.3/src/jump-target-heavy.h} +5 -47
  198. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-inl.h +0 -0
  199. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-light-inl.h +16 -2
  200. data/ext/v8/upstream/2.3.3/src/jump-target-light.cc +110 -0
  201. data/ext/v8/upstream/2.3.3/src/jump-target-light.h +192 -0
  202. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target.cc +0 -64
  203. data/ext/v8/upstream/2.3.3/src/jump-target.h +90 -0
  204. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/list-inl.h +0 -0
  205. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/list.h +0 -0
  206. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/liveedit-debugger.js +141 -28
  207. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/liveedit.cc +19 -7
  208. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/liveedit.h +0 -0
  209. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log-inl.h +0 -0
  210. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log-utils.cc +0 -0
  211. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log-utils.h +0 -0
  212. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log.cc +12 -11
  213. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log.h +12 -0
  214. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/macro-assembler.h +0 -16
  215. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/macros.py +21 -0
  216. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mark-compact.cc +120 -109
  217. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mark-compact.h +25 -37
  218. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/math.js +0 -0
  219. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/memory.h +0 -0
  220. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/messages.cc +8 -3
  221. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/messages.h +2 -1
  222. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/messages.js +15 -7
  223. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/assembler-mips-inl.h +0 -0
  224. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/assembler-mips.cc +12 -1
  225. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/assembler-mips.h +4 -1
  226. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/builtins-mips.cc +3 -0
  227. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/codegen-mips-inl.h +0 -0
  228. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/codegen-mips.cc +9 -0
  229. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/codegen-mips.h +1 -0
  230. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/constants-mips.cc +5 -0
  231. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/constants-mips.h +0 -0
  232. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/cpu-mips.cc +4 -0
  233. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/debug-mips.cc +3 -0
  234. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/disasm-mips.cc +3 -0
  235. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/fast-codegen-mips.cc +3 -0
  236. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/frames-mips.cc +3 -0
  237. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/frames-mips.h +0 -0
  238. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/full-codegen-mips.cc +5 -1
  239. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/ic-mips.cc +3 -0
  240. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/jump-target-mips.cc +3 -0
  241. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/macro-assembler-mips.cc +3 -0
  242. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/macro-assembler-mips.h +0 -0
  243. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/register-allocator-mips-inl.h +0 -0
  244. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/register-allocator-mips.cc +3 -0
  245. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/register-allocator-mips.h +0 -0
  246. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/simulator-mips.cc +3 -0
  247. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/simulator-mips.h +0 -0
  248. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/stub-cache-mips.cc +3 -0
  249. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/virtual-frame-mips.cc +3 -0
  250. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/virtual-frame-mips.h +0 -0
  251. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mirror-debugger.js +46 -4
  252. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mksnapshot.cc +0 -0
  253. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/natives.h +0 -0
  254. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects-debug.cc +8 -1
  255. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects-inl.h +235 -62
  256. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects.cc +497 -231
  257. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects.h +355 -149
  258. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/oprofile-agent.cc +0 -0
  259. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/oprofile-agent.h +0 -0
  260. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/parser.cc +31 -6
  261. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/parser.h +1 -1
  262. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-freebsd.cc +9 -6
  263. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-linux.cc +26 -6
  264. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-macos.cc +11 -6
  265. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-nullos.cc +0 -0
  266. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-openbsd.cc +6 -0
  267. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-posix.cc +0 -0
  268. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-solaris.cc +69 -23
  269. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-win32.cc +15 -11
  270. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform.h +10 -6
  271. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/powers-ten.h +0 -0
  272. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/prettyprinter.cc +0 -0
  273. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/prettyprinter.h +0 -0
  274. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/profile-generator-inl.h +26 -2
  275. data/ext/v8/upstream/2.3.3/src/profile-generator.cc +1830 -0
  276. data/ext/v8/upstream/2.3.3/src/profile-generator.h +853 -0
  277. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/property.cc +0 -0
  278. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/property.h +0 -0
  279. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-irregexp-inl.h +0 -0
  280. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-irregexp.cc +0 -0
  281. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-irregexp.h +0 -0
  282. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-tracer.cc +0 -0
  283. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-tracer.h +0 -0
  284. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler.cc +1 -3
  285. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler.h +0 -0
  286. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-stack.cc +0 -0
  287. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-stack.h +0 -0
  288. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp.js +25 -4
  289. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/register-allocator-inl.h +0 -0
  290. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/register-allocator.cc +4 -3
  291. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/register-allocator.h +0 -0
  292. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/rewriter.cc +85 -8
  293. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/rewriter.h +0 -0
  294. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/runtime.cc +547 -221
  295. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/runtime.h +5 -1
  296. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/runtime.js +23 -31
  297. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scanner.cc +12 -6
  298. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scanner.h +60 -53
  299. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopeinfo.cc +156 -168
  300. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopeinfo.h +58 -62
  301. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopes.cc +0 -0
  302. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopes.h +0 -0
  303. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/serialize.cc +320 -242
  304. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/serialize.h +81 -48
  305. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/shell.h +0 -0
  306. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/simulator.h +0 -0
  307. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/smart-pointer.h +0 -0
  308. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/snapshot-common.cc +0 -0
  309. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/snapshot-empty.cc +0 -0
  310. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/snapshot.h +0 -0
  311. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/spaces-inl.h +177 -74
  312. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/spaces.cc +138 -315
  313. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/spaces.h +155 -124
  314. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/splay-tree-inl.h +0 -0
  315. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/splay-tree.h +0 -0
  316. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/string-stream.cc +0 -0
  317. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/string-stream.h +0 -0
  318. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/string.js +113 -119
  319. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/stub-cache.cc +242 -97
  320. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/stub-cache.h +118 -55
  321. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/third_party/dtoa/COPYING +0 -0
  322. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/third_party/dtoa/dtoa.c +4 -0
  323. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/third_party/valgrind/valgrind.h +0 -0
  324. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/token.cc +0 -0
  325. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/token.h +0 -0
  326. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/top.cc +107 -26
  327. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/top.h +9 -4
  328. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/type-info.cc +0 -0
  329. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/type-info.h +2 -2
  330. data/ext/v8/upstream/2.3.3/src/unbound-queue-inl.h +95 -0
  331. data/ext/v8/upstream/2.3.3/src/unbound-queue.h +67 -0
  332. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/unicode-inl.h +0 -0
  333. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/unicode.cc +0 -0
  334. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/unicode.h +0 -0
  335. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/uri.js +0 -0
  336. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/utils.cc +0 -0
  337. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/utils.h +83 -1
  338. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8-counters.cc +0 -0
  339. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8-counters.h +20 -0
  340. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8.cc +5 -1
  341. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8.h +0 -0
  342. data/ext/v8/upstream/2.3.3/src/v8dll-main.cc +39 -0
  343. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8natives.js +210 -33
  344. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8threads.cc +1 -1
  345. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8threads.h +1 -1
  346. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/variables.cc +0 -0
  347. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/variables.h +0 -0
  348. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/version.cc +3 -3
  349. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/version.h +0 -0
  350. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-heavy-inl.h +40 -0
  351. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-heavy.cc +0 -0
  352. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-inl.h +0 -0
  353. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-light-inl.h +106 -5
  354. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-light.cc +4 -1
  355. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame.cc +0 -0
  356. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame.h +0 -0
  357. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/vm-state-inl.h +6 -3
  358. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/vm-state.cc +1 -1
  359. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/vm-state.h +6 -4
  360. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/assembler-x64-inl.h +42 -5
  361. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/assembler-x64.cc +285 -53
  362. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/assembler-x64.h +54 -18
  363. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/builtins-x64.cc +31 -33
  364. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/codegen-x64-inl.h +0 -0
  365. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/codegen-x64.cc +9787 -8722
  366. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/codegen-x64.h +82 -47
  367. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/cpu-x64.cc +4 -0
  368. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/debug-x64.cc +55 -6
  369. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/disasm-x64.cc +42 -19
  370. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/fast-codegen-x64.cc +4 -0
  371. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/frames-x64.cc +4 -0
  372. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/frames-x64.h +4 -0
  373. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/full-codegen-x64.cc +1487 -210
  374. data/ext/v8/upstream/2.3.3/src/x64/ic-x64.cc +1907 -0
  375. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/jump-target-x64.cc +4 -0
  376. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/macro-assembler-x64.cc +366 -338
  377. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/macro-assembler-x64.h +83 -38
  378. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/regexp-macro-assembler-x64.cc +82 -23
  379. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/regexp-macro-assembler-x64.h +1 -2
  380. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/register-allocator-x64-inl.h +6 -5
  381. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/register-allocator-x64.cc +4 -0
  382. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/register-allocator-x64.h +1 -1
  383. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/simulator-x64.cc +0 -0
  384. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/simulator-x64.h +0 -0
  385. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/stub-cache-x64.cc +556 -377
  386. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/virtual-frame-x64.cc +197 -98
  387. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/virtual-frame-x64.h +37 -28
  388. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/zone-inl.h +0 -0
  389. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/zone.cc +0 -0
  390. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/zone.h +0 -0
  391. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/codemap.js +0 -0
  392. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/consarray.js +0 -0
  393. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/csvparser.js +0 -0
  394. data/ext/v8/upstream/2.3.3/tools/gc-nvp-trace-processor.py +317 -0
  395. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/generate-ten-powers.scm +0 -0
  396. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/gyp/v8.gyp +87 -20
  397. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/js2c.py +19 -15
  398. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/jsmin.py +0 -0
  399. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/linux-tick-processor +0 -0
  400. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/linux-tick-processor.py +0 -0
  401. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/logreader.js +0 -0
  402. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/mac-nm +0 -0
  403. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/mac-tick-processor +0 -0
  404. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/annotate +0 -0
  405. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/common +0 -0
  406. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/dump +0 -0
  407. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/report +0 -0
  408. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/reset +0 -0
  409. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/run +0 -0
  410. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/shutdown +0 -0
  411. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/start +0 -0
  412. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/presubmit.py +0 -0
  413. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/process-heap-prof.py +0 -0
  414. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/profile.js +0 -0
  415. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/profile_view.js +0 -0
  416. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/run-valgrind.py +0 -0
  417. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/splaytree.js +0 -0
  418. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/splaytree.py +0 -0
  419. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/stats-viewer.py +25 -13
  420. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/test.py +0 -0
  421. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/tickprocessor-driver.js +0 -0
  422. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/tickprocessor.js +0 -0
  423. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/tickprocessor.py +0 -0
  424. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/utils.py +0 -0
  425. data/ext/v8/upstream/2.3.3/tools/v8.xcodeproj/project.pbxproj +1855 -0
  426. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/README.txt +0 -0
  427. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/arm.vsprops +0 -0
  428. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/common.vsprops +0 -0
  429. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8.vcproj +0 -0
  430. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8_arm.vcproj +0 -0
  431. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8_x64.vcproj +0 -0
  432. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8js2c.cmd +0 -0
  433. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/debug.vsprops +0 -0
  434. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/ia32.vsprops +0 -0
  435. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/js2c.cmd +0 -0
  436. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/release.vsprops +0 -0
  437. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8.sln +0 -0
  438. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8.vcproj +0 -0
  439. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_arm.sln +0 -0
  440. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_arm.vcproj +0 -0
  441. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_base.vcproj +40 -0
  442. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_base_arm.vcproj +20 -0
  443. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_base_x64.vcproj +16 -0
  444. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_cctest.vcproj +4 -0
  445. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_cctest_arm.vcproj +0 -0
  446. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_cctest_x64.vcproj +0 -0
  447. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_mksnapshot.vcproj +0 -0
  448. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -0
  449. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_process_sample.vcproj +0 -0
  450. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_process_sample_arm.vcproj +0 -0
  451. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_process_sample_x64.vcproj +0 -0
  452. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_shell_sample.vcproj +0 -0
  453. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_shell_sample_arm.vcproj +0 -0
  454. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_shell_sample_x64.vcproj +0 -0
  455. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot.vcproj +0 -0
  456. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot_cc.vcproj +0 -0
  457. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -0
  458. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot_x64.vcproj +0 -0
  459. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_x64.sln +0 -0
  460. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_x64.vcproj +0 -0
  461. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/x64.vsprops +0 -0
  462. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/windows-tick-processor.bat +0 -0
  463. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/windows-tick-processor.py +0 -0
  464. data/ext/v8/upstream/Makefile +1 -1
  465. data/ext/v8/v8_template.cpp +94 -2
  466. data/ext/v8/v8_try_catch.cpp +2 -2
  467. data/lib/v8.rb +1 -1
  468. data/lib/v8/access.rb +93 -40
  469. data/lib/v8/cli.rb +1 -1
  470. data/lib/v8/function.rb +14 -2
  471. data/spec/redjs/jsapi_spec.rb +231 -42
  472. data/therubyracer.gemspec +3 -3
  473. metadata +463 -453
  474. data/ext/v8/upstream/2.1.10/src/arm/assembler-thumb2-inl.h +0 -263
  475. data/ext/v8/upstream/2.1.10/src/arm/assembler-thumb2.cc +0 -1878
  476. data/ext/v8/upstream/2.1.10/src/arm/assembler-thumb2.h +0 -1036
  477. data/ext/v8/upstream/2.1.10/src/arm/codegen-arm-inl.h +0 -72
  478. data/ext/v8/upstream/2.1.10/src/arm/ic-arm.cc +0 -1833
  479. data/ext/v8/upstream/2.1.10/src/circular-queue-inl.h +0 -101
  480. data/ext/v8/upstream/2.1.10/src/profile-generator.cc +0 -583
  481. data/ext/v8/upstream/2.1.10/src/profile-generator.h +0 -364
  482. data/ext/v8/upstream/2.1.10/src/x64/ic-x64.cc +0 -1621
@@ -27,6 +27,8 @@
27
27
 
28
28
  #include "v8.h"
29
29
 
30
+ #if defined(V8_TARGET_ARCH_X64)
31
+
30
32
  #include "codegen-inl.h"
31
33
  #include "jump-target-inl.h"
32
34
  #include "register-allocator-inl.h"
@@ -431,3 +433,5 @@ void BreakTarget::Bind(Result* arg) {
431
433
 
432
434
 
433
435
  } } // namespace v8::internal
436
+
437
+ #endif // V8_TARGET_ARCH_X64
@@ -27,12 +27,15 @@
27
27
 
28
28
  #include "v8.h"
29
29
 
30
+ #if defined(V8_TARGET_ARCH_X64)
31
+
30
32
  #include "bootstrapper.h"
31
33
  #include "codegen-inl.h"
32
34
  #include "assembler-x64.h"
33
35
  #include "macro-assembler-x64.h"
34
36
  #include "serialize.h"
35
37
  #include "debug.h"
38
+ #include "heap.h"
36
39
 
37
40
  namespace v8 {
38
41
  namespace internal {
@@ -50,6 +53,11 @@ void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) {
50
53
  }
51
54
 
52
55
 
56
+ void MacroAssembler::StoreRoot(Register source, Heap::RootListIndex index) {
57
+ movq(Operand(kRootRegister, index << kPointerSizeLog2), source);
58
+ }
59
+
60
+
53
61
  void MacroAssembler::PushRoot(Heap::RootListIndex index) {
54
62
  push(Operand(kRootRegister, index << kPointerSizeLog2));
55
63
  }
@@ -83,79 +91,35 @@ void MacroAssembler::RecordWriteHelper(Register object,
83
91
  bind(&not_in_new_space);
84
92
  }
85
93
 
86
- Label fast;
87
-
88
94
  // Compute the page start address from the heap object pointer, and reuse
89
95
  // the 'object' register for it.
90
- ASSERT(is_int32(~Page::kPageAlignmentMask));
91
- and_(object,
92
- Immediate(static_cast<int32_t>(~Page::kPageAlignmentMask)));
93
- Register page_start = object;
94
-
95
- // Compute the bit addr in the remembered set/index of the pointer in the
96
- // page. Reuse 'addr' as pointer_offset.
97
- subq(addr, page_start);
98
- shr(addr, Immediate(kPointerSizeLog2));
99
- Register pointer_offset = addr;
100
-
101
- // If the bit offset lies beyond the normal remembered set range, it is in
102
- // the extra remembered set area of a large object.
103
- cmpq(pointer_offset, Immediate(Page::kPageSize / kPointerSize));
104
- j(below, &fast);
105
-
106
- // We have a large object containing pointers. It must be a FixedArray.
107
-
108
- // Adjust 'page_start' so that addressing using 'pointer_offset' hits the
109
- // extra remembered set after the large object.
110
-
111
- // Load the array length into 'scratch'.
112
- movl(scratch,
113
- Operand(page_start,
114
- Page::kObjectStartOffset + FixedArray::kLengthOffset));
115
- Register array_length = scratch;
116
-
117
- // Extra remembered set starts right after the large object (a FixedArray), at
118
- // page_start + kObjectStartOffset + objectSize
119
- // where objectSize is FixedArray::kHeaderSize + kPointerSize * array_length.
120
- // Add the delta between the end of the normal RSet and the start of the
121
- // extra RSet to 'page_start', so that addressing the bit using
122
- // 'pointer_offset' hits the extra RSet words.
123
- lea(page_start,
124
- Operand(page_start, array_length, times_pointer_size,
125
- Page::kObjectStartOffset + FixedArray::kHeaderSize
126
- - Page::kRSetEndOffset));
127
-
128
- // NOTE: For now, we use the bit-test-and-set (bts) x86 instruction
129
- // to limit code size. We should probably evaluate this decision by
130
- // measuring the performance of an equivalent implementation using
131
- // "simpler" instructions
132
- bind(&fast);
133
- bts(Operand(page_start, Page::kRSetOffset), pointer_offset);
134
- }
135
-
136
-
137
- // Set the remembered set bit for [object+offset].
138
- // object is the object being stored into, value is the object being stored.
139
- // If offset is zero, then the smi_index register contains the array index into
140
- // the elements array represented as a smi. Otherwise it can be used as a
141
- // scratch register.
142
- // All registers are clobbered by the operation.
96
+ and_(object, Immediate(~Page::kPageAlignmentMask));
97
+
98
+ // Compute number of region covering addr. See Page::GetRegionNumberForAddress
99
+ // method for more details.
100
+ shrl(addr, Immediate(Page::kRegionSizeLog2));
101
+ andl(addr, Immediate(Page::kPageAlignmentMask >> Page::kRegionSizeLog2));
102
+
103
+ // Set dirty mark for region.
104
+ bts(Operand(object, Page::kDirtyFlagOffset), addr);
105
+ }
106
+
107
+
143
108
  void MacroAssembler::RecordWrite(Register object,
144
109
  int offset,
145
110
  Register value,
146
- Register smi_index) {
111
+ Register index) {
147
112
  // The compiled code assumes that record write doesn't change the
148
113
  // context register, so we check that none of the clobbered
149
114
  // registers are rsi.
150
- ASSERT(!object.is(rsi) && !value.is(rsi) && !smi_index.is(rsi));
115
+ ASSERT(!object.is(rsi) && !value.is(rsi) && !index.is(rsi));
151
116
 
152
- // First, check if a remembered set write is even needed. The tests below
153
- // catch stores of Smis and stores into young gen (which does not have space
154
- // for the remembered set bits).
117
+ // First, check if a write barrier is even needed. The tests below
118
+ // catch stores of Smis and stores into young gen.
155
119
  Label done;
156
120
  JumpIfSmi(value, &done);
157
121
 
158
- RecordWriteNonSmi(object, offset, value, smi_index);
122
+ RecordWriteNonSmi(object, offset, value, index);
159
123
  bind(&done);
160
124
 
161
125
  // Clobber all input registers when running with the debug-code flag
@@ -166,7 +130,36 @@ void MacroAssembler::RecordWrite(Register object,
166
130
  if (FLAG_debug_code) {
167
131
  movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
168
132
  movq(value, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
169
- movq(smi_index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
133
+ movq(index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
134
+ }
135
+ }
136
+
137
+
138
+ void MacroAssembler::RecordWrite(Register object,
139
+ Register address,
140
+ Register value) {
141
+ // The compiled code assumes that record write doesn't change the
142
+ // context register, so we check that none of the clobbered
143
+ // registers are esi.
144
+ ASSERT(!object.is(rsi) && !value.is(rsi) && !address.is(rsi));
145
+
146
+ // First, check if a write barrier is even needed. The tests below
147
+ // catch stores of Smis and stores into young gen.
148
+ Label done;
149
+ JumpIfSmi(value, &done);
150
+
151
+ InNewSpace(object, value, equal, &done);
152
+
153
+ RecordWriteHelper(object, address, value);
154
+
155
+ bind(&done);
156
+
157
+ // Clobber all input registers when running with the debug-code flag
158
+ // turned on to provoke errors.
159
+ if (FLAG_debug_code) {
160
+ movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
161
+ movq(address, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
162
+ movq(value, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
170
163
  }
171
164
  }
172
165
 
@@ -174,7 +167,7 @@ void MacroAssembler::RecordWrite(Register object,
174
167
  void MacroAssembler::RecordWriteNonSmi(Register object,
175
168
  int offset,
176
169
  Register scratch,
177
- Register smi_index) {
170
+ Register index) {
178
171
  Label done;
179
172
 
180
173
  if (FLAG_debug_code) {
@@ -182,10 +175,20 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
182
175
  JumpIfNotSmi(object, &okay);
183
176
  Abort("MacroAssembler::RecordWriteNonSmi cannot deal with smis");
184
177
  bind(&okay);
178
+
179
+ if (offset == 0) {
180
+ // index must be int32.
181
+ Register tmp = index.is(rax) ? rbx : rax;
182
+ push(tmp);
183
+ movl(tmp, index);
184
+ cmpq(tmp, index);
185
+ Check(equal, "Index register for RecordWrite must be untagged int32.");
186
+ pop(tmp);
187
+ }
185
188
  }
186
189
 
187
- // Test that the object address is not in the new space. We cannot
188
- // set remembered set bits in the new space.
190
+ // Test that the object address is not in the new space. We cannot
191
+ // update page dirty marks for new space pages.
189
192
  InNewSpace(object, scratch, equal, &done);
190
193
 
191
194
  // The offset is relative to a tagged or untagged HeapObject pointer,
@@ -194,48 +197,18 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
194
197
  ASSERT(IsAligned(offset, kPointerSize) ||
195
198
  IsAligned(offset + kHeapObjectTag, kPointerSize));
196
199
 
197
- // We use optimized write barrier code if the word being written to is not in
198
- // a large object page, or is in the first "page" of a large object page.
199
- // We make sure that an offset is inside the right limits whether it is
200
- // tagged or untagged.
201
- if ((offset > 0) && (offset < Page::kMaxHeapObjectSize - kHeapObjectTag)) {
202
- // Compute the bit offset in the remembered set, leave it in 'scratch'.
203
- lea(scratch, Operand(object, offset));
204
- ASSERT(is_int32(Page::kPageAlignmentMask));
205
- and_(scratch, Immediate(static_cast<int32_t>(Page::kPageAlignmentMask)));
206
- shr(scratch, Immediate(kPointerSizeLog2));
207
-
208
- // Compute the page address from the heap object pointer, leave it in
209
- // 'object' (immediate value is sign extended).
210
- and_(object, Immediate(~Page::kPageAlignmentMask));
211
-
212
- // NOTE: For now, we use the bit-test-and-set (bts) x86 instruction
213
- // to limit code size. We should probably evaluate this decision by
214
- // measuring the performance of an equivalent implementation using
215
- // "simpler" instructions
216
- bts(Operand(object, Page::kRSetOffset), scratch);
200
+ Register dst = index;
201
+ if (offset != 0) {
202
+ lea(dst, Operand(object, offset));
217
203
  } else {
218
- Register dst = smi_index;
219
- if (offset != 0) {
220
- lea(dst, Operand(object, offset));
221
- } else {
222
- // array access: calculate the destination address in the same manner as
223
- // KeyedStoreIC::GenerateGeneric.
224
- SmiIndex index = SmiToIndex(smi_index, smi_index, kPointerSizeLog2);
225
- lea(dst, FieldOperand(object,
226
- index.reg,
227
- index.scale,
228
- FixedArray::kHeaderSize));
229
- }
230
- // If we are already generating a shared stub, not inlining the
231
- // record write code isn't going to save us any memory.
232
- if (generating_stub()) {
233
- RecordWriteHelper(object, dst, scratch);
234
- } else {
235
- RecordWriteStub stub(object, dst, scratch);
236
- CallStub(&stub);
237
- }
204
+ // array access: calculate the destination address in the same manner as
205
+ // KeyedStoreIC::GenerateGeneric.
206
+ lea(dst, FieldOperand(object,
207
+ index,
208
+ times_pointer_size,
209
+ FixedArray::kHeaderSize));
238
210
  }
211
+ RecordWriteHelper(object, dst, scratch);
239
212
 
240
213
  bind(&done);
241
214
 
@@ -244,7 +217,7 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
244
217
  if (FLAG_debug_code) {
245
218
  movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
246
219
  movq(scratch, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
247
- movq(smi_index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
220
+ movq(index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
248
221
  }
249
222
  }
250
223
 
@@ -401,7 +374,7 @@ void MacroAssembler::CallRuntime(Runtime::Function* f, int num_arguments) {
401
374
  // arguments passed in because it is constant. At some point we
402
375
  // should remove this need and make the runtime routine entry code
403
376
  // smarter.
404
- movq(rax, Immediate(num_arguments));
377
+ Set(rax, num_arguments);
405
378
  movq(rbx, ExternalReference(f));
406
379
  CEntryStub ces(f->result_size);
407
380
  CallStub(&ces);
@@ -410,7 +383,7 @@ void MacroAssembler::CallRuntime(Runtime::Function* f, int num_arguments) {
410
383
 
411
384
  void MacroAssembler::CallExternalReference(const ExternalReference& ext,
412
385
  int num_arguments) {
413
- movq(rax, Immediate(num_arguments));
386
+ Set(rax, num_arguments);
414
387
  movq(rbx, ext);
415
388
 
416
389
  CEntryStub stub(1);
@@ -432,7 +405,7 @@ void MacroAssembler::TailCallExternalReference(const ExternalReference& ext,
432
405
  // arguments passed in because it is constant. At some point we
433
406
  // should remove this need and make the runtime routine entry code
434
407
  // smarter.
435
- movq(rax, Immediate(num_arguments));
408
+ Set(rax, num_arguments);
436
409
  JumpToExternalReference(ext, result_size);
437
410
  }
438
411
 
@@ -494,7 +467,7 @@ void MacroAssembler::GetBuiltinEntry(Register target, Builtins::JavaScript id) {
494
467
 
495
468
  void MacroAssembler::Set(Register dst, int64_t x) {
496
469
  if (x == 0) {
497
- xor_(dst, dst);
470
+ xorl(dst, dst);
498
471
  } else if (is_int32(x)) {
499
472
  movq(dst, Immediate(static_cast<int32_t>(x)));
500
473
  } else if (is_uint32(x)) {
@@ -504,15 +477,9 @@ void MacroAssembler::Set(Register dst, int64_t x) {
504
477
  }
505
478
  }
506
479
 
507
-
508
480
  void MacroAssembler::Set(const Operand& dst, int64_t x) {
509
- if (x == 0) {
510
- xor_(kScratchRegister, kScratchRegister);
511
- movq(dst, kScratchRegister);
512
- } else if (is_int32(x)) {
481
+ if (is_int32(x)) {
513
482
  movq(dst, Immediate(static_cast<int32_t>(x)));
514
- } else if (is_uint32(x)) {
515
- movl(dst, Immediate(static_cast<uint32_t>(x)));
516
483
  } else {
517
484
  movq(kScratchRegister, x, RelocInfo::NONE);
518
485
  movq(dst, kScratchRegister);
@@ -524,6 +491,78 @@ void MacroAssembler::Set(const Operand& dst, int64_t x) {
524
491
 
525
492
  static int kSmiShift = kSmiTagSize + kSmiShiftSize;
526
493
 
494
+ Register MacroAssembler::GetSmiConstant(Smi* source) {
495
+ int value = source->value();
496
+ if (value == 0) {
497
+ xorl(kScratchRegister, kScratchRegister);
498
+ return kScratchRegister;
499
+ }
500
+ if (value == 1) {
501
+ return kSmiConstantRegister;
502
+ }
503
+ LoadSmiConstant(kScratchRegister, source);
504
+ return kScratchRegister;
505
+ }
506
+
507
+ void MacroAssembler::LoadSmiConstant(Register dst, Smi* source) {
508
+ if (FLAG_debug_code) {
509
+ movq(dst,
510
+ reinterpret_cast<uint64_t>(Smi::FromInt(kSmiConstantRegisterValue)),
511
+ RelocInfo::NONE);
512
+ cmpq(dst, kSmiConstantRegister);
513
+ if (allow_stub_calls()) {
514
+ Assert(equal, "Uninitialized kSmiConstantRegister");
515
+ } else {
516
+ Label ok;
517
+ j(equal, &ok);
518
+ int3();
519
+ bind(&ok);
520
+ }
521
+ }
522
+ if (source->value() == 0) {
523
+ xorl(dst, dst);
524
+ return;
525
+ }
526
+ int value = source->value();
527
+ bool negative = value < 0;
528
+ unsigned int uvalue = negative ? -value : value;
529
+
530
+ switch (uvalue) {
531
+ case 9:
532
+ lea(dst, Operand(kSmiConstantRegister, kSmiConstantRegister, times_8, 0));
533
+ break;
534
+ case 8:
535
+ xorl(dst, dst);
536
+ lea(dst, Operand(dst, kSmiConstantRegister, times_8, 0));
537
+ break;
538
+ case 4:
539
+ xorl(dst, dst);
540
+ lea(dst, Operand(dst, kSmiConstantRegister, times_4, 0));
541
+ break;
542
+ case 5:
543
+ lea(dst, Operand(kSmiConstantRegister, kSmiConstantRegister, times_4, 0));
544
+ break;
545
+ case 3:
546
+ lea(dst, Operand(kSmiConstantRegister, kSmiConstantRegister, times_2, 0));
547
+ break;
548
+ case 2:
549
+ lea(dst, Operand(kSmiConstantRegister, kSmiConstantRegister, times_1, 0));
550
+ break;
551
+ case 1:
552
+ movq(dst, kSmiConstantRegister);
553
+ break;
554
+ case 0:
555
+ UNREACHABLE();
556
+ return;
557
+ default:
558
+ movq(dst, reinterpret_cast<uint64_t>(source), RelocInfo::NONE);
559
+ return;
560
+ }
561
+ if (negative) {
562
+ neg(dst);
563
+ }
564
+ }
565
+
527
566
  void MacroAssembler::Integer32ToSmi(Register dst, Register src) {
528
567
  ASSERT_EQ(0, kSmiTag);
529
568
  if (!dst.is(src)) {
@@ -545,6 +584,23 @@ void MacroAssembler::Integer32ToSmi(Register dst,
545
584
  }
546
585
 
547
586
 
587
+ void MacroAssembler::Integer32ToSmiField(const Operand& dst, Register src) {
588
+ if (FLAG_debug_code) {
589
+ testb(dst, Immediate(0x01));
590
+ Label ok;
591
+ j(zero, &ok);
592
+ if (allow_stub_calls()) {
593
+ Abort("Integer32ToSmiField writing to non-smi location");
594
+ } else {
595
+ int3();
596
+ }
597
+ bind(&ok);
598
+ }
599
+ ASSERT(kSmiShift % kBitsPerByte == 0);
600
+ movl(Operand(dst, kSmiShift / kBitsPerByte), src);
601
+ }
602
+
603
+
548
604
  void MacroAssembler::Integer64PlusConstantToSmi(Register dst,
549
605
  Register src,
550
606
  int constant) {
@@ -566,6 +622,11 @@ void MacroAssembler::SmiToInteger32(Register dst, Register src) {
566
622
  }
567
623
 
568
624
 
625
+ void MacroAssembler::SmiToInteger32(Register dst, const Operand& src) {
626
+ movl(dst, Operand(src, kSmiShift / kBitsPerByte));
627
+ }
628
+
629
+
569
630
  void MacroAssembler::SmiToInteger64(Register dst, Register src) {
570
631
  ASSERT_EQ(0, kSmiTag);
571
632
  if (!dst.is(src)) {
@@ -575,6 +636,11 @@ void MacroAssembler::SmiToInteger64(Register dst, Register src) {
575
636
  }
576
637
 
577
638
 
639
+ void MacroAssembler::SmiToInteger64(Register dst, const Operand& src) {
640
+ movsxlq(dst, Operand(src, kSmiShift / kBitsPerByte));
641
+ }
642
+
643
+
578
644
  void MacroAssembler::SmiTest(Register src) {
579
645
  testq(src, src);
580
646
  }
@@ -596,7 +662,7 @@ void MacroAssembler::SmiCompare(Register dst, Smi* src) {
596
662
  }
597
663
 
598
664
 
599
- void MacroAssembler::SmiCompare(Register dst, const Operand& src) {
665
+ void MacroAssembler::SmiCompare(Register dst, const Operand& src) {
600
666
  cmpq(dst, src);
601
667
  }
602
668
 
@@ -607,13 +673,12 @@ void MacroAssembler::SmiCompare(const Operand& dst, Register src) {
607
673
 
608
674
 
609
675
  void MacroAssembler::SmiCompare(const Operand& dst, Smi* src) {
610
- if (src->value() == 0) {
611
- // Only tagged long smi to have 32-bit representation.
612
- cmpq(dst, Immediate(0));
613
- } else {
614
- Move(kScratchRegister, src);
615
- cmpq(dst, kScratchRegister);
616
- }
676
+ cmpl(Operand(dst, kSmiShift / kBitsPerByte), Immediate(src->value()));
677
+ }
678
+
679
+
680
+ void MacroAssembler::SmiCompareInteger32(const Operand& dst, Register src) {
681
+ cmpl(Operand(dst, kSmiShift / kBitsPerByte), src);
617
682
  }
618
683
 
619
684
 
@@ -637,6 +702,18 @@ void MacroAssembler::PositiveSmiTimesPowerOfTwoToInteger64(Register dst,
637
702
  }
638
703
 
639
704
 
705
+ void MacroAssembler::PositiveSmiDivPowerOfTwoToInteger32(Register dst,
706
+ Register src,
707
+ int power) {
708
+ ASSERT((0 <= power) && (power < 32));
709
+ if (dst.is(src)) {
710
+ shr(dst, Immediate(power + kSmiShift));
711
+ } else {
712
+ UNIMPLEMENTED(); // Not used.
713
+ }
714
+ }
715
+
716
+
640
717
  Condition MacroAssembler::CheckSmi(Register src) {
641
718
  ASSERT_EQ(0, kSmiTag);
642
719
  testb(src, Immediate(kSmiTagMask));
@@ -646,9 +723,10 @@ Condition MacroAssembler::CheckSmi(Register src) {
646
723
 
647
724
  Condition MacroAssembler::CheckPositiveSmi(Register src) {
648
725
  ASSERT_EQ(0, kSmiTag);
726
+ // Make mask 0x8000000000000001 and test that both bits are zero.
649
727
  movq(kScratchRegister, src);
650
728
  rol(kScratchRegister, Immediate(1));
651
- testl(kScratchRegister, Immediate(0x03));
729
+ testb(kScratchRegister, Immediate(3));
652
730
  return zero;
653
731
  }
654
732
 
@@ -657,9 +735,9 @@ Condition MacroAssembler::CheckBothSmi(Register first, Register second) {
657
735
  if (first.is(second)) {
658
736
  return CheckSmi(first);
659
737
  }
660
- movl(kScratchRegister, first);
661
- orl(kScratchRegister, second);
662
- testb(kScratchRegister, Immediate(kSmiTagMask));
738
+ ASSERT(kSmiTag == 0 && kHeapObjectTag == 1 && kHeapObjectTagMask == 3);
739
+ leal(kScratchRegister, Operand(first, second, times_1, 0));
740
+ testb(kScratchRegister, Immediate(0x03));
663
741
  return zero;
664
742
  }
665
743
 
@@ -669,15 +747,14 @@ Condition MacroAssembler::CheckBothPositiveSmi(Register first,
669
747
  if (first.is(second)) {
670
748
  return CheckPositiveSmi(first);
671
749
  }
672
- movl(kScratchRegister, first);
673
- orl(kScratchRegister, second);
750
+ movq(kScratchRegister, first);
751
+ or_(kScratchRegister, second);
674
752
  rol(kScratchRegister, Immediate(1));
675
753
  testl(kScratchRegister, Immediate(0x03));
676
754
  return zero;
677
755
  }
678
756
 
679
757
 
680
-
681
758
  Condition MacroAssembler::CheckEitherSmi(Register first, Register second) {
682
759
  if (first.is(second)) {
683
760
  return CheckSmi(first);
@@ -690,11 +767,10 @@ Condition MacroAssembler::CheckEitherSmi(Register first, Register second) {
690
767
 
691
768
 
692
769
  Condition MacroAssembler::CheckIsMinSmi(Register src) {
693
- ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
694
- movq(kScratchRegister, src);
695
- rol(kScratchRegister, Immediate(1));
696
- cmpq(kScratchRegister, Immediate(1));
697
- return equal;
770
+ ASSERT(!src.is(kScratchRegister));
771
+ // If we overflow by subtracting one, it's the minimal smi value.
772
+ cmpq(src, kSmiConstantRegister);
773
+ return overflow;
698
774
  }
699
775
 
700
776
 
@@ -707,8 +783,8 @@ Condition MacroAssembler::CheckInteger32ValidSmiValue(Register src) {
707
783
  Condition MacroAssembler::CheckUInteger32ValidSmiValue(Register src) {
708
784
  // An unsigned 32-bit integer value is valid as long as the high bit
709
785
  // is not set.
710
- testq(src, Immediate(0x80000000));
711
- return zero;
786
+ testl(src, src);
787
+ return positive;
712
788
  }
713
789
 
714
790
 
@@ -745,15 +821,12 @@ void MacroAssembler::SmiAdd(Register dst,
745
821
  movq(dst, src1);
746
822
  addq(dst, src2);
747
823
  }
748
- Assert(no_overflow, "Smi addition onverflow");
824
+ Assert(no_overflow, "Smi addition overflow");
749
825
  } else if (dst.is(src1)) {
750
- addq(dst, src2);
751
- Label smi_result;
752
- j(no_overflow, &smi_result);
753
- // Restore src1.
754
- subq(src1, src2);
755
- jmp(on_not_smi_result);
756
- bind(&smi_result);
826
+ movq(kScratchRegister, src1);
827
+ addq(kScratchRegister, src2);
828
+ j(overflow, on_not_smi_result);
829
+ movq(dst, kScratchRegister);
757
830
  } else {
758
831
  movq(dst, src1);
759
832
  addq(dst, src2);
@@ -776,15 +849,11 @@ void MacroAssembler::SmiSub(Register dst,
776
849
  movq(dst, src1);
777
850
  subq(dst, src2);
778
851
  }
779
- Assert(no_overflow, "Smi substraction onverflow");
852
+ Assert(no_overflow, "Smi subtraction overflow");
780
853
  } else if (dst.is(src1)) {
854
+ cmpq(dst, src2);
855
+ j(overflow, on_not_smi_result);
781
856
  subq(dst, src2);
782
- Label smi_result;
783
- j(no_overflow, &smi_result);
784
- // Restore src1.
785
- addq(src1, src2);
786
- jmp(on_not_smi_result);
787
- bind(&smi_result);
788
857
  } else {
789
858
  movq(dst, src1);
790
859
  subq(dst, src2);
@@ -795,7 +864,7 @@ void MacroAssembler::SmiSub(Register dst,
795
864
 
796
865
  void MacroAssembler::SmiSub(Register dst,
797
866
  Register src1,
798
- Operand const& src2,
867
+ const Operand& src2,
799
868
  Label* on_not_smi_result) {
800
869
  if (on_not_smi_result == NULL) {
801
870
  // No overflow checking. Use only when it's known that
@@ -806,15 +875,12 @@ void MacroAssembler::SmiSub(Register dst,
806
875
  movq(dst, src1);
807
876
  subq(dst, src2);
808
877
  }
809
- Assert(no_overflow, "Smi substraction onverflow");
878
+ Assert(no_overflow, "Smi subtraction overflow");
810
879
  } else if (dst.is(src1)) {
811
- subq(dst, src2);
812
- Label smi_result;
813
- j(no_overflow, &smi_result);
814
- // Restore src1.
815
- addq(src1, src2);
816
- jmp(on_not_smi_result);
817
- bind(&smi_result);
880
+ movq(kScratchRegister, src2);
881
+ cmpq(src1, kScratchRegister);
882
+ j(overflow, on_not_smi_result);
883
+ subq(src1, kScratchRegister);
818
884
  } else {
819
885
  movq(dst, src1);
820
886
  subq(dst, src2);
@@ -887,7 +953,7 @@ void MacroAssembler::SmiTryAddConstant(Register dst,
887
953
 
888
954
  JumpIfNotSmi(src, on_not_smi_result);
889
955
  Register tmp = (dst.is(src) ? kScratchRegister : dst);
890
- Move(tmp, constant);
956
+ LoadSmiConstant(tmp, constant);
891
957
  addq(tmp, src);
892
958
  j(overflow, on_not_smi_result);
893
959
  if (dst.is(src)) {
@@ -901,14 +967,53 @@ void MacroAssembler::SmiAddConstant(Register dst, Register src, Smi* constant) {
901
967
  if (!dst.is(src)) {
902
968
  movq(dst, src);
903
969
  }
970
+ return;
904
971
  } else if (dst.is(src)) {
905
972
  ASSERT(!dst.is(kScratchRegister));
906
-
907
- Move(kScratchRegister, constant);
908
- addq(dst, kScratchRegister);
973
+ switch (constant->value()) {
974
+ case 1:
975
+ addq(dst, kSmiConstantRegister);
976
+ return;
977
+ case 2:
978
+ lea(dst, Operand(src, kSmiConstantRegister, times_2, 0));
979
+ return;
980
+ case 4:
981
+ lea(dst, Operand(src, kSmiConstantRegister, times_4, 0));
982
+ return;
983
+ case 8:
984
+ lea(dst, Operand(src, kSmiConstantRegister, times_8, 0));
985
+ return;
986
+ default:
987
+ Register constant_reg = GetSmiConstant(constant);
988
+ addq(dst, constant_reg);
989
+ return;
990
+ }
909
991
  } else {
910
- Move(dst, constant);
911
- addq(dst, src);
992
+ switch (constant->value()) {
993
+ case 1:
994
+ lea(dst, Operand(src, kSmiConstantRegister, times_1, 0));
995
+ return;
996
+ case 2:
997
+ lea(dst, Operand(src, kSmiConstantRegister, times_2, 0));
998
+ return;
999
+ case 4:
1000
+ lea(dst, Operand(src, kSmiConstantRegister, times_4, 0));
1001
+ return;
1002
+ case 8:
1003
+ lea(dst, Operand(src, kSmiConstantRegister, times_8, 0));
1004
+ return;
1005
+ default:
1006
+ LoadSmiConstant(dst, constant);
1007
+ addq(dst, src);
1008
+ return;
1009
+ }
1010
+ }
1011
+ }
1012
+
1013
+
1014
+ void MacroAssembler::SmiAddConstant(const Operand& dst, Smi* constant) {
1015
+ if (constant->value() != 0) {
1016
+ addl(Operand(dst, kSmiShift / kBitsPerByte), Immediate(constant->value()));
912
1017
  }
913
1018
  }
914
1019
 
@@ -924,15 +1029,12 @@ void MacroAssembler::SmiAddConstant(Register dst,
924
1029
  } else if (dst.is(src)) {
925
1030
  ASSERT(!dst.is(kScratchRegister));
926
1031
 
927
- Move(kScratchRegister, constant);
928
- addq(dst, kScratchRegister);
929
- Label result_ok;
930
- j(no_overflow, &result_ok);
931
- subq(dst, kScratchRegister);
932
- jmp(on_not_smi_result);
933
- bind(&result_ok);
1032
+ LoadSmiConstant(kScratchRegister, constant);
1033
+ addq(kScratchRegister, src);
1034
+ j(overflow, on_not_smi_result);
1035
+ movq(dst, kScratchRegister);
934
1036
  } else {
935
- Move(dst, constant);
1037
+ LoadSmiConstant(dst, constant);
936
1038
  addq(dst, src);
937
1039
  j(overflow, on_not_smi_result);
938
1040
  }
@@ -946,17 +1048,17 @@ void MacroAssembler::SmiSubConstant(Register dst, Register src, Smi* constant) {
946
1048
  }
947
1049
  } else if (dst.is(src)) {
948
1050
  ASSERT(!dst.is(kScratchRegister));
949
-
950
- Move(kScratchRegister, constant);
951
- subq(dst, kScratchRegister);
1051
+ Register constant_reg = GetSmiConstant(constant);
1052
+ subq(dst, constant_reg);
952
1053
  } else {
953
- // Subtract by adding the negative, to do it in two operations.
954
1054
  if (constant->value() == Smi::kMinValue) {
955
- Move(kScratchRegister, constant);
956
- movq(dst, src);
957
- subq(dst, kScratchRegister);
1055
+ LoadSmiConstant(dst, constant);
1056
+ // Adding and subtracting the min-value gives the same result, it only
1057
+ // differs on the overflow bit, which we don't check here.
1058
+ addq(dst, src);
958
1059
  } else {
959
- Move(dst, Smi::FromInt(-constant->value()));
1060
+ // Subtract by adding the negation.
1061
+ LoadSmiConstant(dst, Smi::FromInt(-constant->value()));
960
1062
  addq(dst, src);
961
1063
  }
962
1064
  }
@@ -973,22 +1075,33 @@ void MacroAssembler::SmiSubConstant(Register dst,
973
1075
  }
974
1076
  } else if (dst.is(src)) {
975
1077
  ASSERT(!dst.is(kScratchRegister));
976
-
977
- Move(kScratchRegister, constant);
978
- subq(dst, kScratchRegister);
979
- Label sub_success;
980
- j(no_overflow, &sub_success);
981
- addq(src, kScratchRegister);
982
- jmp(on_not_smi_result);
983
- bind(&sub_success);
984
- } else {
985
1078
  if (constant->value() == Smi::kMinValue) {
986
- Move(kScratchRegister, constant);
987
- movq(dst, src);
1079
+ // Subtracting min-value from any non-negative value will overflow.
1080
+ // We test the non-negativeness before doing the subtraction.
1081
+ testq(src, src);
1082
+ j(not_sign, on_not_smi_result);
1083
+ LoadSmiConstant(kScratchRegister, constant);
988
1084
  subq(dst, kScratchRegister);
1085
+ } else {
1086
+ // Subtract by adding the negation.
1087
+ LoadSmiConstant(kScratchRegister, Smi::FromInt(-constant->value()));
1088
+ addq(kScratchRegister, dst);
989
1089
  j(overflow, on_not_smi_result);
1090
+ movq(dst, kScratchRegister);
1091
+ }
1092
+ } else {
1093
+ if (constant->value() == Smi::kMinValue) {
1094
+ // Subtracting min-value from any non-negative value will overflow.
1095
+ // We test the non-negativeness before doing the subtraction.
1096
+ testq(src, src);
1097
+ j(not_sign, on_not_smi_result);
1098
+ LoadSmiConstant(dst, constant);
1099
+ // Adding and subtracting the min-value gives the same result, it only
1100
+ // differs on the overflow bit, which we don't check here.
1101
+ addq(dst, src);
990
1102
  } else {
991
- Move(dst, Smi::FromInt(-(constant->value())));
1103
+ // Subtract by adding the negation.
1104
+ LoadSmiConstant(dst, Smi::FromInt(-(constant->value())));
992
1105
  addq(dst, src);
993
1106
  j(overflow, on_not_smi_result);
994
1107
  }
@@ -1142,10 +1255,10 @@ void MacroAssembler::SmiAndConstant(Register dst, Register src, Smi* constant) {
1142
1255
  xor_(dst, dst);
1143
1256
  } else if (dst.is(src)) {
1144
1257
  ASSERT(!dst.is(kScratchRegister));
1145
- Move(kScratchRegister, constant);
1146
- and_(dst, kScratchRegister);
1258
+ Register constant_reg = GetSmiConstant(constant);
1259
+ and_(dst, constant_reg);
1147
1260
  } else {
1148
- Move(dst, constant);
1261
+ LoadSmiConstant(dst, constant);
1149
1262
  and_(dst, src);
1150
1263
  }
1151
1264
  }
@@ -1162,10 +1275,10 @@ void MacroAssembler::SmiOr(Register dst, Register src1, Register src2) {
1162
1275
  void MacroAssembler::SmiOrConstant(Register dst, Register src, Smi* constant) {
1163
1276
  if (dst.is(src)) {
1164
1277
  ASSERT(!dst.is(kScratchRegister));
1165
- Move(kScratchRegister, constant);
1166
- or_(dst, kScratchRegister);
1278
+ Register constant_reg = GetSmiConstant(constant);
1279
+ or_(dst, constant_reg);
1167
1280
  } else {
1168
- Move(dst, constant);
1281
+ LoadSmiConstant(dst, constant);
1169
1282
  or_(dst, src);
1170
1283
  }
1171
1284
  }
@@ -1182,10 +1295,10 @@ void MacroAssembler::SmiXor(Register dst, Register src1, Register src2) {
1182
1295
  void MacroAssembler::SmiXorConstant(Register dst, Register src, Smi* constant) {
1183
1296
  if (dst.is(src)) {
1184
1297
  ASSERT(!dst.is(kScratchRegister));
1185
- Move(kScratchRegister, constant);
1186
- xor_(dst, kScratchRegister);
1298
+ Register constant_reg = GetSmiConstant(constant);
1299
+ xor_(dst, constant_reg);
1187
1300
  } else {
1188
- Move(dst, constant);
1301
+ LoadSmiConstant(dst, constant);
1189
1302
  xor_(dst, src);
1190
1303
  }
1191
1304
  }
@@ -1227,8 +1340,7 @@ void MacroAssembler::SmiShiftLogicalRightConstant(Register dst,
1227
1340
 
1228
1341
  void MacroAssembler::SmiShiftLeftConstant(Register dst,
1229
1342
  Register src,
1230
- int shift_value,
1231
- Label* on_not_smi_result) {
1343
+ int shift_value) {
1232
1344
  if (!dst.is(src)) {
1233
1345
  movq(dst, src);
1234
1346
  }
@@ -1240,8 +1352,7 @@ void MacroAssembler::SmiShiftLeftConstant(Register dst,
1240
1352
 
1241
1353
  void MacroAssembler::SmiShiftLeft(Register dst,
1242
1354
  Register src1,
1243
- Register src2,
1244
- Label* on_not_smi_result) {
1355
+ Register src2) {
1245
1356
  ASSERT(!dst.is(rcx));
1246
1357
  Label result_ok;
1247
1358
  // Untag shift amount.
@@ -1355,6 +1466,7 @@ void MacroAssembler::SelectNonSmi(Register dst,
1355
1466
  // If src1 is a smi, dst is src2, else it is src1, i.e., the non-smi.
1356
1467
  }
1357
1468
 
1469
+
1358
1470
  SmiIndex MacroAssembler::SmiToIndex(Register dst,
1359
1471
  Register src,
1360
1472
  int shift) {
@@ -1580,8 +1692,8 @@ void MacroAssembler::Push(Smi* source) {
1580
1692
  if (is_int32(smi)) {
1581
1693
  push(Immediate(static_cast<int32_t>(smi)));
1582
1694
  } else {
1583
- Set(kScratchRegister, smi);
1584
- push(kScratchRegister);
1695
+ Register constant = GetSmiConstant(source);
1696
+ push(constant);
1585
1697
  }
1586
1698
  }
1587
1699
 
@@ -1594,13 +1706,7 @@ void MacroAssembler::Drop(int stack_elements) {
1594
1706
 
1595
1707
 
1596
1708
  void MacroAssembler::Test(const Operand& src, Smi* source) {
1597
- intptr_t smi = reinterpret_cast<intptr_t>(source);
1598
- if (is_int32(smi)) {
1599
- testl(src, Immediate(static_cast<int32_t>(smi)));
1600
- } else {
1601
- Move(kScratchRegister, source);
1602
- testq(src, kScratchRegister);
1603
- }
1709
+ testl(Operand(src, kIntSize), Immediate(source->value()));
1604
1710
  }
1605
1711
 
1606
1712
 
@@ -1696,8 +1802,7 @@ void MacroAssembler::Ret() {
1696
1802
 
1697
1803
  void MacroAssembler::FCmp() {
1698
1804
  fucomip();
1699
- ffree(0);
1700
- fincstp();
1805
+ fstp(0);
1701
1806
  }
1702
1807
 
1703
1808
 
@@ -1727,26 +1832,35 @@ void MacroAssembler::CheckMap(Register obj,
1727
1832
  }
1728
1833
 
1729
1834
 
1730
- void MacroAssembler::AbortIfNotNumber(Register object, const char* msg) {
1835
+ void MacroAssembler::AbortIfNotNumber(Register object) {
1731
1836
  Label ok;
1732
1837
  Condition is_smi = CheckSmi(object);
1733
1838
  j(is_smi, &ok);
1734
1839
  Cmp(FieldOperand(object, HeapObject::kMapOffset),
1735
1840
  Factory::heap_number_map());
1736
- Assert(equal, msg);
1841
+ Assert(equal, "Operand not a number");
1737
1842
  bind(&ok);
1738
1843
  }
1739
1844
 
1740
1845
 
1741
- void MacroAssembler::AbortIfNotSmi(Register object, const char* msg) {
1846
+ void MacroAssembler::AbortIfNotSmi(Register object) {
1742
1847
  Label ok;
1743
1848
  Condition is_smi = CheckSmi(object);
1744
- j(is_smi, &ok);
1745
- Assert(equal, msg);
1746
- bind(&ok);
1849
+ Assert(is_smi, "Operand not a smi");
1850
+ }
1851
+
1852
+
1853
+ void MacroAssembler::AbortIfNotRootValue(Register src,
1854
+ Heap::RootListIndex root_value_index,
1855
+ const char* message) {
1856
+ ASSERT(!src.is(kScratchRegister));
1857
+ LoadRoot(kScratchRegister, root_value_index);
1858
+ cmpq(src, kScratchRegister);
1859
+ Check(equal, message);
1747
1860
  }
1748
1861
 
1749
1862
 
1863
+
1750
1864
  Condition MacroAssembler::IsObjectStringType(Register heap_object,
1751
1865
  Register map,
1752
1866
  Register instance_type) {
@@ -1947,7 +2061,7 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
1947
2061
  if (expected.immediate() == actual.immediate()) {
1948
2062
  definitely_matches = true;
1949
2063
  } else {
1950
- movq(rax, Immediate(actual.immediate()));
2064
+ Set(rax, actual.immediate());
1951
2065
  if (expected.immediate() ==
1952
2066
  SharedFunctionInfo::kDontAdaptArgumentsSentinel) {
1953
2067
  // Don't worry about adapting arguments for built-ins that
@@ -1956,7 +2070,7 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
1956
2070
  // arguments.
1957
2071
  definitely_matches = true;
1958
2072
  } else {
1959
- movq(rbx, Immediate(expected.immediate()));
2073
+ Set(rbx, expected.immediate());
1960
2074
  }
1961
2075
  }
1962
2076
  } else {
@@ -1967,7 +2081,7 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
1967
2081
  cmpq(expected.reg(), Immediate(actual.immediate()));
1968
2082
  j(equal, &invoke);
1969
2083
  ASSERT(expected.reg().is(rbx));
1970
- movq(rax, Immediate(actual.immediate()));
2084
+ Set(rax, actual.immediate());
1971
2085
  } else if (!expected.reg().is(actual.reg())) {
1972
2086
  // Both expected and actual are in (different) registers. This
1973
2087
  // is the case when we invoke functions using call and apply.
@@ -2119,10 +2233,10 @@ void MacroAssembler::EnterExitFrame(ExitFrame::Mode mode, int result_size) {
2119
2233
  movq(rax, rsi);
2120
2234
  store_rax(context_address);
2121
2235
 
2122
- // Setup argv in callee-saved register r15. It is reused in LeaveExitFrame,
2236
+ // Setup argv in callee-saved register r12. It is reused in LeaveExitFrame,
2123
2237
  // so it must be retained across the C-call.
2124
2238
  int offset = StandardFrameConstants::kCallerSPOffset - kPointerSize;
2125
- lea(r15, Operand(rbp, r14, times_pointer_size, offset));
2239
+ lea(r12, Operand(rbp, r14, times_pointer_size, offset));
2126
2240
 
2127
2241
  #ifdef ENABLE_DEBUGGER_SUPPORT
2128
2242
  // Save the state of all registers to the stack from the memory
@@ -2168,7 +2282,7 @@ void MacroAssembler::EnterExitFrame(ExitFrame::Mode mode, int result_size) {
2168
2282
 
2169
2283
  void MacroAssembler::LeaveExitFrame(ExitFrame::Mode mode, int result_size) {
2170
2284
  // Registers:
2171
- // r15 : argv
2285
+ // r12 : argv
2172
2286
  #ifdef ENABLE_DEBUGGER_SUPPORT
2173
2287
  // Restore the memory copy of the registers by digging them out from
2174
2288
  // the stack. This is needed to allow nested break points.
@@ -2188,7 +2302,7 @@ void MacroAssembler::LeaveExitFrame(ExitFrame::Mode mode, int result_size) {
2188
2302
 
2189
2303
  // Pop everything up to and including the arguments and the receiver
2190
2304
  // from the caller stack.
2191
- lea(rsp, Operand(r15, 1 * kPointerSize));
2305
+ lea(rsp, Operand(r12, 1 * kPointerSize));
2192
2306
 
2193
2307
  // Restore current context from top and clear it in debug mode.
2194
2308
  ExternalReference context_address(Top::k_context_address);
@@ -2208,101 +2322,6 @@ void MacroAssembler::LeaveExitFrame(ExitFrame::Mode mode, int result_size) {
2208
2322
  }
2209
2323
 
2210
2324
 
2211
- Register MacroAssembler::CheckMaps(JSObject* object,
2212
- Register object_reg,
2213
- JSObject* holder,
2214
- Register holder_reg,
2215
- Register scratch,
2216
- int save_at_depth,
2217
- Label* miss) {
2218
- // Make sure there's no overlap between scratch and the other
2219
- // registers.
2220
- ASSERT(!scratch.is(object_reg) && !scratch.is(holder_reg));
2221
-
2222
- // Keep track of the current object in register reg. On the first
2223
- // iteration, reg is an alias for object_reg, on later iterations,
2224
- // it is an alias for holder_reg.
2225
- Register reg = object_reg;
2226
- int depth = 0;
2227
-
2228
- if (save_at_depth == depth) {
2229
- movq(Operand(rsp, kPointerSize), object_reg);
2230
- }
2231
-
2232
- // Check the maps in the prototype chain.
2233
- // Traverse the prototype chain from the object and do map checks.
2234
- while (object != holder) {
2235
- depth++;
2236
-
2237
- // Only global objects and objects that do not require access
2238
- // checks are allowed in stubs.
2239
- ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
2240
-
2241
- JSObject* prototype = JSObject::cast(object->GetPrototype());
2242
- if (Heap::InNewSpace(prototype)) {
2243
- // Get the map of the current object.
2244
- movq(scratch, FieldOperand(reg, HeapObject::kMapOffset));
2245
- Cmp(scratch, Handle<Map>(object->map()));
2246
- // Branch on the result of the map check.
2247
- j(not_equal, miss);
2248
- // Check access rights to the global object. This has to happen
2249
- // after the map check so that we know that the object is
2250
- // actually a global object.
2251
- if (object->IsJSGlobalProxy()) {
2252
- CheckAccessGlobalProxy(reg, scratch, miss);
2253
-
2254
- // Restore scratch register to be the map of the object.
2255
- // We load the prototype from the map in the scratch register.
2256
- movq(scratch, FieldOperand(reg, HeapObject::kMapOffset));
2257
- }
2258
- // The prototype is in new space; we cannot store a reference
2259
- // to it in the code. Load it from the map.
2260
- reg = holder_reg; // from now the object is in holder_reg
2261
- movq(reg, FieldOperand(scratch, Map::kPrototypeOffset));
2262
-
2263
- } else {
2264
- // Check the map of the current object.
2265
- Cmp(FieldOperand(reg, HeapObject::kMapOffset),
2266
- Handle<Map>(object->map()));
2267
- // Branch on the result of the map check.
2268
- j(not_equal, miss);
2269
- // Check access rights to the global object. This has to happen
2270
- // after the map check so that we know that the object is
2271
- // actually a global object.
2272
- if (object->IsJSGlobalProxy()) {
2273
- CheckAccessGlobalProxy(reg, scratch, miss);
2274
- }
2275
- // The prototype is in old space; load it directly.
2276
- reg = holder_reg; // from now the object is in holder_reg
2277
- Move(reg, Handle<JSObject>(prototype));
2278
- }
2279
-
2280
- if (save_at_depth == depth) {
2281
- movq(Operand(rsp, kPointerSize), reg);
2282
- }
2283
-
2284
- // Go to the next object in the prototype chain.
2285
- object = prototype;
2286
- }
2287
-
2288
- // Check the holder map.
2289
- Cmp(FieldOperand(reg, HeapObject::kMapOffset), Handle<Map>(holder->map()));
2290
- j(not_equal, miss);
2291
-
2292
- // Log the check depth.
2293
- LOG(IntEvent("check-maps-depth", depth + 1));
2294
-
2295
- // Perform security check for access to the global object and return
2296
- // the holder register.
2297
- ASSERT(object == holder);
2298
- ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
2299
- if (object->IsJSGlobalProxy()) {
2300
- CheckAccessGlobalProxy(reg, scratch, miss);
2301
- }
2302
- return reg;
2303
- }
2304
-
2305
-
2306
2325
  void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
2307
2326
  Register scratch,
2308
2327
  Label* miss) {
@@ -2596,7 +2615,7 @@ void MacroAssembler::AllocateTwoByteString(Register result,
2596
2615
  movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
2597
2616
  Integer32ToSmi(scratch1, length);
2598
2617
  movq(FieldOperand(result, String::kLengthOffset), scratch1);
2599
- movl(FieldOperand(result, String::kHashFieldOffset),
2618
+ movq(FieldOperand(result, String::kHashFieldOffset),
2600
2619
  Immediate(String::kEmptyHashField));
2601
2620
  }
2602
2621
 
@@ -2634,7 +2653,7 @@ void MacroAssembler::AllocateAsciiString(Register result,
2634
2653
  movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
2635
2654
  Integer32ToSmi(scratch1, length);
2636
2655
  movq(FieldOperand(result, String::kLengthOffset), scratch1);
2637
- movl(FieldOperand(result, String::kHashFieldOffset),
2656
+ movq(FieldOperand(result, String::kHashFieldOffset),
2638
2657
  Immediate(String::kEmptyHashField));
2639
2658
  }
2640
2659
 
@@ -2693,20 +2712,27 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
2693
2712
  }
2694
2713
  }
2695
2714
 
2715
+
2696
2716
  int MacroAssembler::ArgumentStackSlotsForCFunctionCall(int num_arguments) {
2697
- // On Windows stack slots are reserved by the caller for all arguments
2698
- // including the ones passed in registers. On Linux 6 arguments are passed in
2699
- // registers and the caller does not reserve stack slots for them.
2717
+ // On Windows 64 stack slots are reserved by the caller for all arguments
2718
+ // including the ones passed in registers, and space is always allocated for
2719
+ // the four register arguments even if the function takes fewer than four
2720
+ // arguments.
2721
+ // On AMD64 ABI (Linux/Mac) the first six arguments are passed in registers
2722
+ // and the caller does not reserve stack slots for them.
2700
2723
  ASSERT(num_arguments >= 0);
2701
2724
  #ifdef _WIN64
2702
- static const int kArgumentsWithoutStackSlot = 0;
2725
+ static const int kMinimumStackSlots = 4;
2726
+ if (num_arguments < kMinimumStackSlots) return kMinimumStackSlots;
2727
+ return num_arguments;
2703
2728
  #else
2704
- static const int kArgumentsWithoutStackSlot = 6;
2729
+ static const int kRegisterPassedArguments = 6;
2730
+ if (num_arguments < kRegisterPassedArguments) return 0;
2731
+ return num_arguments - kRegisterPassedArguments;
2705
2732
  #endif
2706
- return num_arguments > kArgumentsWithoutStackSlot ?
2707
- num_arguments - kArgumentsWithoutStackSlot : 0;
2708
2733
  }
2709
2734
 
2735
+
2710
2736
  void MacroAssembler::PrepareCallCFunction(int num_arguments) {
2711
2737
  int frame_alignment = OS::ActivationFrameAlignment();
2712
2738
  ASSERT(frame_alignment != 0);
@@ -2763,3 +2789,5 @@ CodePatcher::~CodePatcher() {
2763
2789
  }
2764
2790
 
2765
2791
  } } // namespace v8::internal
2792
+
2793
+ #endif // V8_TARGET_ARCH_X64