therubyracer 0.6.3 → 0.7.0.pre

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 (520) hide show
  1. data/Rakefile +10 -9
  2. data/ext/v8/callbacks.cpp +15 -8
  3. data/ext/v8/converters.cpp +7 -8
  4. data/ext/v8/converters.h +0 -2
  5. data/ext/v8/extconf.rb +2 -0
  6. data/ext/v8/rr.cpp +169 -0
  7. data/ext/v8/rr.h +34 -0
  8. data/ext/v8/upstream/{2.0.6 → 2.1.10}/AUTHORS +8 -1
  9. data/ext/v8/upstream/{2.0.6 → 2.1.10}/ChangeLog +198 -0
  10. data/ext/v8/upstream/{2.0.6 → 2.1.10}/LICENSE +0 -0
  11. data/ext/v8/upstream/{2.0.6 → 2.1.10}/SConstruct +152 -38
  12. data/ext/v8/upstream/{2.0.6 → 2.1.10}/include/v8-debug.h +52 -4
  13. data/ext/v8/upstream/2.1.10/include/v8-profiler.h +176 -0
  14. data/ext/v8/upstream/{2.0.6 → 2.1.10}/include/v8.h +227 -48
  15. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/SConscript +60 -10
  16. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/accessors.cc +5 -39
  17. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/accessors.h +0 -0
  18. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/allocation.cc +0 -0
  19. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/allocation.h +0 -0
  20. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/api.cc +477 -57
  21. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/api.h +8 -4
  22. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/apinatives.js +1 -1
  23. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/apiutils.h +0 -0
  24. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arguments.h +5 -6
  25. data/ext/v8/upstream/{2.0.6/src/arm/assembler-thumb2-inl.h → 2.1.10/src/arm/assembler-arm-inl.h} +42 -27
  26. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-arm.cc +430 -216
  27. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-arm.h +199 -110
  28. data/ext/v8/upstream/{2.0.6/src/arm/assembler-arm-inl.h → 2.1.10/src/arm/assembler-thumb2-inl.h} +4 -18
  29. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-thumb2.cc +142 -85
  30. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-thumb2.h +18 -9
  31. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/builtins-arm.cc +127 -87
  32. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/codegen-arm-inl.h +3 -5
  33. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/codegen-arm.cc +4634 -1427
  34. data/ext/v8/upstream/2.1.10/src/arm/codegen-arm.h +946 -0
  35. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/constants-arm.cc +21 -3
  36. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/constants-arm.h +39 -13
  37. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/cpu-arm.cc +9 -3
  38. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/debug-arm.cc +34 -8
  39. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/disasm-arm.cc +262 -117
  40. data/ext/v8/upstream/2.1.10/src/arm/fast-codegen-arm.cc +238 -0
  41. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/frames-arm.cc +0 -0
  42. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/frames-arm.h +0 -0
  43. data/ext/v8/upstream/{2.0.6/src/arm/fast-codegen-arm.cc → 2.1.10/src/arm/full-codegen-arm.cc} +453 -283
  44. data/ext/v8/upstream/2.1.10/src/arm/ic-arm.cc +1833 -0
  45. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/jump-target-arm.cc +3 -29
  46. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/macro-assembler-arm.cc +564 -104
  47. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/macro-assembler-arm.h +255 -46
  48. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/regexp-macro-assembler-arm.cc +78 -104
  49. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/regexp-macro-assembler-arm.h +6 -22
  50. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/register-allocator-arm-inl.h +0 -3
  51. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/register-allocator-arm.cc +0 -0
  52. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/register-allocator-arm.h +2 -1
  53. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/simulator-arm.cc +557 -180
  54. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/simulator-arm.h +52 -4
  55. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/stub-cache-arm.cc +904 -240
  56. data/ext/v8/upstream/2.1.10/src/arm/virtual-frame-arm.cc +668 -0
  57. data/ext/v8/upstream/2.1.10/src/arm/virtual-frame-arm.h +503 -0
  58. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/array.js +82 -109
  59. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/assembler.cc +49 -13
  60. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/assembler.h +27 -5
  61. data/ext/v8/upstream/2.1.10/src/ast.cc +1138 -0
  62. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ast.h +354 -53
  63. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/bootstrapper.cc +609 -501
  64. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/bootstrapper.h +27 -8
  65. data/ext/v8/upstream/2.1.10/src/builtins.cc +1512 -0
  66. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/builtins.h +41 -25
  67. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/bytecodes-irregexp.h +0 -0
  68. data/ext/v8/upstream/2.1.10/src/cached-powers.h +119 -0
  69. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/char-predicates-inl.h +0 -0
  70. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/char-predicates.h +0 -0
  71. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/checks.cc +0 -0
  72. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/checks.h +25 -1
  73. data/ext/v8/upstream/2.1.10/src/circular-queue-inl.h +101 -0
  74. data/ext/v8/upstream/2.1.10/src/circular-queue.cc +121 -0
  75. data/ext/v8/upstream/2.1.10/src/circular-queue.h +129 -0
  76. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/code-stubs.cc +23 -8
  77. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/code-stubs.h +16 -4
  78. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/code.h +0 -0
  79. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/codegen-inl.h +6 -34
  80. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/codegen.cc +73 -92
  81. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/codegen.h +164 -68
  82. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/compilation-cache.cc +117 -73
  83. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/compilation-cache.h +18 -17
  84. data/ext/v8/upstream/2.1.10/src/compiler.cc +623 -0
  85. data/ext/v8/upstream/2.1.10/src/compiler.h +299 -0
  86. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/contexts.cc +0 -0
  87. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/contexts.h +8 -11
  88. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/conversions-inl.h +28 -13
  89. data/ext/v8/upstream/2.1.10/src/conversions.cc +1105 -0
  90. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/conversions.h +9 -4
  91. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/counters.cc +0 -0
  92. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/counters.h +1 -1
  93. data/ext/v8/upstream/2.1.10/src/cpu-profiler-inl.h +99 -0
  94. data/ext/v8/upstream/2.1.10/src/cpu-profiler.cc +494 -0
  95. data/ext/v8/upstream/2.1.10/src/cpu-profiler.h +277 -0
  96. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/cpu.h +0 -0
  97. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-debug.cc +15 -4
  98. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-debug.h +0 -0
  99. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-posix.cc +18 -0
  100. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-readline.cc +2 -2
  101. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-windows.cc +0 -0
  102. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8.cc +10 -6
  103. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8.h +2 -0
  104. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8.js +43 -38
  105. data/ext/v8/upstream/2.1.10/src/data-flow.cc +755 -0
  106. data/ext/v8/upstream/2.1.10/src/data-flow.h +278 -0
  107. data/ext/v8/upstream/{2.0.6/src/date-delay.js → 2.1.10/src/date.js} +100 -110
  108. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dateparser-inl.h +11 -2
  109. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dateparser.cc +24 -26
  110. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dateparser.h +8 -4
  111. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug-agent.cc +3 -1
  112. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug-agent.h +0 -0
  113. data/ext/v8/upstream/{2.0.6/src/debug-delay.js → 2.1.10/src/debug-debugger.js} +111 -15
  114. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug.cc +156 -96
  115. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug.h +53 -5
  116. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/disasm.h +0 -0
  117. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/disassembler.cc +2 -8
  118. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/disassembler.h +0 -0
  119. data/ext/v8/upstream/2.1.10/src/diy-fp.cc +58 -0
  120. data/ext/v8/upstream/2.1.10/src/diy-fp.h +117 -0
  121. data/ext/v8/upstream/2.1.10/src/double.h +169 -0
  122. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dtoa-config.c +4 -3
  123. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/execution.cc +22 -22
  124. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/execution.h +17 -4
  125. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/factory.cc +70 -46
  126. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/factory.h +27 -17
  127. data/ext/v8/upstream/2.1.10/src/fast-codegen.cc +746 -0
  128. data/ext/v8/upstream/2.1.10/src/fast-codegen.h +161 -0
  129. data/ext/v8/upstream/2.1.10/src/fast-dtoa.cc +512 -0
  130. data/ext/v8/upstream/2.1.10/src/fast-dtoa.h +59 -0
  131. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/flag-definitions.h +32 -11
  132. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/flags.cc +0 -0
  133. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/flags.h +0 -0
  134. data/ext/v8/upstream/2.1.10/src/flow-graph.cc +763 -0
  135. data/ext/v8/upstream/2.1.10/src/flow-graph.h +180 -0
  136. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frame-element.cc +1 -4
  137. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frame-element.h +49 -11
  138. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frames-inl.h +2 -0
  139. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frames.cc +91 -17
  140. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frames.h +24 -2
  141. data/ext/v8/upstream/{2.0.6/src/fast-codegen.cc → 2.1.10/src/full-codegen.cc} +549 -198
  142. data/ext/v8/upstream/{2.0.6/src/fast-codegen.h → 2.1.10/src/full-codegen.h} +109 -29
  143. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/func-name-inferrer.cc +0 -0
  144. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/func-name-inferrer.h +0 -0
  145. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/global-handles.cc +0 -0
  146. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/global-handles.h +0 -0
  147. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/globals.h +67 -43
  148. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/handles-inl.h +0 -0
  149. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/handles.cc +124 -129
  150. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/handles.h +33 -15
  151. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/hashmap.cc +0 -0
  152. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/hashmap.h +0 -0
  153. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap-inl.h +56 -12
  154. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap-profiler.cc +2 -2
  155. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap-profiler.h +2 -0
  156. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap.cc +413 -221
  157. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap.h +192 -67
  158. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/assembler-ia32-inl.h +6 -0
  159. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/assembler-ia32.cc +187 -32
  160. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/assembler-ia32.h +31 -4
  161. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/builtins-ia32.cc +160 -133
  162. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/codegen-ia32-inl.h +0 -0
  163. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/codegen-ia32.cc +5533 -2177
  164. data/ext/v8/upstream/{2.0.6/src/x64/codegen-x64.h → 2.1.10/src/ia32/codegen-ia32.h} +453 -134
  165. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/cpu-ia32.cc +0 -0
  166. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/debug-ia32.cc +63 -8
  167. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/disasm-ia32.cc +99 -16
  168. data/ext/v8/upstream/2.1.10/src/ia32/fast-codegen-ia32.cc +950 -0
  169. data/ext/v8/upstream/2.1.10/src/ia32/fast-codegen-ia32.h +155 -0
  170. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/frames-ia32.cc +0 -0
  171. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/frames-ia32.h +0 -0
  172. data/ext/v8/upstream/{2.0.6/src/ia32/fast-codegen-ia32.cc → 2.1.10/src/ia32/full-codegen-ia32.cc} +454 -253
  173. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/ic-ia32.cc +545 -390
  174. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/jump-target-ia32.cc +1 -0
  175. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/macro-assembler-ia32.cc +330 -139
  176. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/macro-assembler-ia32.h +96 -30
  177. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/regexp-macro-assembler-ia32.cc +73 -89
  178. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/regexp-macro-assembler-ia32.h +6 -21
  179. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/register-allocator-ia32-inl.h +0 -0
  180. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/register-allocator-ia32.cc +59 -5
  181. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/register-allocator-ia32.h +0 -0
  182. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/simulator-ia32.cc +0 -0
  183. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/simulator-ia32.h +2 -2
  184. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/stub-cache-ia32.cc +745 -303
  185. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/virtual-frame-ia32.cc +278 -71
  186. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/virtual-frame-ia32.h +78 -22
  187. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ic-inl.h +0 -0
  188. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ic.cc +172 -89
  189. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ic.h +51 -20
  190. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/interpreter-irregexp.cc +0 -0
  191. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/interpreter-irregexp.h +0 -0
  192. data/ext/v8/upstream/{2.0.6/src/json-delay.js → 2.1.10/src/json.js} +26 -12
  193. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jsregexp.cc +151 -118
  194. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jsregexp.h +31 -7
  195. data/ext/v8/upstream/2.1.10/src/jump-target-heavy-inl.h +51 -0
  196. data/ext/v8/upstream/{2.0.6/src/jump-target.cc → 2.1.10/src/jump-target-heavy.cc} +164 -184
  197. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jump-target-inl.h +8 -9
  198. data/ext/v8/upstream/{2.0.6/src/usage-analyzer.h → 2.1.10/src/jump-target-light-inl.h} +9 -7
  199. data/ext/v8/upstream/2.1.10/src/jump-target-light.cc +86 -0
  200. data/ext/v8/upstream/2.1.10/src/jump-target.cc +155 -0
  201. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jump-target.h +6 -0
  202. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/list-inl.h +0 -0
  203. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/list.h +2 -1
  204. data/ext/v8/upstream/2.1.10/src/liveedit-debugger.js +944 -0
  205. data/ext/v8/upstream/2.1.10/src/liveedit.cc +1468 -0
  206. data/ext/v8/upstream/2.1.10/src/liveedit.h +170 -0
  207. data/ext/v8/upstream/2.1.10/src/log-inl.h +59 -0
  208. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log-utils.cc +3 -9
  209. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log-utils.h +1 -4
  210. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log.cc +198 -95
  211. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log.h +50 -49
  212. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/macro-assembler.h +9 -0
  213. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/macros.py +30 -11
  214. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/mark-compact.cc +464 -152
  215. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/mark-compact.h +41 -20
  216. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/math.js +9 -8
  217. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/memory.h +0 -0
  218. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/messages.cc +1 -0
  219. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/messages.h +0 -0
  220. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/messages.js +46 -9
  221. data/ext/v8/upstream/2.1.10/src/mips/assembler-mips-inl.h +215 -0
  222. data/ext/v8/upstream/2.1.10/src/mips/assembler-mips.cc +1208 -0
  223. data/ext/v8/upstream/2.1.10/src/mips/assembler-mips.h +665 -0
  224. data/ext/v8/upstream/2.1.10/src/mips/builtins-mips.cc +202 -0
  225. data/ext/v8/upstream/2.1.10/src/mips/codegen-mips-inl.h +70 -0
  226. data/ext/v8/upstream/2.1.10/src/mips/codegen-mips.cc +1428 -0
  227. data/ext/v8/upstream/{2.0.6/src/arm/codegen-arm.h → 2.1.10/src/mips/codegen-mips.h} +103 -205
  228. data/ext/v8/upstream/2.1.10/src/mips/constants-mips.cc +323 -0
  229. data/ext/v8/upstream/2.1.10/src/mips/constants-mips.h +525 -0
  230. data/ext/v8/upstream/2.1.10/src/mips/cpu-mips.cc +69 -0
  231. data/ext/v8/upstream/2.1.10/src/mips/debug-mips.cc +128 -0
  232. data/ext/v8/upstream/2.1.10/src/mips/disasm-mips.cc +784 -0
  233. data/ext/v8/upstream/2.1.10/src/mips/fast-codegen-mips.cc +74 -0
  234. data/ext/v8/upstream/2.1.10/src/mips/frames-mips.cc +99 -0
  235. data/ext/v8/upstream/2.1.10/src/mips/frames-mips.h +164 -0
  236. data/ext/v8/upstream/2.1.10/src/mips/full-codegen-mips.cc +273 -0
  237. data/ext/v8/upstream/2.1.10/src/mips/ic-mips.cc +217 -0
  238. data/ext/v8/upstream/2.1.10/src/mips/jump-target-mips.cc +172 -0
  239. data/ext/v8/upstream/2.1.10/src/mips/macro-assembler-mips.cc +1323 -0
  240. data/ext/v8/upstream/2.1.10/src/mips/macro-assembler-mips.h +461 -0
  241. data/ext/v8/upstream/2.1.10/src/mips/register-allocator-mips-inl.h +137 -0
  242. data/ext/v8/upstream/2.1.10/src/mips/register-allocator-mips.cc +60 -0
  243. data/ext/v8/upstream/2.1.10/src/mips/register-allocator-mips.h +46 -0
  244. data/ext/v8/upstream/2.1.10/src/mips/simulator-mips.cc +1648 -0
  245. data/ext/v8/upstream/2.1.10/src/mips/simulator-mips.h +311 -0
  246. data/ext/v8/upstream/2.1.10/src/mips/stub-cache-mips.cc +400 -0
  247. data/ext/v8/upstream/2.1.10/src/mips/virtual-frame-mips.cc +316 -0
  248. data/ext/v8/upstream/{2.0.6/src/arm/virtual-frame-arm.h → 2.1.10/src/mips/virtual-frame-mips.h} +87 -71
  249. data/ext/v8/upstream/{2.0.6/src/mirror-delay.js → 2.1.10/src/mirror-debugger.js} +51 -45
  250. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/mksnapshot.cc +97 -10
  251. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/natives.h +6 -6
  252. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects-debug.cc +47 -5
  253. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects-inl.h +154 -38
  254. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects.cc +528 -280
  255. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects.h +302 -95
  256. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/oprofile-agent.cc +25 -33
  257. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/oprofile-agent.h +9 -1
  258. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/parser.cc +444 -72
  259. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/parser.h +4 -2
  260. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-freebsd.cc +32 -13
  261. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-linux.cc +59 -25
  262. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-macos.cc +30 -13
  263. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-nullos.cc +0 -0
  264. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-openbsd.cc +21 -2
  265. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-posix.cc +0 -18
  266. data/ext/v8/upstream/2.1.10/src/platform-solaris.cc +607 -0
  267. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-win32.cc +16 -17
  268. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform.h +25 -8
  269. data/ext/v8/upstream/2.1.10/src/powers-ten.h +2461 -0
  270. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/prettyprinter.cc +49 -29
  271. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/prettyprinter.h +3 -1
  272. data/ext/v8/upstream/2.1.10/src/profile-generator-inl.h +124 -0
  273. data/ext/v8/upstream/2.1.10/src/profile-generator.cc +583 -0
  274. data/ext/v8/upstream/2.1.10/src/profile-generator.h +364 -0
  275. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/property.cc +1 -1
  276. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/property.h +12 -24
  277. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-irregexp-inl.h +2 -2
  278. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-irregexp.cc +2 -2
  279. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-irregexp.h +2 -2
  280. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-tracer.cc +2 -2
  281. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-tracer.h +0 -0
  282. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler.cc +33 -10
  283. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler.h +12 -4
  284. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-stack.cc +0 -0
  285. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-stack.h +0 -0
  286. data/ext/v8/upstream/{2.0.6/src/regexp-delay.js → 2.1.10/src/regexp.js} +180 -58
  287. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/register-allocator-inl.h +68 -1
  288. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/register-allocator.cc +5 -2
  289. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/register-allocator.h +42 -17
  290. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/rewriter.cc +110 -4
  291. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/rewriter.h +0 -0
  292. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/runtime.cc +2733 -623
  293. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/runtime.h +43 -20
  294. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/runtime.js +46 -35
  295. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scanner.cc +278 -36
  296. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scanner.h +97 -26
  297. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopeinfo.cc +3 -3
  298. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopeinfo.h +1 -0
  299. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopes.cc +11 -12
  300. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopes.h +0 -1
  301. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/serialize.cc +298 -175
  302. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/serialize.h +184 -40
  303. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/shell.h +0 -0
  304. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/simulator.h +2 -0
  305. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/smart-pointer.h +0 -0
  306. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/snapshot-common.cc +16 -31
  307. data/ext/v8/upstream/2.1.10/src/snapshot-empty.cc +50 -0
  308. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/snapshot.h +13 -1
  309. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/spaces-inl.h +35 -27
  310. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/spaces.cc +256 -42
  311. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/spaces.h +136 -42
  312. data/ext/v8/upstream/{2.0.6/src/zone-inl.h → 2.1.10/src/splay-tree-inl.h} +102 -89
  313. data/ext/v8/upstream/2.1.10/src/splay-tree.h +203 -0
  314. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/string-stream.cc +0 -0
  315. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/string-stream.h +0 -0
  316. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/string.js +260 -149
  317. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/stub-cache.cc +195 -69
  318. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/stub-cache.h +127 -12
  319. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/third_party/dtoa/COPYING +0 -0
  320. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/third_party/dtoa/dtoa.c +0 -0
  321. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/third_party/valgrind/valgrind.h +0 -0
  322. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/token.cc +0 -0
  323. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/token.h +0 -0
  324. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/top.cc +26 -31
  325. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/top.h +3 -4
  326. data/ext/v8/upstream/2.1.10/src/type-info.cc +53 -0
  327. data/ext/v8/upstream/2.1.10/src/type-info.h +244 -0
  328. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/unicode-inl.h +0 -0
  329. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/unicode.cc +0 -0
  330. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/unicode.h +0 -0
  331. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/uri.js +6 -6
  332. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/utils.cc +0 -37
  333. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/utils.h +121 -50
  334. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8-counters.cc +0 -0
  335. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8-counters.h +130 -98
  336. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8.cc +42 -11
  337. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8.h +4 -2
  338. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8natives.js +202 -37
  339. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8threads.cc +11 -0
  340. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8threads.h +15 -0
  341. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/variables.cc +7 -51
  342. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/variables.h +5 -35
  343. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/version.cc +3 -3
  344. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/version.h +0 -0
  345. data/ext/v8/upstream/2.1.10/src/virtual-frame-heavy-inl.h +152 -0
  346. data/ext/v8/upstream/{2.0.6/src/virtual-frame.cc → 2.1.10/src/virtual-frame-heavy.cc} +107 -176
  347. data/ext/v8/upstream/2.1.10/src/virtual-frame-inl.h +39 -0
  348. data/ext/v8/upstream/2.1.10/src/virtual-frame-light-inl.h +69 -0
  349. data/ext/v8/upstream/2.1.10/src/virtual-frame-light.cc +49 -0
  350. data/ext/v8/upstream/2.1.10/src/virtual-frame.cc +49 -0
  351. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/virtual-frame.h +2 -0
  352. data/ext/v8/upstream/{2.0.6/src/log-inl.h → 2.1.10/src/vm-state-inl.h} +28 -20
  353. data/ext/v8/upstream/{2.0.6/src/snapshot-empty.cc → 2.1.10/src/vm-state.cc} +5 -6
  354. data/ext/v8/upstream/2.1.10/src/vm-state.h +75 -0
  355. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/assembler-x64-inl.h +11 -0
  356. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/assembler-x64.cc +285 -93
  357. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/assembler-x64.h +81 -78
  358. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/builtins-x64.cc +130 -87
  359. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/codegen-x64-inl.h +0 -0
  360. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/codegen-x64.cc +4520 -1317
  361. data/ext/v8/upstream/{2.0.6/src/ia32/codegen-ia32.h → 2.1.10/src/x64/codegen-x64.h} +362 -141
  362. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/cpu-x64.cc +0 -0
  363. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/debug-x64.cc +20 -4
  364. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/disasm-x64.cc +121 -44
  365. data/ext/v8/upstream/2.1.10/src/x64/fast-codegen-x64.cc +246 -0
  366. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/frames-x64.cc +0 -0
  367. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/frames-x64.h +0 -0
  368. data/ext/v8/upstream/{2.0.6/src/x64/fast-codegen-x64.cc → 2.1.10/src/x64/full-codegen-x64.cc} +404 -231
  369. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/ic-x64.cc +346 -117
  370. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/jump-target-x64.cc +1 -0
  371. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/macro-assembler-x64.cc +537 -181
  372. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/macro-assembler-x64.h +140 -34
  373. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/regexp-macro-assembler-x64.cc +74 -96
  374. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/regexp-macro-assembler-x64.h +8 -25
  375. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/register-allocator-x64-inl.h +1 -1
  376. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/register-allocator-x64.cc +3 -0
  377. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/register-allocator-x64.h +0 -0
  378. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/simulator-x64.cc +0 -0
  379. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/simulator-x64.h +2 -2
  380. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/stub-cache-x64.cc +785 -288
  381. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/virtual-frame-x64.cc +128 -52
  382. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/virtual-frame-x64.h +40 -19
  383. data/ext/v8/upstream/2.1.10/src/zone-inl.h +82 -0
  384. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/zone.cc +1 -0
  385. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/zone.h +6 -90
  386. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/codemap.js +12 -0
  387. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/consarray.js +0 -0
  388. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/csvparser.js +22 -37
  389. data/ext/v8/upstream/2.1.10/tools/generate-ten-powers.scm +286 -0
  390. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/gyp/v8.gyp +86 -24
  391. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/js2c.py +22 -22
  392. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/jsmin.py +0 -0
  393. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/linux-tick-processor +10 -1
  394. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/linux-tick-processor.py +0 -0
  395. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/logreader.js +34 -16
  396. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/mac-nm +0 -0
  397. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/mac-tick-processor +0 -0
  398. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/annotate +0 -0
  399. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/common +0 -0
  400. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/dump +0 -0
  401. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/report +0 -0
  402. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/reset +0 -0
  403. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/run +0 -0
  404. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/shutdown +0 -0
  405. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/start +0 -0
  406. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/presubmit.py +0 -0
  407. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/process-heap-prof.py +0 -0
  408. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/profile.js +70 -0
  409. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/profile_view.js +0 -0
  410. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/run-valgrind.py +0 -0
  411. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/splaytree.js +0 -0
  412. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/splaytree.py +0 -0
  413. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/stats-viewer.py +0 -0
  414. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/test.py +7 -7
  415. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/tickprocessor-driver.js +7 -1
  416. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/tickprocessor.js +140 -9
  417. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/tickprocessor.py +40 -4
  418. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/utils.py +6 -0
  419. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/README.txt +0 -0
  420. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/arm.vsprops +1 -1
  421. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/common.vsprops +1 -2
  422. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8.vcproj +0 -6
  423. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8_arm.vcproj +193 -199
  424. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8_x64.vcproj +16 -8
  425. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8js2c.cmd +0 -0
  426. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/debug.vsprops +0 -0
  427. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/ia32.vsprops +5 -1
  428. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/js2c.cmd +1 -1
  429. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/release.vsprops +0 -0
  430. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8.sln +0 -0
  431. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8.vcproj +11 -7
  432. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_arm.sln +0 -0
  433. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_arm.vcproj +227 -223
  434. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_base.vcproj +137 -5
  435. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_base_arm.vcproj +116 -4
  436. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_base_x64.vcproj +125 -4
  437. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_cctest.vcproj +12 -6
  438. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_cctest_arm.vcproj +12 -6
  439. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_cctest_x64.vcproj +11 -11
  440. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_mksnapshot.vcproj +0 -6
  441. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -6
  442. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_process_sample.vcproj +0 -6
  443. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_process_sample_arm.vcproj +145 -151
  444. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_process_sample_x64.vcproj +16 -6
  445. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_shell_sample.vcproj +0 -6
  446. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_shell_sample_arm.vcproj +145 -151
  447. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_shell_sample_x64.vcproj +16 -8
  448. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot.vcproj +0 -0
  449. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot_cc.vcproj +0 -0
  450. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -0
  451. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot_x64.vcproj +0 -0
  452. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_x64.sln +0 -0
  453. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_x64.vcproj +11 -7
  454. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/x64.vsprops +5 -1
  455. data/ext/v8/upstream/2.1.10/tools/windows-tick-processor.bat +29 -0
  456. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/windows-tick-processor.py +0 -0
  457. data/ext/v8/upstream/Makefile +8 -2
  458. data/ext/v8/v8.cpp +21 -73
  459. data/ext/v8/v8_array.cpp +56 -0
  460. data/ext/v8/v8_array.h +8 -0
  461. data/ext/v8/v8_callbacks.cpp +121 -0
  462. data/ext/v8/v8_callbacks.h +8 -0
  463. data/ext/v8/v8_cxt.cpp +74 -77
  464. data/ext/v8/v8_cxt.h +2 -9
  465. data/ext/v8/v8_date.cpp +26 -0
  466. data/ext/v8/v8_date.h +6 -0
  467. data/ext/v8/v8_exception.cpp +55 -0
  468. data/ext/v8/v8_exception.h +6 -0
  469. data/ext/v8/v8_external.cpp +50 -0
  470. data/ext/v8/v8_external.h +8 -0
  471. data/ext/v8/v8_func.cpp +76 -18
  472. data/ext/v8/v8_func.h +5 -4
  473. data/ext/v8/v8_msg.cpp +55 -46
  474. data/ext/v8/v8_msg.h +3 -11
  475. data/ext/v8/v8_obj.cpp +67 -36
  476. data/ext/v8/v8_obj.h +6 -8
  477. data/ext/v8/v8_ref.cpp +25 -9
  478. data/ext/v8/v8_ref.h +3 -5
  479. data/ext/v8/v8_script.cpp +17 -10
  480. data/ext/v8/v8_script.h +3 -3
  481. data/ext/v8/v8_str.cpp +34 -6
  482. data/ext/v8/v8_str.h +4 -2
  483. data/ext/v8/v8_template.cpp +195 -33
  484. data/ext/v8/v8_template.h +4 -5
  485. data/ext/v8/v8_try_catch.cpp +99 -0
  486. data/ext/v8/v8_try_catch.h +5 -0
  487. data/ext/v8/v8_value.cpp +164 -0
  488. data/ext/v8/v8_value.h +10 -0
  489. data/lib/v8.rb +3 -1
  490. data/lib/v8/access.rb +60 -0
  491. data/lib/v8/array.rb +15 -0
  492. data/lib/v8/callbacks.rb +88 -0
  493. data/lib/v8/cli.rb +1 -1
  494. data/lib/v8/context.rb +55 -66
  495. data/lib/v8/function.rb +20 -2
  496. data/lib/v8/object.rb +14 -12
  497. data/lib/v8/ruby_error.rb +3 -0
  498. data/lib/v8/to.rb +59 -7
  499. data/spec/ext/cxt_spec.rb +2 -15
  500. data/spec/ext/func_spec.rb +17 -10
  501. data/spec/ext/try_catch_spec.rb +32 -0
  502. data/spec/foo.rb +17 -0
  503. data/spec/redjs/jsapi_spec.rb +173 -96
  504. data/spec/spec_helper.rb +7 -0
  505. data/spec/v8/to_spec.rb +0 -1
  506. data/therubyracer.gemspec +6 -6
  507. metadata +493 -386
  508. data/ext/v8/upstream/2.0.6/src/arm/ic-arm.cc +0 -849
  509. data/ext/v8/upstream/2.0.6/src/arm/virtual-frame-arm.cc +0 -412
  510. data/ext/v8/upstream/2.0.6/src/ast.cc +0 -512
  511. data/ext/v8/upstream/2.0.6/src/builtins.cc +0 -851
  512. data/ext/v8/upstream/2.0.6/src/compiler.cc +0 -1132
  513. data/ext/v8/upstream/2.0.6/src/compiler.h +0 -107
  514. data/ext/v8/upstream/2.0.6/src/conversions.cc +0 -709
  515. data/ext/v8/upstream/2.0.6/src/usage-analyzer.cc +0 -426
  516. data/ext/v8/upstream/2.0.6/tools/windows-tick-processor.bat +0 -5
  517. data/ext/v8/upstream/no-strict-aliasing.patch +0 -13
  518. data/ext/v8/v8_standalone.cpp +0 -69
  519. data/ext/v8/v8_standalone.h +0 -31
  520. data/spec/ext/obj_spec.rb +0 -13
@@ -30,6 +30,7 @@
30
30
  #include "codegen-inl.h"
31
31
  #include "jump-target-inl.h"
32
32
  #include "register-allocator-inl.h"
33
+ #include "virtual-frame-inl.h"
33
34
 
34
35
  namespace v8 {
35
36
  namespace internal {
@@ -39,7 +39,6 @@ namespace internal {
39
39
 
40
40
  MacroAssembler::MacroAssembler(void* buffer, int size)
41
41
  : Assembler(buffer, size),
42
- unresolved_(0),
43
42
  generating_stub_(false),
44
43
  allow_stub_calls_(true),
45
44
  code_object_(Heap::undefined_value()) {
@@ -47,17 +46,17 @@ MacroAssembler::MacroAssembler(void* buffer, int size)
47
46
 
48
47
 
49
48
  void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) {
50
- movq(destination, Operand(r13, index << kPointerSizeLog2));
49
+ movq(destination, Operand(kRootRegister, index << kPointerSizeLog2));
51
50
  }
52
51
 
53
52
 
54
53
  void MacroAssembler::PushRoot(Heap::RootListIndex index) {
55
- push(Operand(r13, index << kPointerSizeLog2));
54
+ push(Operand(kRootRegister, index << kPointerSizeLog2));
56
55
  }
57
56
 
58
57
 
59
58
  void MacroAssembler::CompareRoot(Register with, Heap::RootListIndex index) {
60
- cmpq(with, Operand(r13, index << kPointerSizeLog2));
59
+ cmpq(with, Operand(kRootRegister, index << kPointerSizeLog2));
61
60
  }
62
61
 
63
62
 
@@ -73,37 +72,46 @@ void MacroAssembler::StackLimitCheck(Label* on_stack_overflow) {
73
72
  }
74
73
 
75
74
 
76
- static void RecordWriteHelper(MacroAssembler* masm,
77
- Register object,
78
- Register addr,
79
- Register scratch) {
75
+ void MacroAssembler::RecordWriteHelper(Register object,
76
+ Register addr,
77
+ Register scratch) {
78
+ if (FLAG_debug_code) {
79
+ // Check that the object is not in new space.
80
+ Label not_in_new_space;
81
+ InNewSpace(object, scratch, not_equal, &not_in_new_space);
82
+ Abort("new-space object passed to RecordWriteHelper");
83
+ bind(&not_in_new_space);
84
+ }
85
+
80
86
  Label fast;
81
87
 
82
88
  // Compute the page start address from the heap object pointer, and reuse
83
89
  // the 'object' register for it.
84
90
  ASSERT(is_int32(~Page::kPageAlignmentMask));
85
- masm->and_(object,
86
- Immediate(static_cast<int32_t>(~Page::kPageAlignmentMask)));
91
+ and_(object,
92
+ Immediate(static_cast<int32_t>(~Page::kPageAlignmentMask)));
87
93
  Register page_start = object;
88
94
 
89
95
  // Compute the bit addr in the remembered set/index of the pointer in the
90
96
  // page. Reuse 'addr' as pointer_offset.
91
- masm->subq(addr, page_start);
92
- masm->shr(addr, Immediate(kPointerSizeLog2));
97
+ subq(addr, page_start);
98
+ shr(addr, Immediate(kPointerSizeLog2));
93
99
  Register pointer_offset = addr;
94
100
 
95
101
  // If the bit offset lies beyond the normal remembered set range, it is in
96
102
  // the extra remembered set area of a large object.
97
- masm->cmpq(pointer_offset, Immediate(Page::kPageSize / kPointerSize));
98
- masm->j(less, &fast);
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.
99
107
 
100
108
  // Adjust 'page_start' so that addressing using 'pointer_offset' hits the
101
109
  // extra remembered set after the large object.
102
110
 
103
111
  // Load the array length into 'scratch'.
104
- masm->movl(scratch,
105
- Operand(page_start,
106
- Page::kObjectStartOffset + FixedArray::kLengthOffset));
112
+ movl(scratch,
113
+ Operand(page_start,
114
+ Page::kObjectStartOffset + FixedArray::kLengthOffset));
107
115
  Register array_length = scratch;
108
116
 
109
117
  // Extra remembered set starts right after the large object (a FixedArray), at
@@ -112,59 +120,17 @@ static void RecordWriteHelper(MacroAssembler* masm,
112
120
  // Add the delta between the end of the normal RSet and the start of the
113
121
  // extra RSet to 'page_start', so that addressing the bit using
114
122
  // 'pointer_offset' hits the extra RSet words.
115
- masm->lea(page_start,
116
- Operand(page_start, array_length, times_pointer_size,
117
- Page::kObjectStartOffset + FixedArray::kHeaderSize
118
- - Page::kRSetEndOffset));
123
+ lea(page_start,
124
+ Operand(page_start, array_length, times_pointer_size,
125
+ Page::kObjectStartOffset + FixedArray::kHeaderSize
126
+ - Page::kRSetEndOffset));
119
127
 
120
128
  // NOTE: For now, we use the bit-test-and-set (bts) x86 instruction
121
129
  // to limit code size. We should probably evaluate this decision by
122
130
  // measuring the performance of an equivalent implementation using
123
131
  // "simpler" instructions
124
- masm->bind(&fast);
125
- masm->bts(Operand(page_start, Page::kRSetOffset), pointer_offset);
126
- }
127
-
128
-
129
- class RecordWriteStub : public CodeStub {
130
- public:
131
- RecordWriteStub(Register object, Register addr, Register scratch)
132
- : object_(object), addr_(addr), scratch_(scratch) { }
133
-
134
- void Generate(MacroAssembler* masm);
135
-
136
- private:
137
- Register object_;
138
- Register addr_;
139
- Register scratch_;
140
-
141
- #ifdef DEBUG
142
- void Print() {
143
- PrintF("RecordWriteStub (object reg %d), (addr reg %d), (scratch reg %d)\n",
144
- object_.code(), addr_.code(), scratch_.code());
145
- }
146
- #endif
147
-
148
- // Minor key encoding in 12 bits of three registers (object, address and
149
- // scratch) OOOOAAAASSSS.
150
- class ScratchBits : public BitField<uint32_t, 0, 4> {};
151
- class AddressBits : public BitField<uint32_t, 4, 4> {};
152
- class ObjectBits : public BitField<uint32_t, 8, 4> {};
153
-
154
- Major MajorKey() { return RecordWrite; }
155
-
156
- int MinorKey() {
157
- // Encode the registers.
158
- return ObjectBits::encode(object_.code()) |
159
- AddressBits::encode(addr_.code()) |
160
- ScratchBits::encode(scratch_.code());
161
- }
162
- };
163
-
164
-
165
- void RecordWriteStub::Generate(MacroAssembler* masm) {
166
- RecordWriteHelper(masm, object_, addr_, scratch_);
167
- masm->ret(0);
132
+ bind(&fast);
133
+ bts(Operand(page_start, Page::kRSetOffset), pointer_offset);
168
134
  }
169
135
 
170
136
 
@@ -178,14 +144,30 @@ void MacroAssembler::RecordWrite(Register object,
178
144
  int offset,
179
145
  Register value,
180
146
  Register smi_index) {
147
+ // The compiled code assumes that record write doesn't change the
148
+ // context register, so we check that none of the clobbered
149
+ // registers are rsi.
150
+ ASSERT(!object.is(rsi) && !value.is(rsi) && !smi_index.is(rsi));
151
+
181
152
  // First, check if a remembered set write is even needed. The tests below
182
153
  // catch stores of Smis and stores into young gen (which does not have space
183
- // for the remembered set bits.
154
+ // for the remembered set bits).
184
155
  Label done;
185
156
  JumpIfSmi(value, &done);
186
157
 
187
158
  RecordWriteNonSmi(object, offset, value, smi_index);
188
159
  bind(&done);
160
+
161
+ // Clobber all input registers when running with the debug-code flag
162
+ // turned on to provoke errors. This clobbering repeats the
163
+ // clobbering done inside RecordWriteNonSmi but it's necessary to
164
+ // avoid having the fast case for smis leave the registers
165
+ // unchanged.
166
+ if (FLAG_debug_code) {
167
+ movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
168
+ movq(value, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
169
+ movq(smi_index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
170
+ }
189
171
  }
190
172
 
191
173
 
@@ -194,21 +176,34 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
194
176
  Register scratch,
195
177
  Register smi_index) {
196
178
  Label done;
179
+
180
+ if (FLAG_debug_code) {
181
+ Label okay;
182
+ JumpIfNotSmi(object, &okay);
183
+ Abort("MacroAssembler::RecordWriteNonSmi cannot deal with smis");
184
+ bind(&okay);
185
+ }
186
+
197
187
  // Test that the object address is not in the new space. We cannot
198
188
  // set remembered set bits in the new space.
199
- movq(scratch, object);
200
- ASSERT(is_int32(static_cast<int64_t>(Heap::NewSpaceMask())));
201
- and_(scratch, Immediate(static_cast<int32_t>(Heap::NewSpaceMask())));
202
- movq(kScratchRegister, ExternalReference::new_space_start());
203
- cmpq(scratch, kScratchRegister);
204
- j(equal, &done);
205
-
206
- if ((offset > 0) && (offset < Page::kMaxHeapObjectSize)) {
207
- // Compute the bit offset in the remembered set, leave it in 'value'.
189
+ InNewSpace(object, scratch, equal, &done);
190
+
191
+ // The offset is relative to a tagged or untagged HeapObject pointer,
192
+ // so either offset or offset + kHeapObjectTag must be a
193
+ // multiple of kPointerSize.
194
+ ASSERT(IsAligned(offset, kPointerSize) ||
195
+ IsAligned(offset + kHeapObjectTag, kPointerSize));
196
+
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'.
208
203
  lea(scratch, Operand(object, offset));
209
204
  ASSERT(is_int32(Page::kPageAlignmentMask));
210
205
  and_(scratch, Immediate(static_cast<int32_t>(Page::kPageAlignmentMask)));
211
- shr(scratch, Immediate(kObjectAlignmentBits));
206
+ shr(scratch, Immediate(kPointerSizeLog2));
212
207
 
213
208
  // Compute the page address from the heap object pointer, leave it in
214
209
  // 'object' (immediate value is sign extended).
@@ -227,15 +222,15 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
227
222
  // array access: calculate the destination address in the same manner as
228
223
  // KeyedStoreIC::GenerateGeneric.
229
224
  SmiIndex index = SmiToIndex(smi_index, smi_index, kPointerSizeLog2);
230
- lea(dst, Operand(object,
231
- index.reg,
232
- index.scale,
233
- FixedArray::kHeaderSize - kHeapObjectTag));
225
+ lea(dst, FieldOperand(object,
226
+ index.reg,
227
+ index.scale,
228
+ FixedArray::kHeaderSize));
234
229
  }
235
230
  // If we are already generating a shared stub, not inlining the
236
231
  // record write code isn't going to save us any memory.
237
232
  if (generating_stub()) {
238
- RecordWriteHelper(this, object, dst, scratch);
233
+ RecordWriteHelper(object, dst, scratch);
239
234
  } else {
240
235
  RecordWriteStub stub(object, dst, scratch);
241
236
  CallStub(&stub);
@@ -243,6 +238,49 @@ void MacroAssembler::RecordWriteNonSmi(Register object,
243
238
  }
244
239
 
245
240
  bind(&done);
241
+
242
+ // Clobber all input registers when running with the debug-code flag
243
+ // turned on to provoke errors.
244
+ if (FLAG_debug_code) {
245
+ movq(object, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
246
+ movq(scratch, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
247
+ movq(smi_index, BitCast<int64_t>(kZapValue), RelocInfo::NONE);
248
+ }
249
+ }
250
+
251
+
252
+ void MacroAssembler::InNewSpace(Register object,
253
+ Register scratch,
254
+ Condition cc,
255
+ Label* branch) {
256
+ if (Serializer::enabled()) {
257
+ // Can't do arithmetic on external references if it might get serialized.
258
+ // The mask isn't really an address. We load it as an external reference in
259
+ // case the size of the new space is different between the snapshot maker
260
+ // and the running system.
261
+ if (scratch.is(object)) {
262
+ movq(kScratchRegister, ExternalReference::new_space_mask());
263
+ and_(scratch, kScratchRegister);
264
+ } else {
265
+ movq(scratch, ExternalReference::new_space_mask());
266
+ and_(scratch, object);
267
+ }
268
+ movq(kScratchRegister, ExternalReference::new_space_start());
269
+ cmpq(scratch, kScratchRegister);
270
+ j(cc, branch);
271
+ } else {
272
+ ASSERT(is_int32(static_cast<int64_t>(Heap::NewSpaceMask())));
273
+ intptr_t new_space_start =
274
+ reinterpret_cast<intptr_t>(Heap::NewSpaceStart());
275
+ movq(kScratchRegister, -new_space_start, RelocInfo::NONE);
276
+ if (scratch.is(object)) {
277
+ addq(scratch, kScratchRegister);
278
+ } else {
279
+ lea(scratch, Operand(object, kScratchRegister, times_1, 0));
280
+ }
281
+ and_(scratch, Immediate(static_cast<int32_t>(Heap::NewSpaceMask())));
282
+ j(cc, branch);
283
+ }
246
284
  }
247
285
 
248
286
 
@@ -260,6 +298,21 @@ void MacroAssembler::Check(Condition cc, const char* msg) {
260
298
  }
261
299
 
262
300
 
301
+ void MacroAssembler::CheckStackAlignment() {
302
+ int frame_alignment = OS::ActivationFrameAlignment();
303
+ int frame_alignment_mask = frame_alignment - 1;
304
+ if (frame_alignment > kPointerSize) {
305
+ ASSERT(IsPowerOf2(frame_alignment));
306
+ Label alignment_as_expected;
307
+ testq(rsp, Immediate(frame_alignment_mask));
308
+ j(zero, &alignment_as_expected);
309
+ // Abort if stack is not aligned.
310
+ int3();
311
+ bind(&alignment_as_expected);
312
+ }
313
+ }
314
+
315
+
263
316
  void MacroAssembler::NegativeZeroTest(Register result,
264
317
  Register op,
265
318
  Label* then_label) {
@@ -344,16 +397,30 @@ void MacroAssembler::CallRuntime(Runtime::Function* f, int num_arguments) {
344
397
  return;
345
398
  }
346
399
 
347
- Runtime::FunctionId function_id =
348
- static_cast<Runtime::FunctionId>(f->stub_id);
349
- RuntimeStub stub(function_id, num_arguments);
400
+ // TODO(1236192): Most runtime routines don't need the number of
401
+ // arguments passed in because it is constant. At some point we
402
+ // should remove this need and make the runtime routine entry code
403
+ // smarter.
404
+ movq(rax, Immediate(num_arguments));
405
+ movq(rbx, ExternalReference(f));
406
+ CEntryStub ces(f->result_size);
407
+ CallStub(&ces);
408
+ }
409
+
410
+
411
+ void MacroAssembler::CallExternalReference(const ExternalReference& ext,
412
+ int num_arguments) {
413
+ movq(rax, Immediate(num_arguments));
414
+ movq(rbx, ext);
415
+
416
+ CEntryStub stub(1);
350
417
  CallStub(&stub);
351
418
  }
352
419
 
353
420
 
354
- void MacroAssembler::TailCallRuntime(ExternalReference const& ext,
355
- int num_arguments,
356
- int result_size) {
421
+ void MacroAssembler::TailCallExternalReference(const ExternalReference& ext,
422
+ int num_arguments,
423
+ int result_size) {
357
424
  // ----------- S t a t e -------------
358
425
  // -- rsp[0] : return address
359
426
  // -- rsp[8] : argument num_arguments - 1
@@ -366,12 +433,19 @@ void MacroAssembler::TailCallRuntime(ExternalReference const& ext,
366
433
  // should remove this need and make the runtime routine entry code
367
434
  // smarter.
368
435
  movq(rax, Immediate(num_arguments));
369
- JumpToRuntime(ext, result_size);
436
+ JumpToExternalReference(ext, result_size);
370
437
  }
371
438
 
372
439
 
373
- void MacroAssembler::JumpToRuntime(const ExternalReference& ext,
374
- int result_size) {
440
+ void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid,
441
+ int num_arguments,
442
+ int result_size) {
443
+ TailCallExternalReference(ExternalReference(fid), num_arguments, result_size);
444
+ }
445
+
446
+
447
+ void MacroAssembler::JumpToExternalReference(const ExternalReference& ext,
448
+ int result_size) {
375
449
  // Set the entry point and jump to the C entry runtime stub.
376
450
  movq(rbx, ext);
377
451
  CEntryStub ces(result_size);
@@ -379,38 +453,42 @@ void MacroAssembler::JumpToRuntime(const ExternalReference& ext,
379
453
  }
380
454
 
381
455
 
382
- void MacroAssembler::GetBuiltinEntry(Register target, Builtins::JavaScript id) {
383
- bool resolved;
384
- Handle<Code> code = ResolveBuiltin(id, &resolved);
385
-
386
- const char* name = Builtins::GetName(id);
387
- int argc = Builtins::GetArgumentsCount(id);
456
+ void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag) {
457
+ // Calls are not allowed in some stubs.
458
+ ASSERT(flag == JUMP_FUNCTION || allow_stub_calls());
388
459
 
389
- movq(target, code, RelocInfo::EMBEDDED_OBJECT);
390
- if (!resolved) {
391
- uint32_t flags =
392
- Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
393
- Bootstrapper::FixupFlagsUseCodeObject::encode(true);
394
- Unresolved entry = { pc_offset() - sizeof(intptr_t), flags, name };
395
- unresolved_.Add(entry);
396
- }
397
- addq(target, Immediate(Code::kHeaderSize - kHeapObjectTag));
460
+ // Rely on the assertion to check that the number of provided
461
+ // arguments match the expected number of arguments. Fake a
462
+ // parameter count to avoid emitting code to do the check.
463
+ ParameterCount expected(0);
464
+ GetBuiltinEntry(rdx, id);
465
+ InvokeCode(rdx, expected, expected, flag);
398
466
  }
399
467
 
400
- Handle<Code> MacroAssembler::ResolveBuiltin(Builtins::JavaScript id,
401
- bool* resolved) {
402
- // Move the builtin function into the temporary function slot by
403
- // reading it from the builtins object. NOTE: We should be able to
404
- // reduce this to two instructions by putting the function table in
405
- // the global object instead of the "builtins" object and by using a
406
- // real register for the function.
407
- movq(rdx, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX)));
408
- movq(rdx, FieldOperand(rdx, GlobalObject::kBuiltinsOffset));
409
- int builtins_offset =
410
- JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize);
411
- movq(rdi, FieldOperand(rdx, builtins_offset));
412
468
 
413
- return Builtins::GetCode(id, resolved);
469
+ void MacroAssembler::GetBuiltinEntry(Register target, Builtins::JavaScript id) {
470
+ ASSERT(!target.is(rdi));
471
+
472
+ // Load the builtins object into target register.
473
+ movq(target, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX)));
474
+ movq(target, FieldOperand(target, GlobalObject::kBuiltinsOffset));
475
+
476
+ // Load the JavaScript builtin function from the builtins object.
477
+ movq(rdi, FieldOperand(target, JSBuiltinsObject::OffsetOfFunctionWithId(id)));
478
+
479
+ // Load the code entry point from the builtins object.
480
+ movq(target, FieldOperand(target, JSBuiltinsObject::OffsetOfCodeWithId(id)));
481
+ if (FLAG_debug_code) {
482
+ // Make sure the code objects in the builtins object and in the
483
+ // builtin function are the same.
484
+ push(target);
485
+ movq(target, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset));
486
+ movq(target, FieldOperand(target, SharedFunctionInfo::kCodeOffset));
487
+ cmpq(target, Operand(rsp, 0));
488
+ Assert(equal, "Builtin code object changed");
489
+ pop(target);
490
+ }
491
+ lea(target, FieldOperand(target, Code::kHeaderSize));
414
492
  }
415
493
 
416
494
 
@@ -518,6 +596,11 @@ void MacroAssembler::SmiCompare(Register dst, Smi* src) {
518
596
  }
519
597
 
520
598
 
599
+ void MacroAssembler::SmiCompare(Register dst, const Operand& src) {
600
+ cmpq(dst, src);
601
+ }
602
+
603
+
521
604
  void MacroAssembler::SmiCompare(const Operand& dst, Register src) {
522
605
  cmpq(dst, src);
523
606
  }
@@ -581,6 +664,31 @@ Condition MacroAssembler::CheckBothSmi(Register first, Register second) {
581
664
  }
582
665
 
583
666
 
667
+ Condition MacroAssembler::CheckBothPositiveSmi(Register first,
668
+ Register second) {
669
+ if (first.is(second)) {
670
+ return CheckPositiveSmi(first);
671
+ }
672
+ movl(kScratchRegister, first);
673
+ orl(kScratchRegister, second);
674
+ rol(kScratchRegister, Immediate(1));
675
+ testl(kScratchRegister, Immediate(0x03));
676
+ return zero;
677
+ }
678
+
679
+
680
+
681
+ Condition MacroAssembler::CheckEitherSmi(Register first, Register second) {
682
+ if (first.is(second)) {
683
+ return CheckSmi(first);
684
+ }
685
+ movl(kScratchRegister, first);
686
+ andl(kScratchRegister, second);
687
+ testb(kScratchRegister, Immediate(kSmiTagMask));
688
+ return zero;
689
+ }
690
+
691
+
584
692
  Condition MacroAssembler::CheckIsMinSmi(Register src) {
585
693
  ASSERT(kSmiTag == 0 && kSmiTagSize == 1);
586
694
  movq(kScratchRegister, src);
@@ -628,7 +736,17 @@ void MacroAssembler::SmiAdd(Register dst,
628
736
  Register src2,
629
737
  Label* on_not_smi_result) {
630
738
  ASSERT(!dst.is(src2));
631
- if (dst.is(src1)) {
739
+ if (on_not_smi_result == NULL) {
740
+ // No overflow checking. Use only when it's known that
741
+ // overflowing is impossible.
742
+ if (dst.is(src1)) {
743
+ addq(dst, src2);
744
+ } else {
745
+ movq(dst, src1);
746
+ addq(dst, src2);
747
+ }
748
+ Assert(no_overflow, "Smi addition onverflow");
749
+ } else if (dst.is(src1)) {
632
750
  addq(dst, src2);
633
751
  Label smi_result;
634
752
  j(no_overflow, &smi_result);
@@ -649,7 +767,17 @@ void MacroAssembler::SmiSub(Register dst,
649
767
  Register src2,
650
768
  Label* on_not_smi_result) {
651
769
  ASSERT(!dst.is(src2));
652
- if (dst.is(src1)) {
770
+ if (on_not_smi_result == NULL) {
771
+ // No overflow checking. Use only when it's known that
772
+ // overflowing is impossible (e.g., subtracting two positive smis).
773
+ if (dst.is(src1)) {
774
+ subq(dst, src2);
775
+ } else {
776
+ movq(dst, src1);
777
+ subq(dst, src2);
778
+ }
779
+ Assert(no_overflow, "Smi substraction onverflow");
780
+ } else if (dst.is(src1)) {
653
781
  subq(dst, src2);
654
782
  Label smi_result;
655
783
  j(no_overflow, &smi_result);
@@ -665,6 +793,35 @@ void MacroAssembler::SmiSub(Register dst,
665
793
  }
666
794
 
667
795
 
796
+ void MacroAssembler::SmiSub(Register dst,
797
+ Register src1,
798
+ Operand const& src2,
799
+ Label* on_not_smi_result) {
800
+ if (on_not_smi_result == NULL) {
801
+ // No overflow checking. Use only when it's known that
802
+ // overflowing is impossible (e.g., subtracting two positive smis).
803
+ if (dst.is(src1)) {
804
+ subq(dst, src2);
805
+ } else {
806
+ movq(dst, src1);
807
+ subq(dst, src2);
808
+ }
809
+ Assert(no_overflow, "Smi substraction onverflow");
810
+ } 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);
818
+ } else {
819
+ movq(dst, src1);
820
+ subq(dst, src2);
821
+ j(overflow, on_not_smi_result);
822
+ }
823
+ }
824
+
668
825
  void MacroAssembler::SmiMul(Register dst,
669
826
  Register src1,
670
827
  Register src2,
@@ -1281,6 +1438,90 @@ void MacroAssembler::JumpIfNotBothSmi(Register src1, Register src2,
1281
1438
  }
1282
1439
 
1283
1440
 
1441
+ void MacroAssembler::JumpIfNotBothPositiveSmi(Register src1, Register src2,
1442
+ Label* on_not_both_smi) {
1443
+ Condition both_smi = CheckBothPositiveSmi(src1, src2);
1444
+ j(NegateCondition(both_smi), on_not_both_smi);
1445
+ }
1446
+
1447
+
1448
+
1449
+ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register first_object,
1450
+ Register second_object,
1451
+ Register scratch1,
1452
+ Register scratch2,
1453
+ Label* on_fail) {
1454
+ // Check that both objects are not smis.
1455
+ Condition either_smi = CheckEitherSmi(first_object, second_object);
1456
+ j(either_smi, on_fail);
1457
+
1458
+ // Load instance type for both strings.
1459
+ movq(scratch1, FieldOperand(first_object, HeapObject::kMapOffset));
1460
+ movq(scratch2, FieldOperand(second_object, HeapObject::kMapOffset));
1461
+ movzxbl(scratch1, FieldOperand(scratch1, Map::kInstanceTypeOffset));
1462
+ movzxbl(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset));
1463
+
1464
+ // Check that both are flat ascii strings.
1465
+ ASSERT(kNotStringTag != 0);
1466
+ const int kFlatAsciiStringMask =
1467
+ kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
1468
+ const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
1469
+
1470
+ andl(scratch1, Immediate(kFlatAsciiStringMask));
1471
+ andl(scratch2, Immediate(kFlatAsciiStringMask));
1472
+ // Interleave the bits to check both scratch1 and scratch2 in one test.
1473
+ ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
1474
+ lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
1475
+ cmpl(scratch1,
1476
+ Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
1477
+ j(not_equal, on_fail);
1478
+ }
1479
+
1480
+
1481
+ void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii(
1482
+ Register instance_type,
1483
+ Register scratch,
1484
+ Label *failure) {
1485
+ if (!scratch.is(instance_type)) {
1486
+ movl(scratch, instance_type);
1487
+ }
1488
+
1489
+ const int kFlatAsciiStringMask =
1490
+ kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
1491
+
1492
+ andl(scratch, Immediate(kFlatAsciiStringMask));
1493
+ cmpl(scratch, Immediate(kStringTag | kSeqStringTag | kAsciiStringTag));
1494
+ j(not_equal, failure);
1495
+ }
1496
+
1497
+
1498
+ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii(
1499
+ Register first_object_instance_type,
1500
+ Register second_object_instance_type,
1501
+ Register scratch1,
1502
+ Register scratch2,
1503
+ Label* on_fail) {
1504
+ // Load instance type for both strings.
1505
+ movq(scratch1, first_object_instance_type);
1506
+ movq(scratch2, second_object_instance_type);
1507
+
1508
+ // Check that both are flat ascii strings.
1509
+ ASSERT(kNotStringTag != 0);
1510
+ const int kFlatAsciiStringMask =
1511
+ kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
1512
+ const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
1513
+
1514
+ andl(scratch1, Immediate(kFlatAsciiStringMask));
1515
+ andl(scratch2, Immediate(kFlatAsciiStringMask));
1516
+ // Interleave the bits to check both scratch1 and scratch2 in one test.
1517
+ ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
1518
+ lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
1519
+ cmpl(scratch1,
1520
+ Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
1521
+ j(not_equal, on_fail);
1522
+ }
1523
+
1524
+
1284
1525
  void MacroAssembler::Move(Register dst, Handle<Object> source) {
1285
1526
  ASSERT(!source->IsFailure());
1286
1527
  if (source->IsSmi()) {
@@ -1474,6 +1715,49 @@ void MacroAssembler::CmpInstanceType(Register map, InstanceType type) {
1474
1715
  }
1475
1716
 
1476
1717
 
1718
+ void MacroAssembler::CheckMap(Register obj,
1719
+ Handle<Map> map,
1720
+ Label* fail,
1721
+ bool is_heap_object) {
1722
+ if (!is_heap_object) {
1723
+ JumpIfSmi(obj, fail);
1724
+ }
1725
+ Cmp(FieldOperand(obj, HeapObject::kMapOffset), map);
1726
+ j(not_equal, fail);
1727
+ }
1728
+
1729
+
1730
+ void MacroAssembler::AbortIfNotNumber(Register object, const char* msg) {
1731
+ Label ok;
1732
+ Condition is_smi = CheckSmi(object);
1733
+ j(is_smi, &ok);
1734
+ Cmp(FieldOperand(object, HeapObject::kMapOffset),
1735
+ Factory::heap_number_map());
1736
+ Assert(equal, msg);
1737
+ bind(&ok);
1738
+ }
1739
+
1740
+
1741
+ void MacroAssembler::AbortIfNotSmi(Register object, const char* msg) {
1742
+ Label ok;
1743
+ Condition is_smi = CheckSmi(object);
1744
+ j(is_smi, &ok);
1745
+ Assert(equal, msg);
1746
+ bind(&ok);
1747
+ }
1748
+
1749
+
1750
+ Condition MacroAssembler::IsObjectStringType(Register heap_object,
1751
+ Register map,
1752
+ Register instance_type) {
1753
+ movq(map, FieldOperand(heap_object, HeapObject::kMapOffset));
1754
+ movzxbl(instance_type, FieldOperand(map, Map::kInstanceTypeOffset));
1755
+ ASSERT(kNotStringTag != 0);
1756
+ testb(instance_type, Immediate(kIsNotStringMask));
1757
+ return zero;
1758
+ }
1759
+
1760
+
1477
1761
  void MacroAssembler::TryGetFunctionPrototype(Register function,
1478
1762
  Register result,
1479
1763
  Label* miss) {
@@ -1640,39 +1924,14 @@ void MacroAssembler::CopyRegistersFromStackToMemory(Register base,
1640
1924
  }
1641
1925
  }
1642
1926
 
1643
- #endif // ENABLE_DEBUGGER_SUPPORT
1644
-
1645
-
1646
- void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag) {
1647
- bool resolved;
1648
- Handle<Code> code = ResolveBuiltin(id, &resolved);
1649
-
1650
- // Calls are not allowed in some stubs.
1651
- ASSERT(flag == JUMP_FUNCTION || allow_stub_calls());
1652
-
1653
- // Rely on the assertion to check that the number of provided
1654
- // arguments match the expected number of arguments. Fake a
1655
- // parameter count to avoid emitting code to do the check.
1656
- ParameterCount expected(0);
1657
- InvokeCode(Handle<Code>(code),
1658
- expected,
1659
- expected,
1660
- RelocInfo::CODE_TARGET,
1661
- flag);
1662
-
1663
- const char* name = Builtins::GetName(id);
1664
- int argc = Builtins::GetArgumentsCount(id);
1665
- // The target address for the jump is stored as an immediate at offset
1666
- // kInvokeCodeAddressOffset.
1667
- if (!resolved) {
1668
- uint32_t flags =
1669
- Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
1670
- Bootstrapper::FixupFlagsUseCodeObject::encode(false);
1671
- Unresolved entry =
1672
- { pc_offset() - kCallTargetAddressOffset, flags, name };
1673
- unresolved_.Add(entry);
1674
- }
1927
+ void MacroAssembler::DebugBreak() {
1928
+ ASSERT(allow_stub_calls());
1929
+ xor_(rax, rax); // no arguments
1930
+ movq(rbx, ExternalReference(Runtime::kDebugBreak));
1931
+ CEntryStub ces(1);
1932
+ Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
1675
1933
  }
1934
+ #endif // ENABLE_DEBUGGER_SUPPORT
1676
1935
 
1677
1936
 
1678
1937
  void MacroAssembler::InvokePrologue(const ParameterCount& expected,
@@ -1792,6 +2051,21 @@ void MacroAssembler::InvokeFunction(Register function,
1792
2051
  }
1793
2052
 
1794
2053
 
2054
+ void MacroAssembler::InvokeFunction(JSFunction* function,
2055
+ const ParameterCount& actual,
2056
+ InvokeFlag flag) {
2057
+ ASSERT(function->is_compiled());
2058
+ // Get the function and setup the context.
2059
+ Move(rdi, Handle<JSFunction>(function));
2060
+ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
2061
+
2062
+ // Invoke the cached code.
2063
+ Handle<Code> code(function->code());
2064
+ ParameterCount expected(function->shared()->formal_parameter_count());
2065
+ InvokeCode(code, expected, actual, RelocInfo::CODE_TARGET, flag);
2066
+ }
2067
+
2068
+
1795
2069
  void MacroAssembler::EnterFrame(StackFrame::Type type) {
1796
2070
  push(rbp);
1797
2071
  movq(rbp, rsp);
@@ -1831,13 +2105,9 @@ void MacroAssembler::EnterExitFrame(ExitFrame::Mode mode, int result_size) {
1831
2105
 
1832
2106
  // Reserve room for entry stack pointer and push the debug marker.
1833
2107
  ASSERT(ExitFrameConstants::kSPOffset == -1 * kPointerSize);
1834
- push(Immediate(0)); // saved entry sp, patched before call
1835
- if (mode == ExitFrame::MODE_DEBUG) {
1836
- push(Immediate(0));
1837
- } else {
1838
- movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT);
1839
- push(kScratchRegister);
1840
- }
2108
+ push(Immediate(0)); // Saved entry sp, patched before call.
2109
+ movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT);
2110
+ push(kScratchRegister); // Accessed from EditFrame::code_slot.
1841
2111
 
1842
2112
  // Save the frame pointer and the context in top.
1843
2113
  ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address);
@@ -1943,6 +2213,7 @@ Register MacroAssembler::CheckMaps(JSObject* object,
1943
2213
  JSObject* holder,
1944
2214
  Register holder_reg,
1945
2215
  Register scratch,
2216
+ int save_at_depth,
1946
2217
  Label* miss) {
1947
2218
  // Make sure there's no overlap between scratch and the other
1948
2219
  // registers.
@@ -1952,7 +2223,11 @@ Register MacroAssembler::CheckMaps(JSObject* object,
1952
2223
  // iteration, reg is an alias for object_reg, on later iterations,
1953
2224
  // it is an alias for holder_reg.
1954
2225
  Register reg = object_reg;
1955
- int depth = 1;
2226
+ int depth = 0;
2227
+
2228
+ if (save_at_depth == depth) {
2229
+ movq(Operand(rsp, kPointerSize), object_reg);
2230
+ }
1956
2231
 
1957
2232
  // Check the maps in the prototype chain.
1958
2233
  // Traverse the prototype chain from the object and do map checks.
@@ -2002,6 +2277,10 @@ Register MacroAssembler::CheckMaps(JSObject* object,
2002
2277
  Move(reg, Handle<JSObject>(prototype));
2003
2278
  }
2004
2279
 
2280
+ if (save_at_depth == depth) {
2281
+ movq(Operand(rsp, kPointerSize), reg);
2282
+ }
2283
+
2005
2284
  // Go to the next object in the prototype chain.
2006
2285
  object = prototype;
2007
2286
  }
@@ -2011,7 +2290,7 @@ Register MacroAssembler::CheckMaps(JSObject* object,
2011
2290
  j(not_equal, miss);
2012
2291
 
2013
2292
  // Log the check depth.
2014
- LOG(IntEvent("check-maps-depth", depth));
2293
+ LOG(IntEvent("check-maps-depth", depth + 1));
2015
2294
 
2016
2295
  // Perform security check for access to the global object and return
2017
2296
  // the holder register.
@@ -2097,7 +2376,7 @@ void MacroAssembler::LoadAllocationTopHelper(Register result,
2097
2376
  // Just return if allocation top is already known.
2098
2377
  if ((flags & RESULT_CONTAINS_TOP) != 0) {
2099
2378
  // No use of scratch if allocation top is provided.
2100
- ASSERT(scratch.is(no_reg));
2379
+ ASSERT(!scratch.is_valid());
2101
2380
  #ifdef DEBUG
2102
2381
  // Assert that result actually contains top on entry.
2103
2382
  movq(kScratchRegister, new_space_allocation_top);
@@ -2107,14 +2386,17 @@ void MacroAssembler::LoadAllocationTopHelper(Register result,
2107
2386
  return;
2108
2387
  }
2109
2388
 
2110
- // Move address of new object to result. Use scratch register if available.
2111
- if (scratch.is(no_reg)) {
2112
- movq(kScratchRegister, new_space_allocation_top);
2113
- movq(result, Operand(kScratchRegister, 0));
2114
- } else {
2389
+ // Move address of new object to result. Use scratch register if available,
2390
+ // and keep address in scratch until call to UpdateAllocationTopHelper.
2391
+ if (scratch.is_valid()) {
2115
2392
  ASSERT(!scratch.is(result_end));
2116
2393
  movq(scratch, new_space_allocation_top);
2117
2394
  movq(result, Operand(scratch, 0));
2395
+ } else if (result.is(rax)) {
2396
+ load_rax(new_space_allocation_top);
2397
+ } else {
2398
+ movq(kScratchRegister, new_space_allocation_top);
2399
+ movq(result, Operand(kScratchRegister, 0));
2118
2400
  }
2119
2401
  }
2120
2402
 
@@ -2135,11 +2417,11 @@ void MacroAssembler::UpdateAllocationTopHelper(Register result_end,
2135
2417
  store_rax(new_space_allocation_top);
2136
2418
  } else {
2137
2419
  // Register required - use scratch provided if available.
2138
- if (scratch.is(no_reg)) {
2420
+ if (scratch.is_valid()) {
2421
+ movq(Operand(scratch, 0), result_end);
2422
+ } else {
2139
2423
  movq(kScratchRegister, new_space_allocation_top);
2140
2424
  movq(Operand(kScratchRegister, 0), result_end);
2141
- } else {
2142
- movq(Operand(scratch, 0), result_end);
2143
2425
  }
2144
2426
  }
2145
2427
  }
@@ -2159,16 +2441,29 @@ void MacroAssembler::AllocateInNewSpace(int object_size,
2159
2441
  // Calculate new top and bail out if new space is exhausted.
2160
2442
  ExternalReference new_space_allocation_limit =
2161
2443
  ExternalReference::new_space_allocation_limit_address();
2162
- lea(result_end, Operand(result, object_size));
2444
+
2445
+ Register top_reg = result_end.is_valid() ? result_end : result;
2446
+
2447
+ if (top_reg.is(result)) {
2448
+ addq(top_reg, Immediate(object_size));
2449
+ } else {
2450
+ lea(top_reg, Operand(result, object_size));
2451
+ }
2163
2452
  movq(kScratchRegister, new_space_allocation_limit);
2164
- cmpq(result_end, Operand(kScratchRegister, 0));
2453
+ cmpq(top_reg, Operand(kScratchRegister, 0));
2165
2454
  j(above, gc_required);
2166
2455
 
2167
2456
  // Update allocation top.
2168
- UpdateAllocationTopHelper(result_end, scratch);
2457
+ UpdateAllocationTopHelper(top_reg, scratch);
2169
2458
 
2170
- // Tag the result if requested.
2171
- if ((flags & TAG_OBJECT) != 0) {
2459
+ if (top_reg.is(result)) {
2460
+ if ((flags & TAG_OBJECT) != 0) {
2461
+ subq(result, Immediate(object_size - kHeapObjectTag));
2462
+ } else {
2463
+ subq(result, Immediate(object_size));
2464
+ }
2465
+ } else if ((flags & TAG_OBJECT) != 0) {
2466
+ // Tag the result if requested.
2172
2467
  addq(result, Immediate(kHeapObjectTag));
2173
2468
  }
2174
2469
  }
@@ -2275,11 +2570,16 @@ void MacroAssembler::AllocateTwoByteString(Register result,
2275
2570
  Label* gc_required) {
2276
2571
  // Calculate the number of bytes needed for the characters in the string while
2277
2572
  // observing object alignment.
2278
- ASSERT((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0);
2573
+ const int kHeaderAlignment = SeqTwoByteString::kHeaderSize &
2574
+ kObjectAlignmentMask;
2279
2575
  ASSERT(kShortSize == 2);
2280
2576
  // scratch1 = length * 2 + kObjectAlignmentMask.
2281
- lea(scratch1, Operand(length, length, times_1, kObjectAlignmentMask));
2577
+ lea(scratch1, Operand(length, length, times_1, kObjectAlignmentMask +
2578
+ kHeaderAlignment));
2282
2579
  and_(scratch1, Immediate(~kObjectAlignmentMask));
2580
+ if (kHeaderAlignment > 0) {
2581
+ subq(scratch1, Immediate(kHeaderAlignment));
2582
+ }
2283
2583
 
2284
2584
  // Allocate two byte string in new space.
2285
2585
  AllocateInNewSpace(SeqTwoByteString::kHeaderSize,
@@ -2294,7 +2594,8 @@ void MacroAssembler::AllocateTwoByteString(Register result,
2294
2594
  // Set the map, length and hash field.
2295
2595
  LoadRoot(kScratchRegister, Heap::kStringMapRootIndex);
2296
2596
  movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
2297
- movl(FieldOperand(result, String::kLengthOffset), length);
2597
+ Integer32ToSmi(scratch1, length);
2598
+ movq(FieldOperand(result, String::kLengthOffset), scratch1);
2298
2599
  movl(FieldOperand(result, String::kHashFieldOffset),
2299
2600
  Immediate(String::kEmptyHashField));
2300
2601
  }
@@ -2308,11 +2609,15 @@ void MacroAssembler::AllocateAsciiString(Register result,
2308
2609
  Label* gc_required) {
2309
2610
  // Calculate the number of bytes needed for the characters in the string while
2310
2611
  // observing object alignment.
2311
- ASSERT((SeqAsciiString::kHeaderSize & kObjectAlignmentMask) == 0);
2612
+ const int kHeaderAlignment = SeqAsciiString::kHeaderSize &
2613
+ kObjectAlignmentMask;
2312
2614
  movl(scratch1, length);
2313
2615
  ASSERT(kCharSize == 1);
2314
- addq(scratch1, Immediate(kObjectAlignmentMask));
2616
+ addq(scratch1, Immediate(kObjectAlignmentMask + kHeaderAlignment));
2315
2617
  and_(scratch1, Immediate(~kObjectAlignmentMask));
2618
+ if (kHeaderAlignment > 0) {
2619
+ subq(scratch1, Immediate(kHeaderAlignment));
2620
+ }
2316
2621
 
2317
2622
  // Allocate ascii string in new space.
2318
2623
  AllocateInNewSpace(SeqAsciiString::kHeaderSize,
@@ -2327,7 +2632,8 @@ void MacroAssembler::AllocateAsciiString(Register result,
2327
2632
  // Set the map, length and hash field.
2328
2633
  LoadRoot(kScratchRegister, Heap::kAsciiStringMapRootIndex);
2329
2634
  movq(FieldOperand(result, HeapObject::kMapOffset), kScratchRegister);
2330
- movl(FieldOperand(result, String::kLengthOffset), length);
2635
+ Integer32ToSmi(scratch1, length);
2636
+ movq(FieldOperand(result, String::kLengthOffset), scratch1);
2331
2637
  movl(FieldOperand(result, String::kHashFieldOffset),
2332
2638
  Immediate(String::kEmptyHashField));
2333
2639
  }
@@ -2387,6 +2693,56 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
2387
2693
  }
2388
2694
  }
2389
2695
 
2696
+ 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.
2700
+ ASSERT(num_arguments >= 0);
2701
+ #ifdef _WIN64
2702
+ static const int kArgumentsWithoutStackSlot = 0;
2703
+ #else
2704
+ static const int kArgumentsWithoutStackSlot = 6;
2705
+ #endif
2706
+ return num_arguments > kArgumentsWithoutStackSlot ?
2707
+ num_arguments - kArgumentsWithoutStackSlot : 0;
2708
+ }
2709
+
2710
+ void MacroAssembler::PrepareCallCFunction(int num_arguments) {
2711
+ int frame_alignment = OS::ActivationFrameAlignment();
2712
+ ASSERT(frame_alignment != 0);
2713
+ ASSERT(num_arguments >= 0);
2714
+ // Make stack end at alignment and allocate space for arguments and old rsp.
2715
+ movq(kScratchRegister, rsp);
2716
+ ASSERT(IsPowerOf2(frame_alignment));
2717
+ int argument_slots_on_stack =
2718
+ ArgumentStackSlotsForCFunctionCall(num_arguments);
2719
+ subq(rsp, Immediate((argument_slots_on_stack + 1) * kPointerSize));
2720
+ and_(rsp, Immediate(-frame_alignment));
2721
+ movq(Operand(rsp, argument_slots_on_stack * kPointerSize), kScratchRegister);
2722
+ }
2723
+
2724
+
2725
+ void MacroAssembler::CallCFunction(ExternalReference function,
2726
+ int num_arguments) {
2727
+ movq(rax, function);
2728
+ CallCFunction(rax, num_arguments);
2729
+ }
2730
+
2731
+
2732
+ void MacroAssembler::CallCFunction(Register function, int num_arguments) {
2733
+ // Check stack alignment.
2734
+ if (FLAG_debug_code) {
2735
+ CheckStackAlignment();
2736
+ }
2737
+
2738
+ call(function);
2739
+ ASSERT(OS::ActivationFrameAlignment() != 0);
2740
+ ASSERT(num_arguments >= 0);
2741
+ int argument_slots_on_stack =
2742
+ ArgumentStackSlotsForCFunctionCall(num_arguments);
2743
+ movq(rsp, Operand(rsp, argument_slots_on_stack * kPointerSize));
2744
+ }
2745
+
2390
2746
 
2391
2747
  CodePatcher::CodePatcher(byte* address, int size)
2392
2748
  : address_(address), size_(size), masm_(address, size + Assembler::kGap) {