therubyracer 0.9.0beta2 → 0.9.0beta3

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 (920) hide show
  1. data/.gitmodules +3 -0
  2. data/ext/v8/upstream/Makefile +1 -2
  3. data/ext/v8/upstream/v8/.gitignore +33 -0
  4. data/ext/v8/upstream/v8/AUTHORS +42 -0
  5. data/ext/v8/upstream/v8/ChangeLog +2663 -0
  6. data/ext/v8/upstream/{3.1.8 → v8}/LICENSE +0 -0
  7. data/ext/v8/upstream/{3.1.8 → v8}/LICENSE.strongtalk +0 -0
  8. data/ext/v8/upstream/{3.1.8 → v8}/LICENSE.v8 +0 -0
  9. data/ext/v8/upstream/{3.1.8 → v8}/LICENSE.valgrind +0 -0
  10. data/ext/v8/upstream/v8/SConstruct +1473 -0
  11. data/ext/v8/upstream/{3.1.8 → v8}/build/README.txt +0 -0
  12. data/ext/v8/upstream/{3.1.8 → v8}/build/all.gyp +0 -0
  13. data/ext/v8/upstream/{3.1.8 → v8}/build/armu.gypi +0 -0
  14. data/ext/v8/upstream/{3.1.8 → v8}/build/common.gypi +0 -0
  15. data/ext/v8/upstream/{3.1.8 → v8}/build/gyp_v8 +0 -0
  16. data/ext/v8/upstream/v8/include/v8-debug.h +394 -0
  17. data/ext/v8/upstream/v8/include/v8-preparser.h +116 -0
  18. data/ext/v8/upstream/v8/include/v8-profiler.h +505 -0
  19. data/ext/v8/upstream/v8/include/v8-testing.h +104 -0
  20. data/ext/v8/upstream/v8/include/v8.h +4000 -0
  21. data/ext/v8/upstream/{3.1.8 → v8}/include/v8stdint.h +0 -0
  22. data/ext/v8/upstream/v8/preparser/SConscript +38 -0
  23. data/ext/v8/upstream/v8/preparser/preparser-process.cc +169 -0
  24. data/ext/v8/upstream/v8/src/SConscript +380 -0
  25. data/ext/v8/upstream/v8/src/accessors.cc +766 -0
  26. data/ext/v8/upstream/{3.1.8 → v8}/src/accessors.h +0 -0
  27. data/ext/v8/upstream/v8/src/allocation-inl.h +49 -0
  28. data/ext/v8/upstream/v8/src/allocation.cc +122 -0
  29. data/ext/v8/upstream/v8/src/allocation.h +143 -0
  30. data/ext/v8/upstream/v8/src/api.cc +5678 -0
  31. data/ext/v8/upstream/v8/src/api.h +572 -0
  32. data/ext/v8/upstream/{3.1.8 → v8}/src/apinatives.js +0 -0
  33. data/ext/v8/upstream/v8/src/apiutils.h +73 -0
  34. data/ext/v8/upstream/v8/src/arguments.h +116 -0
  35. data/ext/v8/upstream/v8/src/arm/assembler-arm-inl.h +353 -0
  36. data/ext/v8/upstream/v8/src/arm/assembler-arm.cc +2877 -0
  37. data/ext/v8/upstream/v8/src/arm/assembler-arm.h +1382 -0
  38. data/ext/v8/upstream/v8/src/arm/builtins-arm.cc +1634 -0
  39. data/ext/v8/upstream/v8/src/arm/code-stubs-arm.cc +6917 -0
  40. data/ext/v8/upstream/v8/src/arm/code-stubs-arm.h +623 -0
  41. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/codegen-arm-inl.h +0 -0
  42. data/ext/v8/upstream/v8/src/arm/codegen-arm.cc +7437 -0
  43. data/ext/v8/upstream/v8/src/arm/codegen-arm.h +595 -0
  44. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/constants-arm.cc +0 -0
  45. data/ext/v8/upstream/v8/src/arm/constants-arm.h +778 -0
  46. data/ext/v8/upstream/v8/src/arm/cpu-arm.cc +149 -0
  47. data/ext/v8/upstream/v8/src/arm/debug-arm.cc +317 -0
  48. data/ext/v8/upstream/v8/src/arm/deoptimizer-arm.cc +737 -0
  49. data/ext/v8/upstream/v8/src/arm/disasm-arm.cc +1503 -0
  50. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/frames-arm.cc +0 -0
  51. data/ext/v8/upstream/v8/src/arm/frames-arm.h +168 -0
  52. data/ext/v8/upstream/v8/src/arm/full-codegen-arm.cc +4374 -0
  53. data/ext/v8/upstream/v8/src/arm/ic-arm.cc +1793 -0
  54. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/jump-target-arm.cc +0 -0
  55. data/ext/v8/upstream/v8/src/arm/lithium-arm.cc +2120 -0
  56. data/ext/v8/upstream/v8/src/arm/lithium-arm.h +2179 -0
  57. data/ext/v8/upstream/v8/src/arm/lithium-codegen-arm.cc +4132 -0
  58. data/ext/v8/upstream/v8/src/arm/lithium-codegen-arm.h +329 -0
  59. data/ext/v8/upstream/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
  60. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/lithium-gap-resolver-arm.h +0 -0
  61. data/ext/v8/upstream/v8/src/arm/macro-assembler-arm.cc +2939 -0
  62. data/ext/v8/upstream/v8/src/arm/macro-assembler-arm.h +1071 -0
  63. data/ext/v8/upstream/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
  64. data/ext/v8/upstream/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
  65. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/register-allocator-arm-inl.h +0 -0
  66. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/register-allocator-arm.cc +0 -0
  67. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/register-allocator-arm.h +0 -0
  68. data/ext/v8/upstream/v8/src/arm/simulator-arm.cc +3288 -0
  69. data/ext/v8/upstream/v8/src/arm/simulator-arm.h +413 -0
  70. data/ext/v8/upstream/v8/src/arm/stub-cache-arm.cc +4034 -0
  71. data/ext/v8/upstream/{3.1.8 → v8}/src/arm/virtual-frame-arm-inl.h +0 -0
  72. data/ext/v8/upstream/v8/src/arm/virtual-frame-arm.cc +843 -0
  73. data/ext/v8/upstream/v8/src/arm/virtual-frame-arm.h +523 -0
  74. data/ext/v8/upstream/v8/src/array.js +1249 -0
  75. data/ext/v8/upstream/v8/src/assembler.cc +1067 -0
  76. data/ext/v8/upstream/v8/src/assembler.h +823 -0
  77. data/ext/v8/upstream/v8/src/ast-inl.h +112 -0
  78. data/ext/v8/upstream/v8/src/ast.cc +1078 -0
  79. data/ext/v8/upstream/v8/src/ast.h +2234 -0
  80. data/ext/v8/upstream/v8/src/atomicops.h +167 -0
  81. data/ext/v8/upstream/{3.1.8 → v8}/src/atomicops_internals_arm_gcc.h +0 -0
  82. data/ext/v8/upstream/v8/src/atomicops_internals_mips_gcc.h +169 -0
  83. data/ext/v8/upstream/{3.1.8 → v8}/src/atomicops_internals_x86_gcc.cc +0 -0
  84. data/ext/v8/upstream/{3.1.8 → v8}/src/atomicops_internals_x86_gcc.h +0 -0
  85. data/ext/v8/upstream/{3.1.8 → v8}/src/atomicops_internals_x86_macosx.h +0 -0
  86. data/ext/v8/upstream/{3.1.8 → v8}/src/atomicops_internals_x86_msvc.h +0 -0
  87. data/ext/v8/upstream/{3.1.8 → v8}/src/bignum-dtoa.cc +0 -0
  88. data/ext/v8/upstream/{3.1.8 → v8}/src/bignum-dtoa.h +0 -0
  89. data/ext/v8/upstream/{3.1.8 → v8}/src/bignum.cc +0 -0
  90. data/ext/v8/upstream/{3.1.8 → v8}/src/bignum.h +0 -0
  91. data/ext/v8/upstream/v8/src/bootstrapper.cc +2138 -0
  92. data/ext/v8/upstream/v8/src/bootstrapper.h +185 -0
  93. data/ext/v8/upstream/v8/src/builtins.cc +1708 -0
  94. data/ext/v8/upstream/v8/src/builtins.h +368 -0
  95. data/ext/v8/upstream/{3.1.8 → v8}/src/bytecodes-irregexp.h +0 -0
  96. data/ext/v8/upstream/{3.1.8 → v8}/src/cached-powers.cc +0 -0
  97. data/ext/v8/upstream/{3.1.8 → v8}/src/cached-powers.h +0 -0
  98. data/ext/v8/upstream/{3.1.8 → v8}/src/char-predicates-inl.h +0 -0
  99. data/ext/v8/upstream/{3.1.8 → v8}/src/char-predicates.h +0 -0
  100. data/ext/v8/upstream/v8/src/checks.cc +110 -0
  101. data/ext/v8/upstream/v8/src/checks.h +296 -0
  102. data/ext/v8/upstream/{3.1.8 → v8}/src/circular-queue-inl.h +0 -0
  103. data/ext/v8/upstream/{3.1.8 → v8}/src/circular-queue.cc +0 -0
  104. data/ext/v8/upstream/{3.1.8 → v8}/src/circular-queue.h +0 -0
  105. data/ext/v8/upstream/v8/src/code-stubs.cc +240 -0
  106. data/ext/v8/upstream/v8/src/code-stubs.h +971 -0
  107. data/ext/v8/upstream/{3.1.8 → v8}/src/code.h +0 -0
  108. data/ext/v8/upstream/v8/src/codegen-inl.h +68 -0
  109. data/ext/v8/upstream/v8/src/codegen.cc +505 -0
  110. data/ext/v8/upstream/v8/src/codegen.h +245 -0
  111. data/ext/v8/upstream/v8/src/compilation-cache.cc +540 -0
  112. data/ext/v8/upstream/v8/src/compilation-cache.h +287 -0
  113. data/ext/v8/upstream/v8/src/compiler.cc +792 -0
  114. data/ext/v8/upstream/v8/src/compiler.h +307 -0
  115. data/ext/v8/upstream/v8/src/contexts.cc +327 -0
  116. data/ext/v8/upstream/v8/src/contexts.h +382 -0
  117. data/ext/v8/upstream/{3.1.8 → v8}/src/conversions-inl.h +0 -0
  118. data/ext/v8/upstream/v8/src/conversions.cc +1125 -0
  119. data/ext/v8/upstream/{3.1.8 → v8}/src/conversions.h +0 -0
  120. data/ext/v8/upstream/v8/src/counters.cc +93 -0
  121. data/ext/v8/upstream/v8/src/counters.h +254 -0
  122. data/ext/v8/upstream/v8/src/cpu-profiler-inl.h +101 -0
  123. data/ext/v8/upstream/v8/src/cpu-profiler.cc +606 -0
  124. data/ext/v8/upstream/v8/src/cpu-profiler.h +305 -0
  125. data/ext/v8/upstream/v8/src/cpu.h +67 -0
  126. data/ext/v8/upstream/v8/src/d8-debug.cc +367 -0
  127. data/ext/v8/upstream/v8/src/d8-debug.h +158 -0
  128. data/ext/v8/upstream/v8/src/d8-posix.cc +695 -0
  129. data/ext/v8/upstream/{3.1.8 → v8}/src/d8-readline.cc +0 -0
  130. data/ext/v8/upstream/{3.1.8 → v8}/src/d8-windows.cc +0 -0
  131. data/ext/v8/upstream/v8/src/d8.cc +796 -0
  132. data/ext/v8/upstream/v8/src/d8.gyp +88 -0
  133. data/ext/v8/upstream/{3.1.8 → v8}/src/d8.h +0 -0
  134. data/ext/v8/upstream/{3.1.8 → v8}/src/d8.js +0 -0
  135. data/ext/v8/upstream/{3.1.8 → v8}/src/data-flow.cc +0 -0
  136. data/ext/v8/upstream/v8/src/data-flow.h +379 -0
  137. data/ext/v8/upstream/{3.1.8 → v8}/src/date.js +0 -0
  138. data/ext/v8/upstream/{3.1.8 → v8}/src/dateparser-inl.h +0 -0
  139. data/ext/v8/upstream/{3.1.8 → v8}/src/dateparser.cc +0 -0
  140. data/ext/v8/upstream/v8/src/dateparser.h +265 -0
  141. data/ext/v8/upstream/v8/src/debug-agent.cc +447 -0
  142. data/ext/v8/upstream/v8/src/debug-agent.h +129 -0
  143. data/ext/v8/upstream/{3.1.8 → v8}/src/debug-debugger.js +0 -0
  144. data/ext/v8/upstream/v8/src/debug.cc +3188 -0
  145. data/ext/v8/upstream/v8/src/debug.h +1055 -0
  146. data/ext/v8/upstream/v8/src/deoptimizer.cc +1296 -0
  147. data/ext/v8/upstream/v8/src/deoptimizer.h +629 -0
  148. data/ext/v8/upstream/v8/src/disasm.h +80 -0
  149. data/ext/v8/upstream/v8/src/disassembler.cc +339 -0
  150. data/ext/v8/upstream/{3.1.8 → v8}/src/disassembler.h +0 -0
  151. data/ext/v8/upstream/{3.1.8 → v8}/src/diy-fp.cc +0 -0
  152. data/ext/v8/upstream/{3.1.8 → v8}/src/diy-fp.h +0 -0
  153. data/ext/v8/upstream/{3.1.8 → v8}/src/double.h +0 -0
  154. data/ext/v8/upstream/{3.1.8 → v8}/src/dtoa.cc +0 -0
  155. data/ext/v8/upstream/{3.1.8 → v8}/src/dtoa.h +0 -0
  156. data/ext/v8/upstream/v8/src/execution.cc +791 -0
  157. data/ext/v8/upstream/v8/src/execution.h +291 -0
  158. data/ext/v8/upstream/v8/src/extensions/experimental/break-iterator.cc +250 -0
  159. data/ext/v8/upstream/v8/src/extensions/experimental/break-iterator.h +89 -0
  160. data/ext/v8/upstream/v8/src/extensions/experimental/experimental.gyp +55 -0
  161. data/ext/v8/upstream/v8/src/extensions/experimental/i18n-extension.cc +284 -0
  162. data/ext/v8/upstream/{3.1.8 → v8}/src/extensions/experimental/i18n-extension.h +0 -0
  163. data/ext/v8/upstream/v8/src/extensions/externalize-string-extension.cc +141 -0
  164. data/ext/v8/upstream/{3.1.8 → v8}/src/extensions/externalize-string-extension.h +0 -0
  165. data/ext/v8/upstream/v8/src/extensions/gc-extension.cc +58 -0
  166. data/ext/v8/upstream/{3.1.8 → v8}/src/extensions/gc-extension.h +0 -0
  167. data/ext/v8/upstream/v8/src/factory.cc +1194 -0
  168. data/ext/v8/upstream/v8/src/factory.h +436 -0
  169. data/ext/v8/upstream/{3.1.8 → v8}/src/fast-dtoa.cc +0 -0
  170. data/ext/v8/upstream/{3.1.8 → v8}/src/fast-dtoa.h +0 -0
  171. data/ext/v8/upstream/{3.1.8 → v8}/src/fixed-dtoa.cc +0 -0
  172. data/ext/v8/upstream/{3.1.8 → v8}/src/fixed-dtoa.h +0 -0
  173. data/ext/v8/upstream/v8/src/flag-definitions.h +556 -0
  174. data/ext/v8/upstream/{3.1.8 → v8}/src/flags.cc +0 -0
  175. data/ext/v8/upstream/{3.1.8 → v8}/src/flags.h +0 -0
  176. data/ext/v8/upstream/v8/src/frame-element.cc +37 -0
  177. data/ext/v8/upstream/v8/src/frame-element.h +269 -0
  178. data/ext/v8/upstream/v8/src/frames-inl.h +236 -0
  179. data/ext/v8/upstream/v8/src/frames.cc +1273 -0
  180. data/ext/v8/upstream/v8/src/frames.h +854 -0
  181. data/ext/v8/upstream/v8/src/full-codegen.cc +1385 -0
  182. data/ext/v8/upstream/v8/src/full-codegen.h +753 -0
  183. data/ext/v8/upstream/v8/src/func-name-inferrer.cc +91 -0
  184. data/ext/v8/upstream/v8/src/func-name-inferrer.h +111 -0
  185. data/ext/v8/upstream/v8/src/gdb-jit.cc +1548 -0
  186. data/ext/v8/upstream/{3.1.8 → v8}/src/gdb-jit.h +0 -0
  187. data/ext/v8/upstream/v8/src/global-handles.cc +596 -0
  188. data/ext/v8/upstream/v8/src/global-handles.h +239 -0
  189. data/ext/v8/upstream/v8/src/globals.h +325 -0
  190. data/ext/v8/upstream/v8/src/handles-inl.h +177 -0
  191. data/ext/v8/upstream/v8/src/handles.cc +965 -0
  192. data/ext/v8/upstream/v8/src/handles.h +372 -0
  193. data/ext/v8/upstream/{3.1.8 → v8}/src/hashmap.cc +0 -0
  194. data/ext/v8/upstream/v8/src/hashmap.h +121 -0
  195. data/ext/v8/upstream/v8/src/heap-inl.h +703 -0
  196. data/ext/v8/upstream/v8/src/heap-profiler.cc +1173 -0
  197. data/ext/v8/upstream/v8/src/heap-profiler.h +396 -0
  198. data/ext/v8/upstream/v8/src/heap.cc +5856 -0
  199. data/ext/v8/upstream/v8/src/heap.h +2264 -0
  200. data/ext/v8/upstream/v8/src/hydrogen-instructions.cc +1639 -0
  201. data/ext/v8/upstream/v8/src/hydrogen-instructions.h +3657 -0
  202. data/ext/v8/upstream/v8/src/hydrogen.cc +6011 -0
  203. data/ext/v8/upstream/v8/src/hydrogen.h +1137 -0
  204. data/ext/v8/upstream/v8/src/ia32/assembler-ia32-inl.h +430 -0
  205. data/ext/v8/upstream/v8/src/ia32/assembler-ia32.cc +2846 -0
  206. data/ext/v8/upstream/v8/src/ia32/assembler-ia32.h +1159 -0
  207. data/ext/v8/upstream/v8/src/ia32/builtins-ia32.cc +1596 -0
  208. data/ext/v8/upstream/v8/src/ia32/code-stubs-ia32.cc +6549 -0
  209. data/ext/v8/upstream/v8/src/ia32/code-stubs-ia32.h +495 -0
  210. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/codegen-ia32-inl.h +0 -0
  211. data/ext/v8/upstream/v8/src/ia32/codegen-ia32.cc +10385 -0
  212. data/ext/v8/upstream/v8/src/ia32/codegen-ia32.h +801 -0
  213. data/ext/v8/upstream/v8/src/ia32/cpu-ia32.cc +88 -0
  214. data/ext/v8/upstream/v8/src/ia32/debug-ia32.cc +312 -0
  215. data/ext/v8/upstream/v8/src/ia32/deoptimizer-ia32.cc +774 -0
  216. data/ext/v8/upstream/v8/src/ia32/disasm-ia32.cc +1620 -0
  217. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/frames-ia32.cc +0 -0
  218. data/ext/v8/upstream/v8/src/ia32/frames-ia32.h +140 -0
  219. data/ext/v8/upstream/v8/src/ia32/full-codegen-ia32.cc +4357 -0
  220. data/ext/v8/upstream/v8/src/ia32/ic-ia32.cc +1779 -0
  221. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/jump-target-ia32.cc +0 -0
  222. data/ext/v8/upstream/v8/src/ia32/lithium-codegen-ia32.cc +4158 -0
  223. data/ext/v8/upstream/v8/src/ia32/lithium-codegen-ia32.h +318 -0
  224. data/ext/v8/upstream/v8/src/ia32/lithium-gap-resolver-ia32.cc +466 -0
  225. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/lithium-gap-resolver-ia32.h +0 -0
  226. data/ext/v8/upstream/v8/src/ia32/lithium-ia32.cc +2181 -0
  227. data/ext/v8/upstream/v8/src/ia32/lithium-ia32.h +2235 -0
  228. data/ext/v8/upstream/v8/src/ia32/macro-assembler-ia32.cc +2056 -0
  229. data/ext/v8/upstream/v8/src/ia32/macro-assembler-ia32.h +807 -0
  230. data/ext/v8/upstream/v8/src/ia32/regexp-macro-assembler-ia32.cc +1264 -0
  231. data/ext/v8/upstream/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
  232. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/register-allocator-ia32-inl.h +0 -0
  233. data/ext/v8/upstream/v8/src/ia32/register-allocator-ia32.cc +157 -0
  234. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/register-allocator-ia32.h +0 -0
  235. data/ext/v8/upstream/{3.1.8 → v8}/src/ia32/simulator-ia32.cc +0 -0
  236. data/ext/v8/upstream/v8/src/ia32/simulator-ia32.h +72 -0
  237. data/ext/v8/upstream/v8/src/ia32/stub-cache-ia32.cc +3711 -0
  238. data/ext/v8/upstream/v8/src/ia32/virtual-frame-ia32.cc +1366 -0
  239. data/ext/v8/upstream/v8/src/ia32/virtual-frame-ia32.h +650 -0
  240. data/ext/v8/upstream/v8/src/ic-inl.h +130 -0
  241. data/ext/v8/upstream/v8/src/ic.cc +2389 -0
  242. data/ext/v8/upstream/v8/src/ic.h +675 -0
  243. data/ext/v8/upstream/{3.1.8 → v8}/src/inspector.cc +0 -0
  244. data/ext/v8/upstream/{3.1.8 → v8}/src/inspector.h +0 -0
  245. data/ext/v8/upstream/v8/src/interpreter-irregexp.cc +659 -0
  246. data/ext/v8/upstream/v8/src/interpreter-irregexp.h +49 -0
  247. data/ext/v8/upstream/v8/src/isolate.cc +883 -0
  248. data/ext/v8/upstream/v8/src/isolate.h +1306 -0
  249. data/ext/v8/upstream/v8/src/json.js +342 -0
  250. data/ext/v8/upstream/v8/src/jsregexp.cc +5371 -0
  251. data/ext/v8/upstream/v8/src/jsregexp.h +1483 -0
  252. data/ext/v8/upstream/{3.1.8 → v8}/src/jump-target-heavy-inl.h +0 -0
  253. data/ext/v8/upstream/v8/src/jump-target-heavy.cc +427 -0
  254. data/ext/v8/upstream/v8/src/jump-target-heavy.h +238 -0
  255. data/ext/v8/upstream/v8/src/jump-target-inl.h +48 -0
  256. data/ext/v8/upstream/{3.1.8 → v8}/src/jump-target-light-inl.h +0 -0
  257. data/ext/v8/upstream/v8/src/jump-target-light.cc +111 -0
  258. data/ext/v8/upstream/{3.1.8 → v8}/src/jump-target-light.h +0 -0
  259. data/ext/v8/upstream/{3.1.8 → v8}/src/jump-target.cc +0 -0
  260. data/ext/v8/upstream/{3.1.8 → v8}/src/jump-target.h +0 -0
  261. data/ext/v8/upstream/{3.1.8 → v8}/src/list-inl.h +0 -0
  262. data/ext/v8/upstream/{3.1.8 → v8}/src/list.h +0 -0
  263. data/ext/v8/upstream/v8/src/lithium-allocator-inl.h +142 -0
  264. data/ext/v8/upstream/v8/src/lithium-allocator.cc +2105 -0
  265. data/ext/v8/upstream/v8/src/lithium-allocator.h +630 -0
  266. data/ext/v8/upstream/v8/src/lithium.cc +169 -0
  267. data/ext/v8/upstream/{3.1.8 → v8}/src/lithium.h +0 -0
  268. data/ext/v8/upstream/{3.1.8 → v8}/src/liveedit-debugger.js +0 -0
  269. data/ext/v8/upstream/v8/src/liveedit.cc +1693 -0
  270. data/ext/v8/upstream/v8/src/liveedit.h +179 -0
  271. data/ext/v8/upstream/{3.1.8 → v8}/src/liveobjectlist-inl.h +0 -0
  272. data/ext/v8/upstream/v8/src/liveobjectlist.cc +2589 -0
  273. data/ext/v8/upstream/v8/src/liveobjectlist.h +322 -0
  274. data/ext/v8/upstream/{3.1.8 → v8}/src/log-inl.h +0 -0
  275. data/ext/v8/upstream/v8/src/log-utils.cc +423 -0
  276. data/ext/v8/upstream/v8/src/log-utils.h +229 -0
  277. data/ext/v8/upstream/v8/src/log.cc +1666 -0
  278. data/ext/v8/upstream/v8/src/log.h +446 -0
  279. data/ext/v8/upstream/{3.1.8 → v8}/src/macro-assembler.h +0 -0
  280. data/ext/v8/upstream/{3.1.8 → v8}/src/macros.py +0 -0
  281. data/ext/v8/upstream/v8/src/mark-compact.cc +3092 -0
  282. data/ext/v8/upstream/v8/src/mark-compact.h +506 -0
  283. data/ext/v8/upstream/{3.1.8 → v8}/src/math.js +0 -0
  284. data/ext/v8/upstream/v8/src/messages.cc +166 -0
  285. data/ext/v8/upstream/{3.1.8 → v8}/src/messages.h +0 -0
  286. data/ext/v8/upstream/v8/src/messages.js +1090 -0
  287. data/ext/v8/upstream/v8/src/mips/assembler-mips-inl.h +335 -0
  288. data/ext/v8/upstream/v8/src/mips/assembler-mips.cc +2093 -0
  289. data/ext/v8/upstream/v8/src/mips/assembler-mips.h +1066 -0
  290. data/ext/v8/upstream/v8/src/mips/builtins-mips.cc +148 -0
  291. data/ext/v8/upstream/v8/src/mips/code-stubs-mips.cc +752 -0
  292. data/ext/v8/upstream/v8/src/mips/code-stubs-mips.h +511 -0
  293. data/ext/v8/upstream/v8/src/mips/codegen-mips-inl.h +64 -0
  294. data/ext/v8/upstream/v8/src/mips/codegen-mips.cc +1213 -0
  295. data/ext/v8/upstream/v8/src/mips/codegen-mips.h +633 -0
  296. data/ext/v8/upstream/v8/src/mips/constants-mips.cc +352 -0
  297. data/ext/v8/upstream/v8/src/mips/constants-mips.h +723 -0
  298. data/ext/v8/upstream/v8/src/mips/cpu-mips.cc +90 -0
  299. data/ext/v8/upstream/v8/src/mips/debug-mips.cc +155 -0
  300. data/ext/v8/upstream/v8/src/mips/deoptimizer-mips.cc +91 -0
  301. data/ext/v8/upstream/v8/src/mips/disasm-mips.cc +1023 -0
  302. data/ext/v8/upstream/v8/src/mips/frames-mips.cc +48 -0
  303. data/ext/v8/upstream/v8/src/mips/frames-mips.h +179 -0
  304. data/ext/v8/upstream/v8/src/mips/full-codegen-mips.cc +727 -0
  305. data/ext/v8/upstream/v8/src/mips/ic-mips.cc +244 -0
  306. data/ext/v8/upstream/v8/src/mips/jump-target-mips.cc +80 -0
  307. data/ext/v8/upstream/v8/src/mips/lithium-codegen-mips.h +65 -0
  308. data/ext/v8/upstream/v8/src/mips/lithium-mips.h +304 -0
  309. data/ext/v8/upstream/v8/src/mips/macro-assembler-mips.cc +3327 -0
  310. data/ext/v8/upstream/v8/src/mips/macro-assembler-mips.h +1058 -0
  311. data/ext/v8/upstream/v8/src/mips/regexp-macro-assembler-mips.cc +478 -0
  312. data/ext/v8/upstream/v8/src/mips/regexp-macro-assembler-mips.h +250 -0
  313. data/ext/v8/upstream/v8/src/mips/register-allocator-mips-inl.h +134 -0
  314. data/ext/v8/upstream/{3.1.8 → v8}/src/mips/register-allocator-mips.cc +0 -0
  315. data/ext/v8/upstream/v8/src/mips/register-allocator-mips.h +47 -0
  316. data/ext/v8/upstream/v8/src/mips/simulator-mips.cc +2438 -0
  317. data/ext/v8/upstream/v8/src/mips/simulator-mips.h +394 -0
  318. data/ext/v8/upstream/v8/src/mips/stub-cache-mips.cc +601 -0
  319. data/ext/v8/upstream/v8/src/mips/virtual-frame-mips-inl.h +58 -0
  320. data/ext/v8/upstream/v8/src/mips/virtual-frame-mips.cc +307 -0
  321. data/ext/v8/upstream/v8/src/mips/virtual-frame-mips.h +530 -0
  322. data/ext/v8/upstream/v8/src/mirror-debugger.js +2381 -0
  323. data/ext/v8/upstream/v8/src/mksnapshot.cc +256 -0
  324. data/ext/v8/upstream/{3.1.8 → v8}/src/natives.h +0 -0
  325. data/ext/v8/upstream/v8/src/objects-debug.cc +722 -0
  326. data/ext/v8/upstream/v8/src/objects-inl.h +4166 -0
  327. data/ext/v8/upstream/v8/src/objects-printer.cc +801 -0
  328. data/ext/v8/upstream/v8/src/objects-visiting.cc +142 -0
  329. data/ext/v8/upstream/v8/src/objects-visiting.h +422 -0
  330. data/ext/v8/upstream/v8/src/objects.cc +10296 -0
  331. data/ext/v8/upstream/v8/src/objects.h +6662 -0
  332. data/ext/v8/upstream/v8/src/parser.cc +5168 -0
  333. data/ext/v8/upstream/v8/src/parser.h +823 -0
  334. data/ext/v8/upstream/v8/src/platform-cygwin.cc +811 -0
  335. data/ext/v8/upstream/v8/src/platform-freebsd.cc +854 -0
  336. data/ext/v8/upstream/v8/src/platform-linux.cc +1120 -0
  337. data/ext/v8/upstream/v8/src/platform-macos.cc +865 -0
  338. data/ext/v8/upstream/v8/src/platform-nullos.cc +504 -0
  339. data/ext/v8/upstream/v8/src/platform-openbsd.cc +672 -0
  340. data/ext/v8/upstream/v8/src/platform-posix.cc +424 -0
  341. data/ext/v8/upstream/v8/src/platform-solaris.cc +796 -0
  342. data/ext/v8/upstream/v8/src/platform-tls-mac.h +62 -0
  343. data/ext/v8/upstream/v8/src/platform-tls-win32.h +62 -0
  344. data/ext/v8/upstream/v8/src/platform-tls.h +50 -0
  345. data/ext/v8/upstream/v8/src/platform-win32.cc +2072 -0
  346. data/ext/v8/upstream/v8/src/platform.h +693 -0
  347. data/ext/v8/upstream/v8/src/preparse-data.cc +185 -0
  348. data/ext/v8/upstream/{3.1.8 → v8}/src/preparse-data.h +0 -0
  349. data/ext/v8/upstream/v8/src/preparser-api.cc +219 -0
  350. data/ext/v8/upstream/v8/src/preparser.cc +1205 -0
  351. data/ext/v8/upstream/{3.1.8 → v8}/src/preparser.h +0 -0
  352. data/ext/v8/upstream/v8/src/prettyprinter.cc +1530 -0
  353. data/ext/v8/upstream/v8/src/prettyprinter.h +223 -0
  354. data/ext/v8/upstream/{3.1.8 → v8}/src/profile-generator-inl.h +0 -0
  355. data/ext/v8/upstream/v8/src/profile-generator.cc +3095 -0
  356. data/ext/v8/upstream/v8/src/profile-generator.h +1125 -0
  357. data/ext/v8/upstream/v8/src/property.cc +102 -0
  358. data/ext/v8/upstream/v8/src/property.h +348 -0
  359. data/ext/v8/upstream/{3.1.8 → v8}/src/regexp-macro-assembler-irregexp-inl.h +0 -0
  360. data/ext/v8/upstream/v8/src/regexp-macro-assembler-irregexp.cc +470 -0
  361. data/ext/v8/upstream/{3.1.8 → v8}/src/regexp-macro-assembler-irregexp.h +0 -0
  362. data/ext/v8/upstream/{3.1.8 → v8}/src/regexp-macro-assembler-tracer.cc +0 -0
  363. data/ext/v8/upstream/{3.1.8 → v8}/src/regexp-macro-assembler-tracer.h +0 -0
  364. data/ext/v8/upstream/v8/src/regexp-macro-assembler.cc +266 -0
  365. data/ext/v8/upstream/v8/src/regexp-macro-assembler.h +236 -0
  366. data/ext/v8/upstream/v8/src/regexp-stack.cc +111 -0
  367. data/ext/v8/upstream/v8/src/regexp-stack.h +147 -0
  368. data/ext/v8/upstream/v8/src/regexp.js +483 -0
  369. data/ext/v8/upstream/v8/src/register-allocator-inl.h +141 -0
  370. data/ext/v8/upstream/v8/src/register-allocator.cc +98 -0
  371. data/ext/v8/upstream/v8/src/register-allocator.h +310 -0
  372. data/ext/v8/upstream/v8/src/rewriter.cc +1024 -0
  373. data/ext/v8/upstream/{3.1.8 → v8}/src/rewriter.h +0 -0
  374. data/ext/v8/upstream/v8/src/runtime-profiler.cc +478 -0
  375. data/ext/v8/upstream/v8/src/runtime-profiler.h +192 -0
  376. data/ext/v8/upstream/v8/src/runtime.cc +11949 -0
  377. data/ext/v8/upstream/v8/src/runtime.h +643 -0
  378. data/ext/v8/upstream/{3.1.8 → v8}/src/runtime.js +0 -0
  379. data/ext/v8/upstream/v8/src/safepoint-table.cc +256 -0
  380. data/ext/v8/upstream/v8/src/safepoint-table.h +269 -0
  381. data/ext/v8/upstream/v8/src/scanner-base.cc +964 -0
  382. data/ext/v8/upstream/v8/src/scanner-base.h +664 -0
  383. data/ext/v8/upstream/v8/src/scanner.cc +584 -0
  384. data/ext/v8/upstream/v8/src/scanner.h +196 -0
  385. data/ext/v8/upstream/v8/src/scopeinfo.cc +631 -0
  386. data/ext/v8/upstream/v8/src/scopeinfo.h +249 -0
  387. data/ext/v8/upstream/v8/src/scopes.cc +1093 -0
  388. data/ext/v8/upstream/v8/src/scopes.h +508 -0
  389. data/ext/v8/upstream/v8/src/serialize.cc +1574 -0
  390. data/ext/v8/upstream/v8/src/serialize.h +589 -0
  391. data/ext/v8/upstream/{3.1.8 → v8}/src/shell.h +0 -0
  392. data/ext/v8/upstream/{3.1.8 → v8}/src/simulator.h +0 -0
  393. data/ext/v8/upstream/v8/src/small-pointer-list.h +163 -0
  394. data/ext/v8/upstream/{3.1.8 → v8}/src/smart-pointer.h +0 -0
  395. data/ext/v8/upstream/v8/src/snapshot-common.cc +82 -0
  396. data/ext/v8/upstream/{3.1.8 → v8}/src/snapshot-empty.cc +0 -0
  397. data/ext/v8/upstream/v8/src/snapshot.h +73 -0
  398. data/ext/v8/upstream/v8/src/spaces-inl.h +529 -0
  399. data/ext/v8/upstream/v8/src/spaces.cc +3147 -0
  400. data/ext/v8/upstream/v8/src/spaces.h +2368 -0
  401. data/ext/v8/upstream/{3.1.8 → v8}/src/splay-tree-inl.h +0 -0
  402. data/ext/v8/upstream/{3.1.8 → v8}/src/splay-tree.h +0 -0
  403. data/ext/v8/upstream/v8/src/string-search.cc +41 -0
  404. data/ext/v8/upstream/v8/src/string-search.h +568 -0
  405. data/ext/v8/upstream/v8/src/string-stream.cc +592 -0
  406. data/ext/v8/upstream/{3.1.8 → v8}/src/string-stream.h +0 -0
  407. data/ext/v8/upstream/v8/src/string.js +915 -0
  408. data/ext/v8/upstream/{3.1.8 → v8}/src/strtod.cc +0 -0
  409. data/ext/v8/upstream/{3.1.8 → v8}/src/strtod.h +0 -0
  410. data/ext/v8/upstream/v8/src/stub-cache.cc +1940 -0
  411. data/ext/v8/upstream/v8/src/stub-cache.h +866 -0
  412. data/ext/v8/upstream/{3.1.8 → v8}/src/third_party/valgrind/valgrind.h +0 -0
  413. data/ext/v8/upstream/v8/src/token.cc +63 -0
  414. data/ext/v8/upstream/v8/src/token.h +288 -0
  415. data/ext/v8/upstream/v8/src/top.cc +983 -0
  416. data/ext/v8/upstream/v8/src/type-info.cc +472 -0
  417. data/ext/v8/upstream/v8/src/type-info.h +290 -0
  418. data/ext/v8/upstream/{3.1.8 → v8}/src/unbound-queue-inl.h +0 -0
  419. data/ext/v8/upstream/{3.1.8 → v8}/src/unbound-queue.h +0 -0
  420. data/ext/v8/upstream/{3.1.8 → v8}/src/unicode-inl.h +0 -0
  421. data/ext/v8/upstream/v8/src/unicode.cc +1624 -0
  422. data/ext/v8/upstream/v8/src/unicode.h +280 -0
  423. data/ext/v8/upstream/{3.1.8 → v8}/src/uri.js +0 -0
  424. data/ext/v8/upstream/{3.1.8 → v8}/src/utils.cc +0 -0
  425. data/ext/v8/upstream/v8/src/utils.h +796 -0
  426. data/ext/v8/upstream/v8/src/v8-counters.cc +62 -0
  427. data/ext/v8/upstream/v8/src/v8-counters.h +311 -0
  428. data/ext/v8/upstream/v8/src/v8.cc +215 -0
  429. data/ext/v8/upstream/v8/src/v8.h +130 -0
  430. data/ext/v8/upstream/{3.1.8 → v8}/src/v8checks.h +0 -0
  431. data/ext/v8/upstream/{3.1.8 → v8}/src/v8dll-main.cc +0 -0
  432. data/ext/v8/upstream/v8/src/v8globals.h +486 -0
  433. data/ext/v8/upstream/{3.1.8/src/memory.h → v8/src/v8memory.h} +0 -0
  434. data/ext/v8/upstream/v8/src/v8natives.js +1293 -0
  435. data/ext/v8/upstream/{3.1.8 → v8}/src/v8preparserdll-main.cc +0 -0
  436. data/ext/v8/upstream/v8/src/v8threads.cc +453 -0
  437. data/ext/v8/upstream/v8/src/v8threads.h +164 -0
  438. data/ext/v8/upstream/v8/src/v8utils.h +317 -0
  439. data/ext/v8/upstream/{3.1.8 → v8}/src/variables.cc +0 -0
  440. data/ext/v8/upstream/v8/src/variables.h +212 -0
  441. data/ext/v8/upstream/v8/src/version.cc +116 -0
  442. data/ext/v8/upstream/v8/src/version.h +68 -0
  443. data/ext/v8/upstream/{3.1.8 → v8}/src/virtual-frame-heavy-inl.h +0 -0
  444. data/ext/v8/upstream/{3.1.8 → v8}/src/virtual-frame-heavy.cc +0 -0
  445. data/ext/v8/upstream/{3.1.8 → v8}/src/virtual-frame-inl.h +0 -0
  446. data/ext/v8/upstream/v8/src/virtual-frame-light-inl.h +171 -0
  447. data/ext/v8/upstream/{3.1.8 → v8}/src/virtual-frame-light.cc +0 -0
  448. data/ext/v8/upstream/{3.1.8 → v8}/src/virtual-frame.cc +0 -0
  449. data/ext/v8/upstream/{3.1.8 → v8}/src/virtual-frame.h +0 -0
  450. data/ext/v8/upstream/v8/src/vm-state-inl.h +138 -0
  451. data/ext/v8/upstream/v8/src/vm-state.h +70 -0
  452. data/ext/v8/upstream/v8/src/win32-headers.h +96 -0
  453. data/ext/v8/upstream/v8/src/x64/assembler-x64-inl.h +456 -0
  454. data/ext/v8/upstream/v8/src/x64/assembler-x64.cc +2954 -0
  455. data/ext/v8/upstream/v8/src/x64/assembler-x64.h +1630 -0
  456. data/ext/v8/upstream/v8/src/x64/builtins-x64.cc +1493 -0
  457. data/ext/v8/upstream/v8/src/x64/code-stubs-x64.cc +5132 -0
  458. data/ext/v8/upstream/v8/src/x64/code-stubs-x64.h +477 -0
  459. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/codegen-x64-inl.h +0 -0
  460. data/ext/v8/upstream/v8/src/x64/codegen-x64.cc +8843 -0
  461. data/ext/v8/upstream/v8/src/x64/codegen-x64.h +753 -0
  462. data/ext/v8/upstream/v8/src/x64/cpu-x64.cc +88 -0
  463. data/ext/v8/upstream/v8/src/x64/debug-x64.cc +318 -0
  464. data/ext/v8/upstream/v8/src/x64/deoptimizer-x64.cc +815 -0
  465. data/ext/v8/upstream/v8/src/x64/disasm-x64.cc +1752 -0
  466. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/frames-x64.cc +0 -0
  467. data/ext/v8/upstream/v8/src/x64/frames-x64.h +130 -0
  468. data/ext/v8/upstream/v8/src/x64/full-codegen-x64.cc +4339 -0
  469. data/ext/v8/upstream/v8/src/x64/ic-x64.cc +1752 -0
  470. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/jump-target-x64.cc +0 -0
  471. data/ext/v8/upstream/v8/src/x64/lithium-codegen-x64.cc +3970 -0
  472. data/ext/v8/upstream/v8/src/x64/lithium-codegen-x64.h +318 -0
  473. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/lithium-gap-resolver-x64.cc +0 -0
  474. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/lithium-gap-resolver-x64.h +0 -0
  475. data/ext/v8/upstream/v8/src/x64/lithium-x64.cc +2115 -0
  476. data/ext/v8/upstream/v8/src/x64/lithium-x64.h +2161 -0
  477. data/ext/v8/upstream/v8/src/x64/macro-assembler-x64.cc +2911 -0
  478. data/ext/v8/upstream/v8/src/x64/macro-assembler-x64.h +1984 -0
  479. data/ext/v8/upstream/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
  480. data/ext/v8/upstream/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
  481. data/ext/v8/upstream/v8/src/x64/register-allocator-x64-inl.h +87 -0
  482. data/ext/v8/upstream/v8/src/x64/register-allocator-x64.cc +95 -0
  483. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/register-allocator-x64.h +0 -0
  484. data/ext/v8/upstream/{3.1.8 → v8}/src/x64/simulator-x64.cc +0 -0
  485. data/ext/v8/upstream/v8/src/x64/simulator-x64.h +71 -0
  486. data/ext/v8/upstream/v8/src/x64/stub-cache-x64.cc +3460 -0
  487. data/ext/v8/upstream/v8/src/x64/virtual-frame-x64.cc +1296 -0
  488. data/ext/v8/upstream/v8/src/x64/virtual-frame-x64.h +597 -0
  489. data/ext/v8/upstream/v8/src/zone-inl.h +129 -0
  490. data/ext/v8/upstream/v8/src/zone.cc +196 -0
  491. data/ext/v8/upstream/v8/src/zone.h +236 -0
  492. data/ext/v8/upstream/{3.1.8 → v8}/tools/codemap.js +0 -0
  493. data/ext/v8/upstream/{3.1.8 → v8}/tools/consarray.js +0 -0
  494. data/ext/v8/upstream/{3.1.8 → v8}/tools/csvparser.js +0 -0
  495. data/ext/v8/upstream/{3.1.8 → v8}/tools/disasm.py +0 -0
  496. data/ext/v8/upstream/v8/tools/freebsd-tick-processor +10 -0
  497. data/ext/v8/upstream/{3.1.8 → v8}/tools/gc-nvp-trace-processor.py +0 -0
  498. data/ext/v8/upstream/{3.1.8 → v8}/tools/generate-ten-powers.scm +0 -0
  499. data/ext/v8/upstream/{3.1.8 → v8}/tools/grokdump.py +0 -0
  500. data/ext/v8/upstream/v8/tools/gyp/v8.gyp +844 -0
  501. data/ext/v8/upstream/{3.1.8 → v8}/tools/js2c.py +0 -0
  502. data/ext/v8/upstream/{3.1.8 → v8}/tools/jsmin.py +0 -0
  503. data/ext/v8/upstream/v8/tools/linux-tick-processor +35 -0
  504. data/ext/v8/upstream/{3.1.8 → v8}/tools/ll_prof.py +0 -0
  505. data/ext/v8/upstream/{3.1.8 → v8}/tools/logreader.js +0 -0
  506. data/ext/v8/upstream/{3.1.8 → v8}/tools/mac-nm +0 -0
  507. data/ext/v8/upstream/{3.1.8 → v8}/tools/mac-tick-processor +0 -0
  508. data/ext/v8/upstream/{3.1.8 → v8}/tools/oom_dump/README +0 -0
  509. data/ext/v8/upstream/{3.1.8 → v8}/tools/oom_dump/SConstruct +0 -0
  510. data/ext/v8/upstream/{3.1.8 → v8}/tools/oom_dump/oom_dump.cc +0 -0
  511. data/ext/v8/upstream/{3.1.8 → v8}/tools/presubmit.py +0 -0
  512. data/ext/v8/upstream/{3.1.8 → v8}/tools/process-heap-prof.py +0 -0
  513. data/ext/v8/upstream/{3.1.8 → v8}/tools/profile.js +0 -0
  514. data/ext/v8/upstream/{3.1.8 → v8}/tools/profile_view.js +0 -0
  515. data/ext/v8/upstream/{3.1.8 → v8}/tools/run-valgrind.py +0 -0
  516. data/ext/v8/upstream/{3.1.8 → v8}/tools/splaytree.js +0 -0
  517. data/ext/v8/upstream/{3.1.8 → v8}/tools/stats-viewer.py +0 -0
  518. data/ext/v8/upstream/v8/tools/test.py +1490 -0
  519. data/ext/v8/upstream/{3.1.8 → v8}/tools/tickprocessor-driver.js +0 -0
  520. data/ext/v8/upstream/v8/tools/tickprocessor.js +877 -0
  521. data/ext/v8/upstream/{3.1.8 → v8}/tools/utils.py +0 -0
  522. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/README.txt +0 -0
  523. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/arm.vsprops +0 -0
  524. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/common.vsprops +0 -0
  525. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/d8.vcproj +0 -0
  526. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/d8_arm.vcproj +0 -0
  527. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/d8_x64.vcproj +0 -0
  528. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/d8js2c.cmd +0 -0
  529. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/debug.vsprops +0 -0
  530. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/ia32.vsprops +0 -0
  531. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/js2c.cmd +0 -0
  532. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/release.vsprops +0 -0
  533. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8.sln +0 -0
  534. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8.vcproj +0 -0
  535. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_arm.sln +0 -0
  536. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_arm.vcproj +0 -0
  537. data/ext/v8/upstream/v8/tools/visual_studio/v8_base.vcproj +1308 -0
  538. data/ext/v8/upstream/v8/tools/visual_studio/v8_base_arm.vcproj +1238 -0
  539. data/ext/v8/upstream/v8/tools/visual_studio/v8_base_x64.vcproj +1300 -0
  540. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_cctest.vcproj +0 -0
  541. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_cctest_arm.vcproj +0 -0
  542. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_cctest_x64.vcproj +0 -0
  543. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_mksnapshot.vcproj +0 -0
  544. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -0
  545. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_process_sample.vcproj +0 -0
  546. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_process_sample_arm.vcproj +0 -0
  547. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_process_sample_x64.vcproj +0 -0
  548. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_shell_sample.vcproj +0 -0
  549. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_shell_sample_arm.vcproj +0 -0
  550. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_shell_sample_x64.vcproj +0 -0
  551. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_snapshot.vcproj +0 -0
  552. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_snapshot_cc.vcproj +0 -0
  553. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -0
  554. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_snapshot_x64.vcproj +0 -0
  555. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_x64.sln +0 -0
  556. data/ext/v8/upstream/{3.1.8 → v8}/tools/visual_studio/v8_x64.vcproj +0 -0
  557. data/ext/v8/upstream/v8/tools/visual_studio/x64.vsprops +18 -0
  558. data/ext/v8/upstream/{3.1.8 → v8}/tools/windows-tick-processor.bat +0 -0
  559. data/ext/v8/v8_callbacks.cpp +52 -92
  560. data/ext/v8/v8_date.cpp +2 -3
  561. data/ext/v8/v8_object.cpp +4 -0
  562. data/ext/v8/v8_template.cpp +2 -2
  563. data/ext/v8/v8_try_catch.cpp +8 -38
  564. data/lib/v8/version.rb +1 -1
  565. data/spec/ext/ext_spec_helper.rb +2 -20
  566. data/spec/ext/object_spec.rb +0 -12
  567. data/spec/ext/try_catch_spec.rb +29 -1
  568. data/spec/spec_helper.rb +1 -0
  569. data/spec/v8/portal/proxies_spec.rb +1 -84
  570. data/specmem/handle_memspec.rb +41 -0
  571. data/specmem/object_memspec.rb +16 -0
  572. data/specmem/proxies_memspec.rb +86 -0
  573. data/specmem/spec_helper.rb +24 -0
  574. data/therubyracer.gemspec +7 -2
  575. metadata +564 -541
  576. data/ext/v8/upstream/3.1.8/.gitignore +0 -31
  577. data/ext/v8/upstream/3.1.8/AUTHORS +0 -40
  578. data/ext/v8/upstream/3.1.8/ChangeLog +0 -2566
  579. data/ext/v8/upstream/3.1.8/SConstruct +0 -1192
  580. data/ext/v8/upstream/3.1.8/include/v8-debug.h +0 -384
  581. data/ext/v8/upstream/3.1.8/include/v8-preparser.h +0 -116
  582. data/ext/v8/upstream/3.1.8/include/v8-profiler.h +0 -426
  583. data/ext/v8/upstream/3.1.8/include/v8-testing.h +0 -99
  584. data/ext/v8/upstream/3.1.8/include/v8.h +0 -3846
  585. data/ext/v8/upstream/3.1.8/preparser/preparser-process.cc +0 -206
  586. data/ext/v8/upstream/3.1.8/src/SConscript +0 -356
  587. data/ext/v8/upstream/3.1.8/src/accessors.cc +0 -907
  588. data/ext/v8/upstream/3.1.8/src/allocation.cc +0 -204
  589. data/ext/v8/upstream/3.1.8/src/allocation.h +0 -176
  590. data/ext/v8/upstream/3.1.8/src/api.cc +0 -5191
  591. data/ext/v8/upstream/3.1.8/src/api.h +0 -508
  592. data/ext/v8/upstream/3.1.8/src/apiutils.h +0 -80
  593. data/ext/v8/upstream/3.1.8/src/arguments.h +0 -105
  594. data/ext/v8/upstream/3.1.8/src/arm/assembler-arm-inl.h +0 -352
  595. data/ext/v8/upstream/3.1.8/src/arm/assembler-arm.cc +0 -2756
  596. data/ext/v8/upstream/3.1.8/src/arm/assembler-arm.h +0 -1294
  597. data/ext/v8/upstream/3.1.8/src/arm/builtins-arm.cc +0 -1628
  598. data/ext/v8/upstream/3.1.8/src/arm/code-stubs-arm.cc +0 -6783
  599. data/ext/v8/upstream/3.1.8/src/arm/code-stubs-arm.h +0 -657
  600. data/ext/v8/upstream/3.1.8/src/arm/codegen-arm.cc +0 -7403
  601. data/ext/v8/upstream/3.1.8/src/arm/codegen-arm.h +0 -595
  602. data/ext/v8/upstream/3.1.8/src/arm/constants-arm.h +0 -769
  603. data/ext/v8/upstream/3.1.8/src/arm/cpu-arm.cc +0 -147
  604. data/ext/v8/upstream/3.1.8/src/arm/debug-arm.cc +0 -315
  605. data/ext/v8/upstream/3.1.8/src/arm/deoptimizer-arm.cc +0 -700
  606. data/ext/v8/upstream/3.1.8/src/arm/disasm-arm.cc +0 -1439
  607. data/ext/v8/upstream/3.1.8/src/arm/frames-arm.h +0 -168
  608. data/ext/v8/upstream/3.1.8/src/arm/full-codegen-arm.cc +0 -4230
  609. data/ext/v8/upstream/3.1.8/src/arm/ic-arm.cc +0 -1799
  610. data/ext/v8/upstream/3.1.8/src/arm/lithium-arm.cc +0 -2041
  611. data/ext/v8/upstream/3.1.8/src/arm/lithium-arm.h +0 -2046
  612. data/ext/v8/upstream/3.1.8/src/arm/lithium-codegen-arm.cc +0 -3822
  613. data/ext/v8/upstream/3.1.8/src/arm/lithium-codegen-arm.h +0 -312
  614. data/ext/v8/upstream/3.1.8/src/arm/lithium-gap-resolver-arm.cc +0 -303
  615. data/ext/v8/upstream/3.1.8/src/arm/macro-assembler-arm.cc +0 -2701
  616. data/ext/v8/upstream/3.1.8/src/arm/macro-assembler-arm.h +0 -1015
  617. data/ext/v8/upstream/3.1.8/src/arm/regexp-macro-assembler-arm.cc +0 -1280
  618. data/ext/v8/upstream/3.1.8/src/arm/regexp-macro-assembler-arm.h +0 -252
  619. data/ext/v8/upstream/3.1.8/src/arm/simulator-arm.cc +0 -3165
  620. data/ext/v8/upstream/3.1.8/src/arm/simulator-arm.h +0 -402
  621. data/ext/v8/upstream/3.1.8/src/arm/stub-cache-arm.cc +0 -4077
  622. data/ext/v8/upstream/3.1.8/src/arm/virtual-frame-arm.cc +0 -843
  623. data/ext/v8/upstream/3.1.8/src/arm/virtual-frame-arm.h +0 -520
  624. data/ext/v8/upstream/3.1.8/src/array.js +0 -1231
  625. data/ext/v8/upstream/3.1.8/src/assembler.cc +0 -973
  626. data/ext/v8/upstream/3.1.8/src/assembler.h +0 -787
  627. data/ext/v8/upstream/3.1.8/src/ast-inl.h +0 -107
  628. data/ext/v8/upstream/3.1.8/src/ast.cc +0 -1067
  629. data/ext/v8/upstream/3.1.8/src/ast.h +0 -2177
  630. data/ext/v8/upstream/3.1.8/src/atomicops.h +0 -165
  631. data/ext/v8/upstream/3.1.8/src/bootstrapper.cc +0 -1888
  632. data/ext/v8/upstream/3.1.8/src/bootstrapper.h +0 -118
  633. data/ext/v8/upstream/3.1.8/src/builtins.cc +0 -1586
  634. data/ext/v8/upstream/3.1.8/src/builtins.h +0 -339
  635. data/ext/v8/upstream/3.1.8/src/checks.cc +0 -110
  636. data/ext/v8/upstream/3.1.8/src/checks.h +0 -292
  637. data/ext/v8/upstream/3.1.8/src/code-stubs.cc +0 -230
  638. data/ext/v8/upstream/3.1.8/src/code-stubs.h +0 -950
  639. data/ext/v8/upstream/3.1.8/src/codegen-inl.h +0 -64
  640. data/ext/v8/upstream/3.1.8/src/codegen.cc +0 -495
  641. data/ext/v8/upstream/3.1.8/src/codegen.h +0 -245
  642. data/ext/v8/upstream/3.1.8/src/compilation-cache.cc +0 -654
  643. data/ext/v8/upstream/3.1.8/src/compilation-cache.h +0 -112
  644. data/ext/v8/upstream/3.1.8/src/compiler.cc +0 -806
  645. data/ext/v8/upstream/3.1.8/src/compiler.h +0 -290
  646. data/ext/v8/upstream/3.1.8/src/contexts.cc +0 -320
  647. data/ext/v8/upstream/3.1.8/src/contexts.h +0 -376
  648. data/ext/v8/upstream/3.1.8/src/conversions.cc +0 -1069
  649. data/ext/v8/upstream/3.1.8/src/counters.cc +0 -78
  650. data/ext/v8/upstream/3.1.8/src/counters.h +0 -242
  651. data/ext/v8/upstream/3.1.8/src/cpu-profiler-inl.h +0 -100
  652. data/ext/v8/upstream/3.1.8/src/cpu-profiler.cc +0 -554
  653. data/ext/v8/upstream/3.1.8/src/cpu-profiler.h +0 -291
  654. data/ext/v8/upstream/3.1.8/src/cpu.h +0 -65
  655. data/ext/v8/upstream/3.1.8/src/d8-debug.cc +0 -367
  656. data/ext/v8/upstream/3.1.8/src/d8-debug.h +0 -157
  657. data/ext/v8/upstream/3.1.8/src/d8-posix.cc +0 -693
  658. data/ext/v8/upstream/3.1.8/src/d8.cc +0 -792
  659. data/ext/v8/upstream/3.1.8/src/d8.gyp +0 -85
  660. data/ext/v8/upstream/3.1.8/src/data-flow.h +0 -379
  661. data/ext/v8/upstream/3.1.8/src/dateparser.h +0 -263
  662. data/ext/v8/upstream/3.1.8/src/debug-agent.cc +0 -446
  663. data/ext/v8/upstream/3.1.8/src/debug-agent.h +0 -131
  664. data/ext/v8/upstream/3.1.8/src/debug.cc +0 -3085
  665. data/ext/v8/upstream/3.1.8/src/debug.h +0 -1025
  666. data/ext/v8/upstream/3.1.8/src/deoptimizer.cc +0 -1185
  667. data/ext/v8/upstream/3.1.8/src/deoptimizer.h +0 -529
  668. data/ext/v8/upstream/3.1.8/src/disasm.h +0 -77
  669. data/ext/v8/upstream/3.1.8/src/disassembler.cc +0 -338
  670. data/ext/v8/upstream/3.1.8/src/execution.cc +0 -735
  671. data/ext/v8/upstream/3.1.8/src/execution.h +0 -322
  672. data/ext/v8/upstream/3.1.8/src/extensions/experimental/experimental.gyp +0 -53
  673. data/ext/v8/upstream/3.1.8/src/extensions/experimental/i18n-extension.cc +0 -264
  674. data/ext/v8/upstream/3.1.8/src/extensions/externalize-string-extension.cc +0 -141
  675. data/ext/v8/upstream/3.1.8/src/extensions/gc-extension.cc +0 -58
  676. data/ext/v8/upstream/3.1.8/src/factory.cc +0 -1087
  677. data/ext/v8/upstream/3.1.8/src/factory.h +0 -432
  678. data/ext/v8/upstream/3.1.8/src/flag-definitions.h +0 -552
  679. data/ext/v8/upstream/3.1.8/src/frame-element.cc +0 -42
  680. data/ext/v8/upstream/3.1.8/src/frame-element.h +0 -277
  681. data/ext/v8/upstream/3.1.8/src/frames-inl.h +0 -210
  682. data/ext/v8/upstream/3.1.8/src/frames.cc +0 -1232
  683. data/ext/v8/upstream/3.1.8/src/frames.h +0 -826
  684. data/ext/v8/upstream/3.1.8/src/full-codegen.cc +0 -1382
  685. data/ext/v8/upstream/3.1.8/src/full-codegen.h +0 -751
  686. data/ext/v8/upstream/3.1.8/src/func-name-inferrer.cc +0 -90
  687. data/ext/v8/upstream/3.1.8/src/func-name-inferrer.h +0 -111
  688. data/ext/v8/upstream/3.1.8/src/gdb-jit.cc +0 -1547
  689. data/ext/v8/upstream/3.1.8/src/global-handles.cc +0 -534
  690. data/ext/v8/upstream/3.1.8/src/global-handles.h +0 -181
  691. data/ext/v8/upstream/3.1.8/src/globals.h +0 -325
  692. data/ext/v8/upstream/3.1.8/src/handles-inl.h +0 -80
  693. data/ext/v8/upstream/3.1.8/src/handles.cc +0 -910
  694. data/ext/v8/upstream/3.1.8/src/handles.h +0 -424
  695. data/ext/v8/upstream/3.1.8/src/hashmap.h +0 -121
  696. data/ext/v8/upstream/3.1.8/src/heap-inl.h +0 -587
  697. data/ext/v8/upstream/3.1.8/src/heap-profiler.cc +0 -1128
  698. data/ext/v8/upstream/3.1.8/src/heap-profiler.h +0 -381
  699. data/ext/v8/upstream/3.1.8/src/heap.cc +0 -5610
  700. data/ext/v8/upstream/3.1.8/src/heap.h +0 -2218
  701. data/ext/v8/upstream/3.1.8/src/hydrogen-instructions.cc +0 -1490
  702. data/ext/v8/upstream/3.1.8/src/hydrogen-instructions.h +0 -3493
  703. data/ext/v8/upstream/3.1.8/src/hydrogen.cc +0 -6056
  704. data/ext/v8/upstream/3.1.8/src/hydrogen.h +0 -1091
  705. data/ext/v8/upstream/3.1.8/src/ia32/assembler-ia32-inl.h +0 -429
  706. data/ext/v8/upstream/3.1.8/src/ia32/assembler-ia32.cc +0 -2800
  707. data/ext/v8/upstream/3.1.8/src/ia32/assembler-ia32.h +0 -1093
  708. data/ext/v8/upstream/3.1.8/src/ia32/builtins-ia32.cc +0 -1590
  709. data/ext/v8/upstream/3.1.8/src/ia32/code-stubs-ia32.cc +0 -6624
  710. data/ext/v8/upstream/3.1.8/src/ia32/code-stubs-ia32.h +0 -536
  711. data/ext/v8/upstream/3.1.8/src/ia32/codegen-ia32.cc +0 -10354
  712. data/ext/v8/upstream/3.1.8/src/ia32/codegen-ia32.h +0 -798
  713. data/ext/v8/upstream/3.1.8/src/ia32/cpu-ia32.cc +0 -87
  714. data/ext/v8/upstream/3.1.8/src/ia32/debug-ia32.cc +0 -309
  715. data/ext/v8/upstream/3.1.8/src/ia32/deoptimizer-ia32.cc +0 -664
  716. data/ext/v8/upstream/3.1.8/src/ia32/disasm-ia32.cc +0 -1597
  717. data/ext/v8/upstream/3.1.8/src/ia32/frames-ia32.h +0 -140
  718. data/ext/v8/upstream/3.1.8/src/ia32/full-codegen-ia32.cc +0 -4278
  719. data/ext/v8/upstream/3.1.8/src/ia32/ic-ia32.cc +0 -1786
  720. data/ext/v8/upstream/3.1.8/src/ia32/lithium-codegen-ia32.cc +0 -3880
  721. data/ext/v8/upstream/3.1.8/src/ia32/lithium-codegen-ia32.h +0 -309
  722. data/ext/v8/upstream/3.1.8/src/ia32/lithium-gap-resolver-ia32.cc +0 -460
  723. data/ext/v8/upstream/3.1.8/src/ia32/lithium-ia32.cc +0 -2095
  724. data/ext/v8/upstream/3.1.8/src/ia32/lithium-ia32.h +0 -2127
  725. data/ext/v8/upstream/3.1.8/src/ia32/macro-assembler-ia32.cc +0 -2031
  726. data/ext/v8/upstream/3.1.8/src/ia32/macro-assembler-ia32.h +0 -798
  727. data/ext/v8/upstream/3.1.8/src/ia32/regexp-macro-assembler-ia32.cc +0 -1253
  728. data/ext/v8/upstream/3.1.8/src/ia32/regexp-macro-assembler-ia32.h +0 -215
  729. data/ext/v8/upstream/3.1.8/src/ia32/register-allocator-ia32.cc +0 -157
  730. data/ext/v8/upstream/3.1.8/src/ia32/simulator-ia32.h +0 -72
  731. data/ext/v8/upstream/3.1.8/src/ia32/stub-cache-ia32.cc +0 -3732
  732. data/ext/v8/upstream/3.1.8/src/ia32/virtual-frame-ia32.cc +0 -1360
  733. data/ext/v8/upstream/3.1.8/src/ia32/virtual-frame-ia32.h +0 -646
  734. data/ext/v8/upstream/3.1.8/src/ic-inl.h +0 -129
  735. data/ext/v8/upstream/3.1.8/src/ic.cc +0 -2333
  736. data/ext/v8/upstream/3.1.8/src/ic.h +0 -639
  737. data/ext/v8/upstream/3.1.8/src/interpreter-irregexp.cc +0 -655
  738. data/ext/v8/upstream/3.1.8/src/interpreter-irregexp.h +0 -48
  739. data/ext/v8/upstream/3.1.8/src/json.js +0 -342
  740. data/ext/v8/upstream/3.1.8/src/jsregexp.cc +0 -5340
  741. data/ext/v8/upstream/3.1.8/src/jsregexp.h +0 -1484
  742. data/ext/v8/upstream/3.1.8/src/jump-target-heavy.cc +0 -430
  743. data/ext/v8/upstream/3.1.8/src/jump-target-heavy.h +0 -244
  744. data/ext/v8/upstream/3.1.8/src/jump-target-inl.h +0 -48
  745. data/ext/v8/upstream/3.1.8/src/jump-target-light.cc +0 -111
  746. data/ext/v8/upstream/3.1.8/src/lithium-allocator-inl.h +0 -140
  747. data/ext/v8/upstream/3.1.8/src/lithium-allocator.cc +0 -2093
  748. data/ext/v8/upstream/3.1.8/src/lithium-allocator.h +0 -644
  749. data/ext/v8/upstream/3.1.8/src/lithium.cc +0 -168
  750. data/ext/v8/upstream/3.1.8/src/liveedit.cc +0 -1650
  751. data/ext/v8/upstream/3.1.8/src/liveedit.h +0 -174
  752. data/ext/v8/upstream/3.1.8/src/liveobjectlist.cc +0 -2527
  753. data/ext/v8/upstream/3.1.8/src/liveobjectlist.h +0 -322
  754. data/ext/v8/upstream/3.1.8/src/log-utils.cc +0 -336
  755. data/ext/v8/upstream/3.1.8/src/log-utils.h +0 -232
  756. data/ext/v8/upstream/3.1.8/src/log.cc +0 -1608
  757. data/ext/v8/upstream/3.1.8/src/log.h +0 -379
  758. data/ext/v8/upstream/3.1.8/src/mark-compact.cc +0 -2957
  759. data/ext/v8/upstream/3.1.8/src/mark-compact.h +0 -433
  760. data/ext/v8/upstream/3.1.8/src/messages.cc +0 -164
  761. data/ext/v8/upstream/3.1.8/src/messages.js +0 -1071
  762. data/ext/v8/upstream/3.1.8/src/mips/assembler-mips-inl.h +0 -215
  763. data/ext/v8/upstream/3.1.8/src/mips/assembler-mips.cc +0 -1219
  764. data/ext/v8/upstream/3.1.8/src/mips/assembler-mips.h +0 -667
  765. data/ext/v8/upstream/3.1.8/src/mips/builtins-mips.cc +0 -205
  766. data/ext/v8/upstream/3.1.8/src/mips/codegen-mips-inl.h +0 -70
  767. data/ext/v8/upstream/3.1.8/src/mips/codegen-mips.cc +0 -1437
  768. data/ext/v8/upstream/3.1.8/src/mips/codegen-mips.h +0 -431
  769. data/ext/v8/upstream/3.1.8/src/mips/constants-mips.cc +0 -328
  770. data/ext/v8/upstream/3.1.8/src/mips/constants-mips.h +0 -525
  771. data/ext/v8/upstream/3.1.8/src/mips/cpu-mips.cc +0 -73
  772. data/ext/v8/upstream/3.1.8/src/mips/debug-mips.cc +0 -127
  773. data/ext/v8/upstream/3.1.8/src/mips/disasm-mips.cc +0 -787
  774. data/ext/v8/upstream/3.1.8/src/mips/fast-codegen-mips.cc +0 -77
  775. data/ext/v8/upstream/3.1.8/src/mips/frames-mips.cc +0 -96
  776. data/ext/v8/upstream/3.1.8/src/mips/frames-mips.h +0 -164
  777. data/ext/v8/upstream/3.1.8/src/mips/full-codegen-mips.cc +0 -277
  778. data/ext/v8/upstream/3.1.8/src/mips/ic-mips.cc +0 -208
  779. data/ext/v8/upstream/3.1.8/src/mips/jump-target-mips.cc +0 -175
  780. data/ext/v8/upstream/3.1.8/src/mips/macro-assembler-mips.cc +0 -1326
  781. data/ext/v8/upstream/3.1.8/src/mips/macro-assembler-mips.h +0 -461
  782. data/ext/v8/upstream/3.1.8/src/mips/register-allocator-mips-inl.h +0 -137
  783. data/ext/v8/upstream/3.1.8/src/mips/register-allocator-mips.h +0 -46
  784. data/ext/v8/upstream/3.1.8/src/mips/simulator-mips.cc +0 -1650
  785. data/ext/v8/upstream/3.1.8/src/mips/simulator-mips.h +0 -311
  786. data/ext/v8/upstream/3.1.8/src/mips/stub-cache-mips.cc +0 -418
  787. data/ext/v8/upstream/3.1.8/src/mips/virtual-frame-mips.cc +0 -319
  788. data/ext/v8/upstream/3.1.8/src/mips/virtual-frame-mips.h +0 -548
  789. data/ext/v8/upstream/3.1.8/src/mirror-debugger.js +0 -2380
  790. data/ext/v8/upstream/3.1.8/src/mksnapshot.cc +0 -256
  791. data/ext/v8/upstream/3.1.8/src/objects-debug.cc +0 -722
  792. data/ext/v8/upstream/3.1.8/src/objects-inl.h +0 -3946
  793. data/ext/v8/upstream/3.1.8/src/objects-printer.cc +0 -801
  794. data/ext/v8/upstream/3.1.8/src/objects-visiting.cc +0 -142
  795. data/ext/v8/upstream/3.1.8/src/objects-visiting.h +0 -401
  796. data/ext/v8/upstream/3.1.8/src/objects.cc +0 -10044
  797. data/ext/v8/upstream/3.1.8/src/objects.h +0 -6571
  798. data/ext/v8/upstream/3.1.8/src/parser.cc +0 -5165
  799. data/ext/v8/upstream/3.1.8/src/parser.h +0 -802
  800. data/ext/v8/upstream/3.1.8/src/platform-cygwin.cc +0 -745
  801. data/ext/v8/upstream/3.1.8/src/platform-freebsd.cc +0 -702
  802. data/ext/v8/upstream/3.1.8/src/platform-linux.cc +0 -981
  803. data/ext/v8/upstream/3.1.8/src/platform-macos.cc +0 -732
  804. data/ext/v8/upstream/3.1.8/src/platform-nullos.cc +0 -498
  805. data/ext/v8/upstream/3.1.8/src/platform-openbsd.cc +0 -657
  806. data/ext/v8/upstream/3.1.8/src/platform-posix.cc +0 -399
  807. data/ext/v8/upstream/3.1.8/src/platform-solaris.cc +0 -714
  808. data/ext/v8/upstream/3.1.8/src/platform-win32.cc +0 -1974
  809. data/ext/v8/upstream/3.1.8/src/platform.h +0 -636
  810. data/ext/v8/upstream/3.1.8/src/preparse-data.cc +0 -183
  811. data/ext/v8/upstream/3.1.8/src/preparser-api.cc +0 -213
  812. data/ext/v8/upstream/3.1.8/src/preparser.cc +0 -1205
  813. data/ext/v8/upstream/3.1.8/src/prettyprinter.cc +0 -1539
  814. data/ext/v8/upstream/3.1.8/src/prettyprinter.h +0 -223
  815. data/ext/v8/upstream/3.1.8/src/profile-generator.cc +0 -2899
  816. data/ext/v8/upstream/3.1.8/src/profile-generator.h +0 -1151
  817. data/ext/v8/upstream/3.1.8/src/property.cc +0 -96
  818. data/ext/v8/upstream/3.1.8/src/property.h +0 -337
  819. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler-irregexp.cc +0 -470
  820. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler.cc +0 -257
  821. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler.h +0 -231
  822. data/ext/v8/upstream/3.1.8/src/regexp-stack.cc +0 -103
  823. data/ext/v8/upstream/3.1.8/src/regexp-stack.h +0 -123
  824. data/ext/v8/upstream/3.1.8/src/regexp.js +0 -483
  825. data/ext/v8/upstream/3.1.8/src/register-allocator-inl.h +0 -141
  826. data/ext/v8/upstream/3.1.8/src/register-allocator.cc +0 -104
  827. data/ext/v8/upstream/3.1.8/src/register-allocator.h +0 -320
  828. data/ext/v8/upstream/3.1.8/src/rewriter.cc +0 -1023
  829. data/ext/v8/upstream/3.1.8/src/runtime-profiler.cc +0 -443
  830. data/ext/v8/upstream/3.1.8/src/runtime-profiler.h +0 -77
  831. data/ext/v8/upstream/3.1.8/src/runtime.cc +0 -11592
  832. data/ext/v8/upstream/3.1.8/src/runtime.h +0 -582
  833. data/ext/v8/upstream/3.1.8/src/safepoint-table.cc +0 -253
  834. data/ext/v8/upstream/3.1.8/src/safepoint-table.h +0 -263
  835. data/ext/v8/upstream/3.1.8/src/scanner-base.cc +0 -971
  836. data/ext/v8/upstream/3.1.8/src/scanner-base.h +0 -653
  837. data/ext/v8/upstream/3.1.8/src/scanner.cc +0 -586
  838. data/ext/v8/upstream/3.1.8/src/scanner.h +0 -194
  839. data/ext/v8/upstream/3.1.8/src/scopeinfo.cc +0 -636
  840. data/ext/v8/upstream/3.1.8/src/scopeinfo.h +0 -238
  841. data/ext/v8/upstream/3.1.8/src/scopes.cc +0 -1063
  842. data/ext/v8/upstream/3.1.8/src/scopes.h +0 -494
  843. data/ext/v8/upstream/3.1.8/src/serialize.cc +0 -1535
  844. data/ext/v8/upstream/3.1.8/src/serialize.h +0 -584
  845. data/ext/v8/upstream/3.1.8/src/snapshot-common.cc +0 -82
  846. data/ext/v8/upstream/3.1.8/src/snapshot.h +0 -71
  847. data/ext/v8/upstream/3.1.8/src/spaces-inl.h +0 -524
  848. data/ext/v8/upstream/3.1.8/src/spaces.cc +0 -3254
  849. data/ext/v8/upstream/3.1.8/src/spaces.h +0 -2362
  850. data/ext/v8/upstream/3.1.8/src/string-search.cc +0 -40
  851. data/ext/v8/upstream/3.1.8/src/string-search.h +0 -567
  852. data/ext/v8/upstream/3.1.8/src/string-stream.cc +0 -584
  853. data/ext/v8/upstream/3.1.8/src/string.js +0 -915
  854. data/ext/v8/upstream/3.1.8/src/stub-cache.cc +0 -1878
  855. data/ext/v8/upstream/3.1.8/src/stub-cache.h +0 -849
  856. data/ext/v8/upstream/3.1.8/src/token.cc +0 -63
  857. data/ext/v8/upstream/3.1.8/src/token.h +0 -288
  858. data/ext/v8/upstream/3.1.8/src/top.cc +0 -1152
  859. data/ext/v8/upstream/3.1.8/src/top.h +0 -608
  860. data/ext/v8/upstream/3.1.8/src/type-info.cc +0 -406
  861. data/ext/v8/upstream/3.1.8/src/type-info.h +0 -283
  862. data/ext/v8/upstream/3.1.8/src/unicode.cc +0 -1624
  863. data/ext/v8/upstream/3.1.8/src/unicode.h +0 -280
  864. data/ext/v8/upstream/3.1.8/src/utils.h +0 -793
  865. data/ext/v8/upstream/3.1.8/src/v8-counters.cc +0 -55
  866. data/ext/v8/upstream/3.1.8/src/v8-counters.h +0 -290
  867. data/ext/v8/upstream/3.1.8/src/v8.cc +0 -270
  868. data/ext/v8/upstream/3.1.8/src/v8.h +0 -127
  869. data/ext/v8/upstream/3.1.8/src/v8globals.h +0 -480
  870. data/ext/v8/upstream/3.1.8/src/v8natives.js +0 -1252
  871. data/ext/v8/upstream/3.1.8/src/v8threads.cc +0 -440
  872. data/ext/v8/upstream/3.1.8/src/v8threads.h +0 -157
  873. data/ext/v8/upstream/3.1.8/src/v8utils.h +0 -354
  874. data/ext/v8/upstream/3.1.8/src/variables.h +0 -212
  875. data/ext/v8/upstream/3.1.8/src/version.cc +0 -95
  876. data/ext/v8/upstream/3.1.8/src/version.h +0 -64
  877. data/ext/v8/upstream/3.1.8/src/virtual-frame-light-inl.h +0 -170
  878. data/ext/v8/upstream/3.1.8/src/vm-state-inl.h +0 -134
  879. data/ext/v8/upstream/3.1.8/src/vm-state.h +0 -68
  880. data/ext/v8/upstream/3.1.8/src/win32-headers.h +0 -95
  881. data/ext/v8/upstream/3.1.8/src/x64/assembler-x64-inl.h +0 -455
  882. data/ext/v8/upstream/3.1.8/src/x64/assembler-x64.cc +0 -3162
  883. data/ext/v8/upstream/3.1.8/src/x64/assembler-x64.h +0 -1584
  884. data/ext/v8/upstream/3.1.8/src/x64/builtins-x64.cc +0 -1492
  885. data/ext/v8/upstream/3.1.8/src/x64/code-stubs-x64.cc +0 -5150
  886. data/ext/v8/upstream/3.1.8/src/x64/code-stubs-x64.h +0 -519
  887. data/ext/v8/upstream/3.1.8/src/x64/codegen-x64.cc +0 -8835
  888. data/ext/v8/upstream/3.1.8/src/x64/codegen-x64.h +0 -750
  889. data/ext/v8/upstream/3.1.8/src/x64/cpu-x64.cc +0 -86
  890. data/ext/v8/upstream/3.1.8/src/x64/debug-x64.cc +0 -316
  891. data/ext/v8/upstream/3.1.8/src/x64/deoptimizer-x64.cc +0 -781
  892. data/ext/v8/upstream/3.1.8/src/x64/disasm-x64.cc +0 -1737
  893. data/ext/v8/upstream/3.1.8/src/x64/frames-x64.h +0 -130
  894. data/ext/v8/upstream/3.1.8/src/x64/full-codegen-x64.cc +0 -3984
  895. data/ext/v8/upstream/3.1.8/src/x64/ic-x64.cc +0 -1761
  896. data/ext/v8/upstream/3.1.8/src/x64/lithium-codegen-x64.cc +0 -3639
  897. data/ext/v8/upstream/3.1.8/src/x64/lithium-codegen-x64.h +0 -305
  898. data/ext/v8/upstream/3.1.8/src/x64/lithium-x64.cc +0 -2044
  899. data/ext/v8/upstream/3.1.8/src/x64/lithium-x64.h +0 -2052
  900. data/ext/v8/upstream/3.1.8/src/x64/macro-assembler-x64.cc +0 -2660
  901. data/ext/v8/upstream/3.1.8/src/x64/macro-assembler-x64.h +0 -1852
  902. data/ext/v8/upstream/3.1.8/src/x64/regexp-macro-assembler-x64.cc +0 -1382
  903. data/ext/v8/upstream/3.1.8/src/x64/regexp-macro-assembler-x64.h +0 -278
  904. data/ext/v8/upstream/3.1.8/src/x64/register-allocator-x64-inl.h +0 -87
  905. data/ext/v8/upstream/3.1.8/src/x64/register-allocator-x64.cc +0 -91
  906. data/ext/v8/upstream/3.1.8/src/x64/simulator-x64.h +0 -71
  907. data/ext/v8/upstream/3.1.8/src/x64/stub-cache-x64.cc +0 -3509
  908. data/ext/v8/upstream/3.1.8/src/x64/virtual-frame-x64.cc +0 -1292
  909. data/ext/v8/upstream/3.1.8/src/x64/virtual-frame-x64.h +0 -593
  910. data/ext/v8/upstream/3.1.8/src/zone-inl.h +0 -83
  911. data/ext/v8/upstream/3.1.8/src/zone.cc +0 -195
  912. data/ext/v8/upstream/3.1.8/src/zone.h +0 -233
  913. data/ext/v8/upstream/3.1.8/tools/gyp/v8.gyp +0 -869
  914. data/ext/v8/upstream/3.1.8/tools/linux-tick-processor +0 -33
  915. data/ext/v8/upstream/3.1.8/tools/tickprocessor.js +0 -863
  916. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_base.vcproj +0 -1296
  917. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_base_arm.vcproj +0 -1234
  918. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_base_x64.vcproj +0 -1296
  919. data/ext/v8/upstream/3.1.8/tools/visual_studio/x64.vsprops +0 -17
  920. data/spec/ext/mem_spec.rb +0 -42
@@ -0,0 +1,169 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #include "v8.h"
29
+ #include "lithium.h"
30
+
31
+ namespace v8 {
32
+ namespace internal {
33
+
34
+
35
+ void LOperand::PrintTo(StringStream* stream) {
36
+ LUnallocated* unalloc = NULL;
37
+ switch (kind()) {
38
+ case INVALID:
39
+ break;
40
+ case UNALLOCATED:
41
+ unalloc = LUnallocated::cast(this);
42
+ stream->Add("v%d", unalloc->virtual_register());
43
+ switch (unalloc->policy()) {
44
+ case LUnallocated::NONE:
45
+ break;
46
+ case LUnallocated::FIXED_REGISTER: {
47
+ const char* register_name =
48
+ Register::AllocationIndexToString(unalloc->fixed_index());
49
+ stream->Add("(=%s)", register_name);
50
+ break;
51
+ }
52
+ case LUnallocated::FIXED_DOUBLE_REGISTER: {
53
+ const char* double_register_name =
54
+ DoubleRegister::AllocationIndexToString(unalloc->fixed_index());
55
+ stream->Add("(=%s)", double_register_name);
56
+ break;
57
+ }
58
+ case LUnallocated::FIXED_SLOT:
59
+ stream->Add("(=%dS)", unalloc->fixed_index());
60
+ break;
61
+ case LUnallocated::MUST_HAVE_REGISTER:
62
+ stream->Add("(R)");
63
+ break;
64
+ case LUnallocated::WRITABLE_REGISTER:
65
+ stream->Add("(WR)");
66
+ break;
67
+ case LUnallocated::SAME_AS_FIRST_INPUT:
68
+ stream->Add("(1)");
69
+ break;
70
+ case LUnallocated::ANY:
71
+ stream->Add("(-)");
72
+ break;
73
+ case LUnallocated::IGNORE:
74
+ stream->Add("(0)");
75
+ break;
76
+ }
77
+ break;
78
+ case CONSTANT_OPERAND:
79
+ stream->Add("[constant:%d]", index());
80
+ break;
81
+ case STACK_SLOT:
82
+ stream->Add("[stack:%d]", index());
83
+ break;
84
+ case DOUBLE_STACK_SLOT:
85
+ stream->Add("[double_stack:%d]", index());
86
+ break;
87
+ case REGISTER:
88
+ stream->Add("[%s|R]", Register::AllocationIndexToString(index()));
89
+ break;
90
+ case DOUBLE_REGISTER:
91
+ stream->Add("[%s|R]", DoubleRegister::AllocationIndexToString(index()));
92
+ break;
93
+ case ARGUMENT:
94
+ stream->Add("[arg:%d]", index());
95
+ break;
96
+ }
97
+ }
98
+
99
+
100
+ int LOperand::VirtualRegister() {
101
+ LUnallocated* unalloc = LUnallocated::cast(this);
102
+ return unalloc->virtual_register();
103
+ }
104
+
105
+
106
+ bool LParallelMove::IsRedundant() const {
107
+ for (int i = 0; i < move_operands_.length(); ++i) {
108
+ if (!move_operands_[i].IsRedundant()) return false;
109
+ }
110
+ return true;
111
+ }
112
+
113
+
114
+ void LParallelMove::PrintDataTo(StringStream* stream) const {
115
+ bool first = true;
116
+ for (int i = 0; i < move_operands_.length(); ++i) {
117
+ if (!move_operands_[i].IsEliminated()) {
118
+ LOperand* source = move_operands_[i].source();
119
+ LOperand* destination = move_operands_[i].destination();
120
+ if (!first) stream->Add(" ");
121
+ first = false;
122
+ if (source->Equals(destination)) {
123
+ destination->PrintTo(stream);
124
+ } else {
125
+ destination->PrintTo(stream);
126
+ stream->Add(" = ");
127
+ source->PrintTo(stream);
128
+ }
129
+ stream->Add(";");
130
+ }
131
+ }
132
+ }
133
+
134
+
135
+ void LEnvironment::PrintTo(StringStream* stream) {
136
+ stream->Add("[id=%d|", ast_id());
137
+ stream->Add("[parameters=%d|", parameter_count());
138
+ stream->Add("[arguments_stack_height=%d|", arguments_stack_height());
139
+ for (int i = 0; i < values_.length(); ++i) {
140
+ if (i != 0) stream->Add(";");
141
+ if (values_[i] == NULL) {
142
+ stream->Add("[hole]");
143
+ } else {
144
+ values_[i]->PrintTo(stream);
145
+ }
146
+ }
147
+ stream->Add("]");
148
+ }
149
+
150
+
151
+ void LPointerMap::RecordPointer(LOperand* op) {
152
+ // Do not record arguments as pointers.
153
+ if (op->IsStackSlot() && op->index() < 0) return;
154
+ ASSERT(!op->IsDoubleRegister() && !op->IsDoubleStackSlot());
155
+ pointer_operands_.Add(op);
156
+ }
157
+
158
+
159
+ void LPointerMap::PrintTo(StringStream* stream) {
160
+ stream->Add("{");
161
+ for (int i = 0; i < pointer_operands_.length(); ++i) {
162
+ if (i != 0) stream->Add(";");
163
+ pointer_operands_[i]->PrintTo(stream);
164
+ }
165
+ stream->Add("} @%d", position());
166
+ }
167
+
168
+
169
+ } } // namespace v8::internal
File without changes
@@ -0,0 +1,1693 @@
1
+ // Copyright 2010 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+
29
+ #include "v8.h"
30
+
31
+ #include "liveedit.h"
32
+
33
+ #include "compiler.h"
34
+ #include "compilation-cache.h"
35
+ #include "debug.h"
36
+ #include "deoptimizer.h"
37
+ #include "global-handles.h"
38
+ #include "parser.h"
39
+ #include "scopeinfo.h"
40
+ #include "scopes.h"
41
+ #include "v8memory.h"
42
+
43
+ namespace v8 {
44
+ namespace internal {
45
+
46
+
47
+ #ifdef ENABLE_DEBUGGER_SUPPORT
48
+
49
+
50
+ void SetElementNonStrict(Handle<JSObject> object,
51
+ uint32_t index,
52
+ Handle<Object> value) {
53
+ // Ignore return value from SetElement. It can only be a failure if there
54
+ // are element setters causing exceptions and the debugger context has none
55
+ // of these.
56
+ Handle<Object> no_failure;
57
+ no_failure = SetElement(object, index, value, kNonStrictMode);
58
+ ASSERT(!no_failure.is_null());
59
+ USE(no_failure);
60
+ }
61
+
62
+ // A simple implementation of dynamic programming algorithm. It solves
63
+ // the problem of finding the difference of 2 arrays. It uses a table of results
64
+ // of subproblems. Each cell contains a number together with 2-bit flag
65
+ // that helps building the chunk list.
66
+ class Differencer {
67
+ public:
68
+ explicit Differencer(Comparator::Input* input)
69
+ : input_(input), len1_(input->getLength1()), len2_(input->getLength2()) {
70
+ buffer_ = NewArray<int>(len1_ * len2_);
71
+ }
72
+ ~Differencer() {
73
+ DeleteArray(buffer_);
74
+ }
75
+
76
+ void Initialize() {
77
+ int array_size = len1_ * len2_;
78
+ for (int i = 0; i < array_size; i++) {
79
+ buffer_[i] = kEmptyCellValue;
80
+ }
81
+ }
82
+
83
+ // Makes sure that result for the full problem is calculated and stored
84
+ // in the table together with flags showing a path through subproblems.
85
+ void FillTable() {
86
+ CompareUpToTail(0, 0);
87
+ }
88
+
89
+ void SaveResult(Comparator::Output* chunk_writer) {
90
+ ResultWriter writer(chunk_writer);
91
+
92
+ int pos1 = 0;
93
+ int pos2 = 0;
94
+ while (true) {
95
+ if (pos1 < len1_) {
96
+ if (pos2 < len2_) {
97
+ Direction dir = get_direction(pos1, pos2);
98
+ switch (dir) {
99
+ case EQ:
100
+ writer.eq();
101
+ pos1++;
102
+ pos2++;
103
+ break;
104
+ case SKIP1:
105
+ writer.skip1(1);
106
+ pos1++;
107
+ break;
108
+ case SKIP2:
109
+ case SKIP_ANY:
110
+ writer.skip2(1);
111
+ pos2++;
112
+ break;
113
+ default:
114
+ UNREACHABLE();
115
+ }
116
+ } else {
117
+ writer.skip1(len1_ - pos1);
118
+ break;
119
+ }
120
+ } else {
121
+ if (len2_ != pos2) {
122
+ writer.skip2(len2_ - pos2);
123
+ }
124
+ break;
125
+ }
126
+ }
127
+ writer.close();
128
+ }
129
+
130
+ private:
131
+ Comparator::Input* input_;
132
+ int* buffer_;
133
+ int len1_;
134
+ int len2_;
135
+
136
+ enum Direction {
137
+ EQ = 0,
138
+ SKIP1,
139
+ SKIP2,
140
+ SKIP_ANY,
141
+
142
+ MAX_DIRECTION_FLAG_VALUE = SKIP_ANY
143
+ };
144
+
145
+ // Computes result for a subtask and optionally caches it in the buffer table.
146
+ // All results values are shifted to make space for flags in the lower bits.
147
+ int CompareUpToTail(int pos1, int pos2) {
148
+ if (pos1 < len1_) {
149
+ if (pos2 < len2_) {
150
+ int cached_res = get_value4(pos1, pos2);
151
+ if (cached_res == kEmptyCellValue) {
152
+ Direction dir;
153
+ int res;
154
+ if (input_->equals(pos1, pos2)) {
155
+ res = CompareUpToTail(pos1 + 1, pos2 + 1);
156
+ dir = EQ;
157
+ } else {
158
+ int res1 = CompareUpToTail(pos1 + 1, pos2) +
159
+ (1 << kDirectionSizeBits);
160
+ int res2 = CompareUpToTail(pos1, pos2 + 1) +
161
+ (1 << kDirectionSizeBits);
162
+ if (res1 == res2) {
163
+ res = res1;
164
+ dir = SKIP_ANY;
165
+ } else if (res1 < res2) {
166
+ res = res1;
167
+ dir = SKIP1;
168
+ } else {
169
+ res = res2;
170
+ dir = SKIP2;
171
+ }
172
+ }
173
+ set_value4_and_dir(pos1, pos2, res, dir);
174
+ cached_res = res;
175
+ }
176
+ return cached_res;
177
+ } else {
178
+ return (len1_ - pos1) << kDirectionSizeBits;
179
+ }
180
+ } else {
181
+ return (len2_ - pos2) << kDirectionSizeBits;
182
+ }
183
+ }
184
+
185
+ inline int& get_cell(int i1, int i2) {
186
+ return buffer_[i1 + i2 * len1_];
187
+ }
188
+
189
+ // Each cell keeps a value plus direction. Value is multiplied by 4.
190
+ void set_value4_and_dir(int i1, int i2, int value4, Direction dir) {
191
+ ASSERT((value4 & kDirectionMask) == 0);
192
+ get_cell(i1, i2) = value4 | dir;
193
+ }
194
+
195
+ int get_value4(int i1, int i2) {
196
+ return get_cell(i1, i2) & (kMaxUInt32 ^ kDirectionMask);
197
+ }
198
+ Direction get_direction(int i1, int i2) {
199
+ return static_cast<Direction>(get_cell(i1, i2) & kDirectionMask);
200
+ }
201
+
202
+ static const int kDirectionSizeBits = 2;
203
+ static const int kDirectionMask = (1 << kDirectionSizeBits) - 1;
204
+ static const int kEmptyCellValue = -1 << kDirectionSizeBits;
205
+
206
+ // This method only holds static assert statement (unfortunately you cannot
207
+ // place one in class scope).
208
+ void StaticAssertHolder() {
209
+ STATIC_ASSERT(MAX_DIRECTION_FLAG_VALUE < (1 << kDirectionSizeBits));
210
+ }
211
+
212
+ class ResultWriter {
213
+ public:
214
+ explicit ResultWriter(Comparator::Output* chunk_writer)
215
+ : chunk_writer_(chunk_writer), pos1_(0), pos2_(0),
216
+ pos1_begin_(-1), pos2_begin_(-1), has_open_chunk_(false) {
217
+ }
218
+ void eq() {
219
+ FlushChunk();
220
+ pos1_++;
221
+ pos2_++;
222
+ }
223
+ void skip1(int len1) {
224
+ StartChunk();
225
+ pos1_ += len1;
226
+ }
227
+ void skip2(int len2) {
228
+ StartChunk();
229
+ pos2_ += len2;
230
+ }
231
+ void close() {
232
+ FlushChunk();
233
+ }
234
+
235
+ private:
236
+ Comparator::Output* chunk_writer_;
237
+ int pos1_;
238
+ int pos2_;
239
+ int pos1_begin_;
240
+ int pos2_begin_;
241
+ bool has_open_chunk_;
242
+
243
+ void StartChunk() {
244
+ if (!has_open_chunk_) {
245
+ pos1_begin_ = pos1_;
246
+ pos2_begin_ = pos2_;
247
+ has_open_chunk_ = true;
248
+ }
249
+ }
250
+
251
+ void FlushChunk() {
252
+ if (has_open_chunk_) {
253
+ chunk_writer_->AddChunk(pos1_begin_, pos2_begin_,
254
+ pos1_ - pos1_begin_, pos2_ - pos2_begin_);
255
+ has_open_chunk_ = false;
256
+ }
257
+ }
258
+ };
259
+ };
260
+
261
+
262
+ void Comparator::CalculateDifference(Comparator::Input* input,
263
+ Comparator::Output* result_writer) {
264
+ Differencer differencer(input);
265
+ differencer.Initialize();
266
+ differencer.FillTable();
267
+ differencer.SaveResult(result_writer);
268
+ }
269
+
270
+
271
+ static bool CompareSubstrings(Isolate* isolate, Handle<String> s1, int pos1,
272
+ Handle<String> s2, int pos2, int len) {
273
+ StringInputBuffer& buf1 = *isolate->liveedit_compare_substrings_buf1();
274
+ StringInputBuffer& buf2 = *isolate->liveedit_compare_substrings_buf2();
275
+ buf1.Reset(*s1);
276
+ buf1.Seek(pos1);
277
+ buf2.Reset(*s2);
278
+ buf2.Seek(pos2);
279
+ for (int i = 0; i < len; i++) {
280
+ ASSERT(buf1.has_more() && buf2.has_more());
281
+ if (buf1.GetNext() != buf2.GetNext()) {
282
+ return false;
283
+ }
284
+ }
285
+ return true;
286
+ }
287
+
288
+
289
+ // A helper class that writes chunk numbers into JSArray.
290
+ // Each chunk is stored as 3 array elements: (pos1_begin, pos1_end, pos2_end).
291
+ class CompareOutputArrayWriter {
292
+ public:
293
+ CompareOutputArrayWriter()
294
+ : array_(FACTORY->NewJSArray(10)), current_size_(0) {}
295
+
296
+ Handle<JSArray> GetResult() {
297
+ return array_;
298
+ }
299
+
300
+ void WriteChunk(int char_pos1, int char_pos2, int char_len1, int char_len2) {
301
+ SetElementNonStrict(array_,
302
+ current_size_,
303
+ Handle<Object>(Smi::FromInt(char_pos1)));
304
+ SetElementNonStrict(array_,
305
+ current_size_ + 1,
306
+ Handle<Object>(Smi::FromInt(char_pos1 + char_len1)));
307
+ SetElementNonStrict(array_,
308
+ current_size_ + 2,
309
+ Handle<Object>(Smi::FromInt(char_pos2 + char_len2)));
310
+ current_size_ += 3;
311
+ }
312
+
313
+ private:
314
+ Handle<JSArray> array_;
315
+ int current_size_;
316
+ };
317
+
318
+
319
+ // Represents 2 strings as 2 arrays of tokens.
320
+ // TODO(LiveEdit): Currently it's actually an array of charactres.
321
+ // Make array of tokens instead.
322
+ class TokensCompareInput : public Comparator::Input {
323
+ public:
324
+ TokensCompareInput(Handle<String> s1, int offset1, int len1,
325
+ Handle<String> s2, int offset2, int len2)
326
+ : s1_(s1), offset1_(offset1), len1_(len1),
327
+ s2_(s2), offset2_(offset2), len2_(len2) {
328
+ }
329
+ virtual int getLength1() {
330
+ return len1_;
331
+ }
332
+ virtual int getLength2() {
333
+ return len2_;
334
+ }
335
+ bool equals(int index1, int index2) {
336
+ return s1_->Get(offset1_ + index1) == s2_->Get(offset2_ + index2);
337
+ }
338
+
339
+ private:
340
+ Handle<String> s1_;
341
+ int offset1_;
342
+ int len1_;
343
+ Handle<String> s2_;
344
+ int offset2_;
345
+ int len2_;
346
+ };
347
+
348
+
349
+ // Stores compare result in JSArray. Converts substring positions
350
+ // to absolute positions.
351
+ class TokensCompareOutput : public Comparator::Output {
352
+ public:
353
+ TokensCompareOutput(CompareOutputArrayWriter* array_writer,
354
+ int offset1, int offset2)
355
+ : array_writer_(array_writer), offset1_(offset1), offset2_(offset2) {
356
+ }
357
+
358
+ void AddChunk(int pos1, int pos2, int len1, int len2) {
359
+ array_writer_->WriteChunk(pos1 + offset1_, pos2 + offset2_, len1, len2);
360
+ }
361
+
362
+ private:
363
+ CompareOutputArrayWriter* array_writer_;
364
+ int offset1_;
365
+ int offset2_;
366
+ };
367
+
368
+
369
+ // Wraps raw n-elements line_ends array as a list of n+1 lines. The last line
370
+ // never has terminating new line character.
371
+ class LineEndsWrapper {
372
+ public:
373
+ explicit LineEndsWrapper(Handle<String> string)
374
+ : ends_array_(CalculateLineEnds(string, false)),
375
+ string_len_(string->length()) {
376
+ }
377
+ int length() {
378
+ return ends_array_->length() + 1;
379
+ }
380
+ // Returns start for any line including start of the imaginary line after
381
+ // the last line.
382
+ int GetLineStart(int index) {
383
+ if (index == 0) {
384
+ return 0;
385
+ } else {
386
+ return GetLineEnd(index - 1);
387
+ }
388
+ }
389
+ int GetLineEnd(int index) {
390
+ if (index == ends_array_->length()) {
391
+ // End of the last line is always an end of the whole string.
392
+ // If the string ends with a new line character, the last line is an
393
+ // empty string after this character.
394
+ return string_len_;
395
+ } else {
396
+ return GetPosAfterNewLine(index);
397
+ }
398
+ }
399
+
400
+ private:
401
+ Handle<FixedArray> ends_array_;
402
+ int string_len_;
403
+
404
+ int GetPosAfterNewLine(int index) {
405
+ return Smi::cast(ends_array_->get(index))->value() + 1;
406
+ }
407
+ };
408
+
409
+
410
+ // Represents 2 strings as 2 arrays of lines.
411
+ class LineArrayCompareInput : public Comparator::Input {
412
+ public:
413
+ LineArrayCompareInput(Isolate* isolate, Handle<String> s1, Handle<String> s2,
414
+ LineEndsWrapper line_ends1, LineEndsWrapper line_ends2)
415
+ : isolate_(isolate), s1_(s1), s2_(s2), line_ends1_(line_ends1),
416
+ line_ends2_(line_ends2) {
417
+ }
418
+ int getLength1() {
419
+ return line_ends1_.length();
420
+ }
421
+ int getLength2() {
422
+ return line_ends2_.length();
423
+ }
424
+ bool equals(int index1, int index2) {
425
+ int line_start1 = line_ends1_.GetLineStart(index1);
426
+ int line_start2 = line_ends2_.GetLineStart(index2);
427
+ int line_end1 = line_ends1_.GetLineEnd(index1);
428
+ int line_end2 = line_ends2_.GetLineEnd(index2);
429
+ int len1 = line_end1 - line_start1;
430
+ int len2 = line_end2 - line_start2;
431
+ if (len1 != len2) {
432
+ return false;
433
+ }
434
+ return CompareSubstrings(isolate_, s1_, line_start1, s2_, line_start2,
435
+ len1);
436
+ }
437
+
438
+ private:
439
+ Isolate* isolate_;
440
+ Handle<String> s1_;
441
+ Handle<String> s2_;
442
+ LineEndsWrapper line_ends1_;
443
+ LineEndsWrapper line_ends2_;
444
+ };
445
+
446
+
447
+ // Stores compare result in JSArray. For each chunk tries to conduct
448
+ // a fine-grained nested diff token-wise.
449
+ class TokenizingLineArrayCompareOutput : public Comparator::Output {
450
+ public:
451
+ TokenizingLineArrayCompareOutput(LineEndsWrapper line_ends1,
452
+ LineEndsWrapper line_ends2,
453
+ Handle<String> s1, Handle<String> s2)
454
+ : line_ends1_(line_ends1), line_ends2_(line_ends2), s1_(s1), s2_(s2) {
455
+ }
456
+
457
+ void AddChunk(int line_pos1, int line_pos2, int line_len1, int line_len2) {
458
+ int char_pos1 = line_ends1_.GetLineStart(line_pos1);
459
+ int char_pos2 = line_ends2_.GetLineStart(line_pos2);
460
+ int char_len1 = line_ends1_.GetLineStart(line_pos1 + line_len1) - char_pos1;
461
+ int char_len2 = line_ends2_.GetLineStart(line_pos2 + line_len2) - char_pos2;
462
+
463
+ if (char_len1 < CHUNK_LEN_LIMIT && char_len2 < CHUNK_LEN_LIMIT) {
464
+ // Chunk is small enough to conduct a nested token-level diff.
465
+ HandleScope subTaskScope;
466
+
467
+ TokensCompareInput tokens_input(s1_, char_pos1, char_len1,
468
+ s2_, char_pos2, char_len2);
469
+ TokensCompareOutput tokens_output(&array_writer_, char_pos1,
470
+ char_pos2);
471
+
472
+ Comparator::CalculateDifference(&tokens_input, &tokens_output);
473
+ } else {
474
+ array_writer_.WriteChunk(char_pos1, char_pos2, char_len1, char_len2);
475
+ }
476
+ }
477
+
478
+ Handle<JSArray> GetResult() {
479
+ return array_writer_.GetResult();
480
+ }
481
+
482
+ private:
483
+ static const int CHUNK_LEN_LIMIT = 800;
484
+
485
+ CompareOutputArrayWriter array_writer_;
486
+ LineEndsWrapper line_ends1_;
487
+ LineEndsWrapper line_ends2_;
488
+ Handle<String> s1_;
489
+ Handle<String> s2_;
490
+ };
491
+
492
+
493
+ Handle<JSArray> LiveEdit::CompareStrings(Handle<String> s1,
494
+ Handle<String> s2) {
495
+ LineEndsWrapper line_ends1(s1);
496
+ LineEndsWrapper line_ends2(s2);
497
+
498
+ LineArrayCompareInput
499
+ input(Isolate::Current(), s1, s2, line_ends1, line_ends2);
500
+ TokenizingLineArrayCompareOutput output(line_ends1, line_ends2, s1, s2);
501
+
502
+ Comparator::CalculateDifference(&input, &output);
503
+
504
+ return output.GetResult();
505
+ }
506
+
507
+
508
+ static void CompileScriptForTracker(Isolate* isolate, Handle<Script> script) {
509
+ // TODO(635): support extensions.
510
+ PostponeInterruptsScope postpone(isolate);
511
+
512
+ // Build AST.
513
+ CompilationInfo info(script);
514
+ info.MarkAsGlobal();
515
+ if (ParserApi::Parse(&info)) {
516
+ // Compile the code.
517
+ LiveEditFunctionTracker tracker(info.isolate(), info.function());
518
+ if (Compiler::MakeCodeForLiveEdit(&info)) {
519
+ ASSERT(!info.code().is_null());
520
+ tracker.RecordRootFunctionInfo(info.code());
521
+ } else {
522
+ info.isolate()->StackOverflow();
523
+ }
524
+ }
525
+ }
526
+
527
+
528
+ // Unwraps JSValue object, returning its field "value"
529
+ static Handle<Object> UnwrapJSValue(Handle<JSValue> jsValue) {
530
+ return Handle<Object>(jsValue->value());
531
+ }
532
+
533
+
534
+ // Wraps any object into a OpaqueReference, that will hide the object
535
+ // from JavaScript.
536
+ static Handle<JSValue> WrapInJSValue(Object* object) {
537
+ Handle<JSFunction> constructor =
538
+ Isolate::Current()->opaque_reference_function();
539
+ Handle<JSValue> result =
540
+ Handle<JSValue>::cast(FACTORY->NewJSObject(constructor));
541
+ result->set_value(object);
542
+ return result;
543
+ }
544
+
545
+
546
+ // Simple helper class that creates more or less typed structures over
547
+ // JSArray object. This is an adhoc method of passing structures from C++
548
+ // to JavaScript.
549
+ template<typename S>
550
+ class JSArrayBasedStruct {
551
+ public:
552
+ static S Create() {
553
+ Handle<JSArray> array = FACTORY->NewJSArray(S::kSize_);
554
+ return S(array);
555
+ }
556
+ static S cast(Object* object) {
557
+ JSArray* array = JSArray::cast(object);
558
+ Handle<JSArray> array_handle(array);
559
+ return S(array_handle);
560
+ }
561
+ explicit JSArrayBasedStruct(Handle<JSArray> array) : array_(array) {
562
+ }
563
+ Handle<JSArray> GetJSArray() {
564
+ return array_;
565
+ }
566
+
567
+ protected:
568
+ void SetField(int field_position, Handle<Object> value) {
569
+ SetElementNonStrict(array_, field_position, value);
570
+ }
571
+ void SetSmiValueField(int field_position, int value) {
572
+ SetElementNonStrict(array_,
573
+ field_position,
574
+ Handle<Smi>(Smi::FromInt(value)));
575
+ }
576
+ Object* GetField(int field_position) {
577
+ return array_->GetElementNoExceptionThrown(field_position);
578
+ }
579
+ int GetSmiValueField(int field_position) {
580
+ Object* res = GetField(field_position);
581
+ return Smi::cast(res)->value();
582
+ }
583
+
584
+ private:
585
+ Handle<JSArray> array_;
586
+ };
587
+
588
+
589
+ // Represents some function compilation details. This structure will be used
590
+ // from JavaScript. It contains Code object, which is kept wrapped
591
+ // into a BlindReference for sanitizing reasons.
592
+ class FunctionInfoWrapper : public JSArrayBasedStruct<FunctionInfoWrapper> {
593
+ public:
594
+ explicit FunctionInfoWrapper(Handle<JSArray> array)
595
+ : JSArrayBasedStruct<FunctionInfoWrapper>(array) {
596
+ }
597
+ void SetInitialProperties(Handle<String> name, int start_position,
598
+ int end_position, int param_num, int parent_index) {
599
+ HandleScope scope;
600
+ this->SetField(kFunctionNameOffset_, name);
601
+ this->SetSmiValueField(kStartPositionOffset_, start_position);
602
+ this->SetSmiValueField(kEndPositionOffset_, end_position);
603
+ this->SetSmiValueField(kParamNumOffset_, param_num);
604
+ this->SetSmiValueField(kParentIndexOffset_, parent_index);
605
+ }
606
+ void SetFunctionCode(Handle<Code> function_code,
607
+ Handle<Object> code_scope_info) {
608
+ Handle<JSValue> code_wrapper = WrapInJSValue(*function_code);
609
+ this->SetField(kCodeOffset_, code_wrapper);
610
+
611
+ Handle<JSValue> scope_wrapper = WrapInJSValue(*code_scope_info);
612
+ this->SetField(kCodeScopeInfoOffset_, scope_wrapper);
613
+ }
614
+ void SetOuterScopeInfo(Handle<Object> scope_info_array) {
615
+ this->SetField(kOuterScopeInfoOffset_, scope_info_array);
616
+ }
617
+ void SetSharedFunctionInfo(Handle<SharedFunctionInfo> info) {
618
+ Handle<JSValue> info_holder = WrapInJSValue(*info);
619
+ this->SetField(kSharedFunctionInfoOffset_, info_holder);
620
+ }
621
+ int GetParentIndex() {
622
+ return this->GetSmiValueField(kParentIndexOffset_);
623
+ }
624
+ Handle<Code> GetFunctionCode() {
625
+ Handle<Object> raw_result = UnwrapJSValue(Handle<JSValue>(
626
+ JSValue::cast(this->GetField(kCodeOffset_))));
627
+ return Handle<Code>::cast(raw_result);
628
+ }
629
+ Handle<Object> GetCodeScopeInfo() {
630
+ Handle<Object> raw_result = UnwrapJSValue(Handle<JSValue>(
631
+ JSValue::cast(this->GetField(kCodeScopeInfoOffset_))));
632
+ return raw_result;
633
+ }
634
+ int GetStartPosition() {
635
+ return this->GetSmiValueField(kStartPositionOffset_);
636
+ }
637
+ int GetEndPosition() {
638
+ return this->GetSmiValueField(kEndPositionOffset_);
639
+ }
640
+
641
+ private:
642
+ static const int kFunctionNameOffset_ = 0;
643
+ static const int kStartPositionOffset_ = 1;
644
+ static const int kEndPositionOffset_ = 2;
645
+ static const int kParamNumOffset_ = 3;
646
+ static const int kCodeOffset_ = 4;
647
+ static const int kCodeScopeInfoOffset_ = 5;
648
+ static const int kOuterScopeInfoOffset_ = 6;
649
+ static const int kParentIndexOffset_ = 7;
650
+ static const int kSharedFunctionInfoOffset_ = 8;
651
+ static const int kSize_ = 9;
652
+
653
+ friend class JSArrayBasedStruct<FunctionInfoWrapper>;
654
+ };
655
+
656
+
657
+ // Wraps SharedFunctionInfo along with some of its fields for passing it
658
+ // back to JavaScript. SharedFunctionInfo object itself is additionally
659
+ // wrapped into BlindReference for sanitizing reasons.
660
+ class SharedInfoWrapper : public JSArrayBasedStruct<SharedInfoWrapper> {
661
+ public:
662
+ static bool IsInstance(Handle<JSArray> array) {
663
+ return array->length() == Smi::FromInt(kSize_) &&
664
+ array->GetElementNoExceptionThrown(kSharedInfoOffset_)->IsJSValue();
665
+ }
666
+
667
+ explicit SharedInfoWrapper(Handle<JSArray> array)
668
+ : JSArrayBasedStruct<SharedInfoWrapper>(array) {
669
+ }
670
+
671
+ void SetProperties(Handle<String> name, int start_position, int end_position,
672
+ Handle<SharedFunctionInfo> info) {
673
+ HandleScope scope;
674
+ this->SetField(kFunctionNameOffset_, name);
675
+ Handle<JSValue> info_holder = WrapInJSValue(*info);
676
+ this->SetField(kSharedInfoOffset_, info_holder);
677
+ this->SetSmiValueField(kStartPositionOffset_, start_position);
678
+ this->SetSmiValueField(kEndPositionOffset_, end_position);
679
+ }
680
+ Handle<SharedFunctionInfo> GetInfo() {
681
+ Object* element = this->GetField(kSharedInfoOffset_);
682
+ Handle<JSValue> value_wrapper(JSValue::cast(element));
683
+ Handle<Object> raw_result = UnwrapJSValue(value_wrapper);
684
+ return Handle<SharedFunctionInfo>::cast(raw_result);
685
+ }
686
+
687
+ private:
688
+ static const int kFunctionNameOffset_ = 0;
689
+ static const int kStartPositionOffset_ = 1;
690
+ static const int kEndPositionOffset_ = 2;
691
+ static const int kSharedInfoOffset_ = 3;
692
+ static const int kSize_ = 4;
693
+
694
+ friend class JSArrayBasedStruct<SharedInfoWrapper>;
695
+ };
696
+
697
+
698
+ class FunctionInfoListener {
699
+ public:
700
+ FunctionInfoListener() {
701
+ current_parent_index_ = -1;
702
+ len_ = 0;
703
+ result_ = FACTORY->NewJSArray(10);
704
+ }
705
+
706
+ void FunctionStarted(FunctionLiteral* fun) {
707
+ HandleScope scope;
708
+ FunctionInfoWrapper info = FunctionInfoWrapper::Create();
709
+ info.SetInitialProperties(fun->name(), fun->start_position(),
710
+ fun->end_position(), fun->num_parameters(),
711
+ current_parent_index_);
712
+ current_parent_index_ = len_;
713
+ SetElementNonStrict(result_, len_, info.GetJSArray());
714
+ len_++;
715
+ }
716
+
717
+ void FunctionDone() {
718
+ HandleScope scope;
719
+ FunctionInfoWrapper info =
720
+ FunctionInfoWrapper::cast(
721
+ result_->GetElementNoExceptionThrown(current_parent_index_));
722
+ current_parent_index_ = info.GetParentIndex();
723
+ }
724
+
725
+ // Saves only function code, because for a script function we
726
+ // may never create a SharedFunctionInfo object.
727
+ void FunctionCode(Handle<Code> function_code) {
728
+ FunctionInfoWrapper info =
729
+ FunctionInfoWrapper::cast(
730
+ result_->GetElementNoExceptionThrown(current_parent_index_));
731
+ info.SetFunctionCode(function_code, Handle<Object>(HEAP->null_value()));
732
+ }
733
+
734
+ // Saves full information about a function: its code, its scope info
735
+ // and a SharedFunctionInfo object.
736
+ void FunctionInfo(Handle<SharedFunctionInfo> shared, Scope* scope) {
737
+ if (!shared->IsSharedFunctionInfo()) {
738
+ return;
739
+ }
740
+ FunctionInfoWrapper info =
741
+ FunctionInfoWrapper::cast(
742
+ result_->GetElementNoExceptionThrown(current_parent_index_));
743
+ info.SetFunctionCode(Handle<Code>(shared->code()),
744
+ Handle<Object>(shared->scope_info()));
745
+ info.SetSharedFunctionInfo(shared);
746
+
747
+ Handle<Object> scope_info_list(SerializeFunctionScope(scope));
748
+ info.SetOuterScopeInfo(scope_info_list);
749
+ }
750
+
751
+ Handle<JSArray> GetResult() { return result_; }
752
+
753
+ private:
754
+ Object* SerializeFunctionScope(Scope* scope) {
755
+ HandleScope handle_scope;
756
+
757
+ Handle<JSArray> scope_info_list = FACTORY->NewJSArray(10);
758
+ int scope_info_length = 0;
759
+
760
+ // Saves some description of scope. It stores name and indexes of
761
+ // variables in the whole scope chain. Null-named slots delimit
762
+ // scopes of this chain.
763
+ Scope* outer_scope = scope->outer_scope();
764
+ if (outer_scope == NULL) {
765
+ return HEAP->undefined_value();
766
+ }
767
+ do {
768
+ ZoneList<Variable*> list(10);
769
+ outer_scope->CollectUsedVariables(&list);
770
+ int j = 0;
771
+ for (int i = 0; i < list.length(); i++) {
772
+ Variable* var1 = list[i];
773
+ Slot* slot = var1->AsSlot();
774
+ if (slot != NULL && slot->type() == Slot::CONTEXT) {
775
+ if (j != i) {
776
+ list[j] = var1;
777
+ }
778
+ j++;
779
+ }
780
+ }
781
+
782
+ // Sort it.
783
+ for (int k = 1; k < j; k++) {
784
+ int l = k;
785
+ for (int m = k + 1; m < j; m++) {
786
+ if (list[l]->AsSlot()->index() > list[m]->AsSlot()->index()) {
787
+ l = m;
788
+ }
789
+ }
790
+ list[k] = list[l];
791
+ }
792
+ for (int i = 0; i < j; i++) {
793
+ SetElementNonStrict(scope_info_list,
794
+ scope_info_length,
795
+ list[i]->name());
796
+ scope_info_length++;
797
+ SetElementNonStrict(
798
+ scope_info_list,
799
+ scope_info_length,
800
+ Handle<Smi>(Smi::FromInt(list[i]->AsSlot()->index())));
801
+ scope_info_length++;
802
+ }
803
+ SetElementNonStrict(scope_info_list,
804
+ scope_info_length,
805
+ Handle<Object>(HEAP->null_value()));
806
+ scope_info_length++;
807
+
808
+ outer_scope = outer_scope->outer_scope();
809
+ } while (outer_scope != NULL);
810
+
811
+ return *scope_info_list;
812
+ }
813
+
814
+ Handle<JSArray> result_;
815
+ int len_;
816
+ int current_parent_index_;
817
+ };
818
+
819
+
820
+ JSArray* LiveEdit::GatherCompileInfo(Handle<Script> script,
821
+ Handle<String> source) {
822
+ Isolate* isolate = Isolate::Current();
823
+ CompilationZoneScope zone_scope(DELETE_ON_EXIT);
824
+
825
+ FunctionInfoListener listener;
826
+ Handle<Object> original_source = Handle<Object>(script->source());
827
+ script->set_source(*source);
828
+ isolate->set_active_function_info_listener(&listener);
829
+ CompileScriptForTracker(isolate, script);
830
+ isolate->set_active_function_info_listener(NULL);
831
+ script->set_source(*original_source);
832
+
833
+ return *(listener.GetResult());
834
+ }
835
+
836
+
837
+ void LiveEdit::WrapSharedFunctionInfos(Handle<JSArray> array) {
838
+ HandleScope scope;
839
+ int len = Smi::cast(array->length())->value();
840
+ for (int i = 0; i < len; i++) {
841
+ Handle<SharedFunctionInfo> info(
842
+ SharedFunctionInfo::cast(array->GetElementNoExceptionThrown(i)));
843
+ SharedInfoWrapper info_wrapper = SharedInfoWrapper::Create();
844
+ Handle<String> name_handle(String::cast(info->name()));
845
+ info_wrapper.SetProperties(name_handle, info->start_position(),
846
+ info->end_position(), info);
847
+ SetElementNonStrict(array, i, info_wrapper.GetJSArray());
848
+ }
849
+ }
850
+
851
+
852
+ // Visitor that collects all references to a particular code object,
853
+ // including "CODE_TARGET" references in other code objects.
854
+ // It works in context of ZoneScope.
855
+ class ReferenceCollectorVisitor : public ObjectVisitor {
856
+ public:
857
+ explicit ReferenceCollectorVisitor(Code* original)
858
+ : original_(original), rvalues_(10), reloc_infos_(10), code_entries_(10) {
859
+ }
860
+
861
+ virtual void VisitPointers(Object** start, Object** end) {
862
+ for (Object** p = start; p < end; p++) {
863
+ if (*p == original_) {
864
+ rvalues_.Add(p);
865
+ }
866
+ }
867
+ }
868
+
869
+ virtual void VisitCodeEntry(Address entry) {
870
+ if (Code::GetObjectFromEntryAddress(entry) == original_) {
871
+ code_entries_.Add(entry);
872
+ }
873
+ }
874
+
875
+ virtual void VisitCodeTarget(RelocInfo* rinfo) {
876
+ if (RelocInfo::IsCodeTarget(rinfo->rmode()) &&
877
+ Code::GetCodeFromTargetAddress(rinfo->target_address()) == original_) {
878
+ reloc_infos_.Add(*rinfo);
879
+ }
880
+ }
881
+
882
+ virtual void VisitDebugTarget(RelocInfo* rinfo) {
883
+ VisitCodeTarget(rinfo);
884
+ }
885
+
886
+ // Post-visiting method that iterates over all collected references and
887
+ // modifies them.
888
+ void Replace(Code* substitution) {
889
+ for (int i = 0; i < rvalues_.length(); i++) {
890
+ *(rvalues_[i]) = substitution;
891
+ }
892
+ Address substitution_entry = substitution->instruction_start();
893
+ for (int i = 0; i < reloc_infos_.length(); i++) {
894
+ reloc_infos_[i].set_target_address(substitution_entry);
895
+ }
896
+ for (int i = 0; i < code_entries_.length(); i++) {
897
+ Address entry = code_entries_[i];
898
+ Memory::Address_at(entry) = substitution_entry;
899
+ }
900
+ }
901
+
902
+ private:
903
+ Code* original_;
904
+ ZoneList<Object**> rvalues_;
905
+ ZoneList<RelocInfo> reloc_infos_;
906
+ ZoneList<Address> code_entries_;
907
+ };
908
+
909
+
910
+ // Finds all references to original and replaces them with substitution.
911
+ static void ReplaceCodeObject(Code* original, Code* substitution) {
912
+ ASSERT(!HEAP->InNewSpace(substitution));
913
+
914
+ AssertNoAllocation no_allocations_please;
915
+
916
+ // A zone scope for ReferenceCollectorVisitor.
917
+ ZoneScope scope(DELETE_ON_EXIT);
918
+
919
+ ReferenceCollectorVisitor visitor(original);
920
+
921
+ // Iterate over all roots. Stack frames may have pointer into original code,
922
+ // so temporary replace the pointers with offset numbers
923
+ // in prologue/epilogue.
924
+ {
925
+ HEAP->IterateStrongRoots(&visitor, VISIT_ALL);
926
+ }
927
+
928
+ // Now iterate over all pointers of all objects, including code_target
929
+ // implicit pointers.
930
+ HeapIterator iterator;
931
+ for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
932
+ obj->Iterate(&visitor);
933
+ }
934
+
935
+ visitor.Replace(substitution);
936
+ }
937
+
938
+
939
+ // Check whether the code is natural function code (not a lazy-compile stub
940
+ // code).
941
+ static bool IsJSFunctionCode(Code* code) {
942
+ return code->kind() == Code::FUNCTION;
943
+ }
944
+
945
+
946
+ // Returns true if an instance of candidate were inlined into function's code.
947
+ static bool IsInlined(JSFunction* function, SharedFunctionInfo* candidate) {
948
+ AssertNoAllocation no_gc;
949
+
950
+ if (function->code()->kind() != Code::OPTIMIZED_FUNCTION) return false;
951
+
952
+ DeoptimizationInputData* data =
953
+ DeoptimizationInputData::cast(function->code()->deoptimization_data());
954
+
955
+ if (data == HEAP->empty_fixed_array()) return false;
956
+
957
+ FixedArray* literals = data->LiteralArray();
958
+
959
+ int inlined_count = data->InlinedFunctionCount()->value();
960
+ for (int i = 0; i < inlined_count; ++i) {
961
+ JSFunction* inlined = JSFunction::cast(literals->get(i));
962
+ if (inlined->shared() == candidate) return true;
963
+ }
964
+
965
+ return false;
966
+ }
967
+
968
+
969
+ class DependentFunctionsDeoptimizingVisitor : public OptimizedFunctionVisitor {
970
+ public:
971
+ explicit DependentFunctionsDeoptimizingVisitor(
972
+ SharedFunctionInfo* function_info)
973
+ : function_info_(function_info) {}
974
+
975
+ virtual void EnterContext(Context* context) {
976
+ }
977
+
978
+ virtual void VisitFunction(JSFunction* function) {
979
+ if (function->shared() == function_info_ ||
980
+ IsInlined(function, function_info_)) {
981
+ Deoptimizer::DeoptimizeFunction(function);
982
+ }
983
+ }
984
+
985
+ virtual void LeaveContext(Context* context) {
986
+ }
987
+
988
+ private:
989
+ SharedFunctionInfo* function_info_;
990
+ };
991
+
992
+
993
+ static void DeoptimizeDependentFunctions(SharedFunctionInfo* function_info) {
994
+ AssertNoAllocation no_allocation;
995
+
996
+ DependentFunctionsDeoptimizingVisitor visitor(function_info);
997
+ Deoptimizer::VisitAllOptimizedFunctions(&visitor);
998
+ }
999
+
1000
+
1001
+ MaybeObject* LiveEdit::ReplaceFunctionCode(
1002
+ Handle<JSArray> new_compile_info_array,
1003
+ Handle<JSArray> shared_info_array) {
1004
+ HandleScope scope;
1005
+
1006
+ if (!SharedInfoWrapper::IsInstance(shared_info_array)) {
1007
+ return Isolate::Current()->ThrowIllegalOperation();
1008
+ }
1009
+
1010
+ FunctionInfoWrapper compile_info_wrapper(new_compile_info_array);
1011
+ SharedInfoWrapper shared_info_wrapper(shared_info_array);
1012
+
1013
+ Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo();
1014
+
1015
+ if (IsJSFunctionCode(shared_info->code())) {
1016
+ Handle<Code> code = compile_info_wrapper.GetFunctionCode();
1017
+ ReplaceCodeObject(shared_info->code(), *code);
1018
+ Handle<Object> code_scope_info = compile_info_wrapper.GetCodeScopeInfo();
1019
+ if (code_scope_info->IsFixedArray()) {
1020
+ shared_info->set_scope_info(SerializedScopeInfo::cast(*code_scope_info));
1021
+ }
1022
+ }
1023
+
1024
+ if (shared_info->debug_info()->IsDebugInfo()) {
1025
+ Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info()));
1026
+ Handle<Code> new_original_code =
1027
+ FACTORY->CopyCode(compile_info_wrapper.GetFunctionCode());
1028
+ debug_info->set_original_code(*new_original_code);
1029
+ }
1030
+
1031
+ int start_position = compile_info_wrapper.GetStartPosition();
1032
+ int end_position = compile_info_wrapper.GetEndPosition();
1033
+ shared_info->set_start_position(start_position);
1034
+ shared_info->set_end_position(end_position);
1035
+
1036
+ shared_info->set_construct_stub(
1037
+ Isolate::Current()->builtins()->builtin(
1038
+ Builtins::kJSConstructStubGeneric));
1039
+
1040
+ DeoptimizeDependentFunctions(*shared_info);
1041
+ Isolate::Current()->compilation_cache()->Remove(shared_info);
1042
+
1043
+ return HEAP->undefined_value();
1044
+ }
1045
+
1046
+
1047
+ MaybeObject* LiveEdit::FunctionSourceUpdated(
1048
+ Handle<JSArray> shared_info_array) {
1049
+ HandleScope scope;
1050
+
1051
+ if (!SharedInfoWrapper::IsInstance(shared_info_array)) {
1052
+ return Isolate::Current()->ThrowIllegalOperation();
1053
+ }
1054
+
1055
+ SharedInfoWrapper shared_info_wrapper(shared_info_array);
1056
+ Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo();
1057
+
1058
+ DeoptimizeDependentFunctions(*shared_info);
1059
+ Isolate::Current()->compilation_cache()->Remove(shared_info);
1060
+
1061
+ return HEAP->undefined_value();
1062
+ }
1063
+
1064
+
1065
+ void LiveEdit::SetFunctionScript(Handle<JSValue> function_wrapper,
1066
+ Handle<Object> script_handle) {
1067
+ Handle<SharedFunctionInfo> shared_info =
1068
+ Handle<SharedFunctionInfo>::cast(UnwrapJSValue(function_wrapper));
1069
+ shared_info->set_script(*script_handle);
1070
+
1071
+ Isolate::Current()->compilation_cache()->Remove(shared_info);
1072
+ }
1073
+
1074
+
1075
+ // For a script text change (defined as position_change_array), translates
1076
+ // position in unchanged text to position in changed text.
1077
+ // Text change is a set of non-overlapping regions in text, that have changed
1078
+ // their contents and length. It is specified as array of groups of 3 numbers:
1079
+ // (change_begin, change_end, change_end_new_position).
1080
+ // Each group describes a change in text; groups are sorted by change_begin.
1081
+ // Only position in text beyond any changes may be successfully translated.
1082
+ // If a positions is inside some region that changed, result is currently
1083
+ // undefined.
1084
+ static int TranslatePosition(int original_position,
1085
+ Handle<JSArray> position_change_array) {
1086
+ int position_diff = 0;
1087
+ int array_len = Smi::cast(position_change_array->length())->value();
1088
+ // TODO(635): binary search may be used here
1089
+ for (int i = 0; i < array_len; i += 3) {
1090
+ Object* element = position_change_array->GetElementNoExceptionThrown(i);
1091
+ int chunk_start = Smi::cast(element)->value();
1092
+ if (original_position < chunk_start) {
1093
+ break;
1094
+ }
1095
+ element = position_change_array->GetElementNoExceptionThrown(i + 1);
1096
+ int chunk_end = Smi::cast(element)->value();
1097
+ // Position mustn't be inside a chunk.
1098
+ ASSERT(original_position >= chunk_end);
1099
+ element = position_change_array->GetElementNoExceptionThrown(i + 2);
1100
+ int chunk_changed_end = Smi::cast(element)->value();
1101
+ position_diff = chunk_changed_end - chunk_end;
1102
+ }
1103
+
1104
+ return original_position + position_diff;
1105
+ }
1106
+
1107
+
1108
+ // Auto-growing buffer for writing relocation info code section. This buffer
1109
+ // is a simplified version of buffer from Assembler. Unlike Assembler, this
1110
+ // class is platform-independent and it works without dealing with instructions.
1111
+ // As specified by RelocInfo format, the buffer is filled in reversed order:
1112
+ // from upper to lower addresses.
1113
+ // It uses NewArray/DeleteArray for memory management.
1114
+ class RelocInfoBuffer {
1115
+ public:
1116
+ RelocInfoBuffer(int buffer_initial_capicity, byte* pc) {
1117
+ buffer_size_ = buffer_initial_capicity + kBufferGap;
1118
+ buffer_ = NewArray<byte>(buffer_size_);
1119
+
1120
+ reloc_info_writer_.Reposition(buffer_ + buffer_size_, pc);
1121
+ }
1122
+ ~RelocInfoBuffer() {
1123
+ DeleteArray(buffer_);
1124
+ }
1125
+
1126
+ // As specified by RelocInfo format, the buffer is filled in reversed order:
1127
+ // from upper to lower addresses.
1128
+ void Write(const RelocInfo* rinfo) {
1129
+ if (buffer_ + kBufferGap >= reloc_info_writer_.pos()) {
1130
+ Grow();
1131
+ }
1132
+ reloc_info_writer_.Write(rinfo);
1133
+ }
1134
+
1135
+ Vector<byte> GetResult() {
1136
+ // Return the bytes from pos up to end of buffer.
1137
+ int result_size =
1138
+ static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer_.pos());
1139
+ return Vector<byte>(reloc_info_writer_.pos(), result_size);
1140
+ }
1141
+
1142
+ private:
1143
+ void Grow() {
1144
+ // Compute new buffer size.
1145
+ int new_buffer_size;
1146
+ if (buffer_size_ < 2 * KB) {
1147
+ new_buffer_size = 4 * KB;
1148
+ } else {
1149
+ new_buffer_size = 2 * buffer_size_;
1150
+ }
1151
+ // Some internal data structures overflow for very large buffers,
1152
+ // they must ensure that kMaximalBufferSize is not too large.
1153
+ if (new_buffer_size > kMaximalBufferSize) {
1154
+ V8::FatalProcessOutOfMemory("RelocInfoBuffer::GrowBuffer");
1155
+ }
1156
+
1157
+ // Setup new buffer.
1158
+ byte* new_buffer = NewArray<byte>(new_buffer_size);
1159
+
1160
+ // Copy the data.
1161
+ int curently_used_size =
1162
+ static_cast<int>(buffer_ + buffer_size_ - reloc_info_writer_.pos());
1163
+ memmove(new_buffer + new_buffer_size - curently_used_size,
1164
+ reloc_info_writer_.pos(), curently_used_size);
1165
+
1166
+ reloc_info_writer_.Reposition(
1167
+ new_buffer + new_buffer_size - curently_used_size,
1168
+ reloc_info_writer_.last_pc());
1169
+
1170
+ DeleteArray(buffer_);
1171
+ buffer_ = new_buffer;
1172
+ buffer_size_ = new_buffer_size;
1173
+ }
1174
+
1175
+ RelocInfoWriter reloc_info_writer_;
1176
+ byte* buffer_;
1177
+ int buffer_size_;
1178
+
1179
+ static const int kBufferGap = RelocInfoWriter::kMaxSize;
1180
+ static const int kMaximalBufferSize = 512*MB;
1181
+ };
1182
+
1183
+ // Patch positions in code (changes relocation info section) and possibly
1184
+ // returns new instance of code.
1185
+ static Handle<Code> PatchPositionsInCode(Handle<Code> code,
1186
+ Handle<JSArray> position_change_array) {
1187
+
1188
+ RelocInfoBuffer buffer_writer(code->relocation_size(),
1189
+ code->instruction_start());
1190
+
1191
+ {
1192
+ AssertNoAllocation no_allocations_please;
1193
+ for (RelocIterator it(*code); !it.done(); it.next()) {
1194
+ RelocInfo* rinfo = it.rinfo();
1195
+ if (RelocInfo::IsPosition(rinfo->rmode())) {
1196
+ int position = static_cast<int>(rinfo->data());
1197
+ int new_position = TranslatePosition(position,
1198
+ position_change_array);
1199
+ if (position != new_position) {
1200
+ RelocInfo info_copy(rinfo->pc(), rinfo->rmode(), new_position);
1201
+ buffer_writer.Write(&info_copy);
1202
+ continue;
1203
+ }
1204
+ }
1205
+ buffer_writer.Write(it.rinfo());
1206
+ }
1207
+ }
1208
+
1209
+ Vector<byte> buffer = buffer_writer.GetResult();
1210
+
1211
+ if (buffer.length() == code->relocation_size()) {
1212
+ // Simply patch relocation area of code.
1213
+ memcpy(code->relocation_start(), buffer.start(), buffer.length());
1214
+ return code;
1215
+ } else {
1216
+ // Relocation info section now has different size. We cannot simply
1217
+ // rewrite it inside code object. Instead we have to create a new
1218
+ // code object.
1219
+ Handle<Code> result(FACTORY->CopyCode(code, buffer));
1220
+ return result;
1221
+ }
1222
+ }
1223
+
1224
+
1225
+ MaybeObject* LiveEdit::PatchFunctionPositions(
1226
+ Handle<JSArray> shared_info_array, Handle<JSArray> position_change_array) {
1227
+
1228
+ if (!SharedInfoWrapper::IsInstance(shared_info_array)) {
1229
+ return Isolate::Current()->ThrowIllegalOperation();
1230
+ }
1231
+
1232
+ SharedInfoWrapper shared_info_wrapper(shared_info_array);
1233
+ Handle<SharedFunctionInfo> info = shared_info_wrapper.GetInfo();
1234
+
1235
+ int old_function_start = info->start_position();
1236
+ int new_function_start = TranslatePosition(old_function_start,
1237
+ position_change_array);
1238
+ int new_function_end = TranslatePosition(info->end_position(),
1239
+ position_change_array);
1240
+ int new_function_token_pos =
1241
+ TranslatePosition(info->function_token_position(), position_change_array);
1242
+
1243
+ info->set_start_position(new_function_start);
1244
+ info->set_end_position(new_function_end);
1245
+ info->set_function_token_position(new_function_token_pos);
1246
+
1247
+ if (IsJSFunctionCode(info->code())) {
1248
+ // Patch relocation info section of the code.
1249
+ Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()),
1250
+ position_change_array);
1251
+ if (*patched_code != info->code()) {
1252
+ // Replace all references to the code across the heap. In particular,
1253
+ // some stubs may refer to this code and this code may be being executed
1254
+ // on stack (it is safe to substitute the code object on stack, because
1255
+ // we only change the structure of rinfo and leave instructions
1256
+ // untouched).
1257
+ ReplaceCodeObject(info->code(), *patched_code);
1258
+ }
1259
+ }
1260
+
1261
+ return HEAP->undefined_value();
1262
+ }
1263
+
1264
+
1265
+ static Handle<Script> CreateScriptCopy(Handle<Script> original) {
1266
+ Handle<String> original_source(String::cast(original->source()));
1267
+
1268
+ Handle<Script> copy = FACTORY->NewScript(original_source);
1269
+
1270
+ copy->set_name(original->name());
1271
+ copy->set_line_offset(original->line_offset());
1272
+ copy->set_column_offset(original->column_offset());
1273
+ copy->set_data(original->data());
1274
+ copy->set_type(original->type());
1275
+ copy->set_context_data(original->context_data());
1276
+ copy->set_compilation_type(original->compilation_type());
1277
+ copy->set_eval_from_shared(original->eval_from_shared());
1278
+ copy->set_eval_from_instructions_offset(
1279
+ original->eval_from_instructions_offset());
1280
+
1281
+ return copy;
1282
+ }
1283
+
1284
+
1285
+ Object* LiveEdit::ChangeScriptSource(Handle<Script> original_script,
1286
+ Handle<String> new_source,
1287
+ Handle<Object> old_script_name) {
1288
+ Handle<Object> old_script_object;
1289
+ if (old_script_name->IsString()) {
1290
+ Handle<Script> old_script = CreateScriptCopy(original_script);
1291
+ old_script->set_name(String::cast(*old_script_name));
1292
+ old_script_object = old_script;
1293
+ Isolate::Current()->debugger()->OnAfterCompile(
1294
+ old_script, Debugger::SEND_WHEN_DEBUGGING);
1295
+ } else {
1296
+ old_script_object = Handle<Object>(HEAP->null_value());
1297
+ }
1298
+
1299
+ original_script->set_source(*new_source);
1300
+
1301
+ // Drop line ends so that they will be recalculated.
1302
+ original_script->set_line_ends(HEAP->undefined_value());
1303
+
1304
+ return *old_script_object;
1305
+ }
1306
+
1307
+
1308
+
1309
+ void LiveEdit::ReplaceRefToNestedFunction(
1310
+ Handle<JSValue> parent_function_wrapper,
1311
+ Handle<JSValue> orig_function_wrapper,
1312
+ Handle<JSValue> subst_function_wrapper) {
1313
+
1314
+ Handle<SharedFunctionInfo> parent_shared =
1315
+ Handle<SharedFunctionInfo>::cast(UnwrapJSValue(parent_function_wrapper));
1316
+ Handle<SharedFunctionInfo> orig_shared =
1317
+ Handle<SharedFunctionInfo>::cast(UnwrapJSValue(orig_function_wrapper));
1318
+ Handle<SharedFunctionInfo> subst_shared =
1319
+ Handle<SharedFunctionInfo>::cast(UnwrapJSValue(subst_function_wrapper));
1320
+
1321
+ for (RelocIterator it(parent_shared->code()); !it.done(); it.next()) {
1322
+ if (it.rinfo()->rmode() == RelocInfo::EMBEDDED_OBJECT) {
1323
+ if (it.rinfo()->target_object() == *orig_shared) {
1324
+ it.rinfo()->set_target_object(*subst_shared);
1325
+ }
1326
+ }
1327
+ }
1328
+ }
1329
+
1330
+
1331
+ // Check an activation against list of functions. If there is a function
1332
+ // that matches, its status in result array is changed to status argument value.
1333
+ static bool CheckActivation(Handle<JSArray> shared_info_array,
1334
+ Handle<JSArray> result,
1335
+ StackFrame* frame,
1336
+ LiveEdit::FunctionPatchabilityStatus status) {
1337
+ if (!frame->is_java_script()) return false;
1338
+
1339
+ Handle<JSFunction> function(
1340
+ JSFunction::cast(JavaScriptFrame::cast(frame)->function()));
1341
+
1342
+ int len = Smi::cast(shared_info_array->length())->value();
1343
+ for (int i = 0; i < len; i++) {
1344
+ JSValue* wrapper =
1345
+ JSValue::cast(shared_info_array->GetElementNoExceptionThrown(i));
1346
+ Handle<SharedFunctionInfo> shared(
1347
+ SharedFunctionInfo::cast(wrapper->value()));
1348
+
1349
+ if (function->shared() == *shared || IsInlined(*function, *shared)) {
1350
+ SetElementNonStrict(result, i, Handle<Smi>(Smi::FromInt(status)));
1351
+ return true;
1352
+ }
1353
+ }
1354
+ return false;
1355
+ }
1356
+
1357
+
1358
+ // Iterates over handler chain and removes all elements that are inside
1359
+ // frames being dropped.
1360
+ static bool FixTryCatchHandler(StackFrame* top_frame,
1361
+ StackFrame* bottom_frame) {
1362
+ Address* pointer_address =
1363
+ &Memory::Address_at(Isolate::Current()->get_address_from_id(
1364
+ Isolate::k_handler_address));
1365
+
1366
+ while (*pointer_address < top_frame->sp()) {
1367
+ pointer_address = &Memory::Address_at(*pointer_address);
1368
+ }
1369
+ Address* above_frame_address = pointer_address;
1370
+ while (*pointer_address < bottom_frame->fp()) {
1371
+ pointer_address = &Memory::Address_at(*pointer_address);
1372
+ }
1373
+ bool change = *above_frame_address != *pointer_address;
1374
+ *above_frame_address = *pointer_address;
1375
+ return change;
1376
+ }
1377
+
1378
+
1379
+ // Removes specified range of frames from stack. There may be 1 or more
1380
+ // frames in range. Anyway the bottom frame is restarted rather than dropped,
1381
+ // and therefore has to be a JavaScript frame.
1382
+ // Returns error message or NULL.
1383
+ static const char* DropFrames(Vector<StackFrame*> frames,
1384
+ int top_frame_index,
1385
+ int bottom_js_frame_index,
1386
+ Debug::FrameDropMode* mode,
1387
+ Object*** restarter_frame_function_pointer) {
1388
+ if (!Debug::kFrameDropperSupported) {
1389
+ return "Stack manipulations are not supported in this architecture.";
1390
+ }
1391
+
1392
+ StackFrame* pre_top_frame = frames[top_frame_index - 1];
1393
+ StackFrame* top_frame = frames[top_frame_index];
1394
+ StackFrame* bottom_js_frame = frames[bottom_js_frame_index];
1395
+
1396
+ ASSERT(bottom_js_frame->is_java_script());
1397
+
1398
+ // Check the nature of the top frame.
1399
+ Isolate* isolate = Isolate::Current();
1400
+ Code* pre_top_frame_code = pre_top_frame->LookupCode();
1401
+ if (pre_top_frame_code->is_inline_cache_stub() &&
1402
+ pre_top_frame_code->ic_state() == DEBUG_BREAK) {
1403
+ // OK, we can drop inline cache calls.
1404
+ *mode = Debug::FRAME_DROPPED_IN_IC_CALL;
1405
+ } else if (pre_top_frame_code ==
1406
+ isolate->debug()->debug_break_slot()) {
1407
+ // OK, we can drop debug break slot.
1408
+ *mode = Debug::FRAME_DROPPED_IN_DEBUG_SLOT_CALL;
1409
+ } else if (pre_top_frame_code ==
1410
+ isolate->builtins()->builtin(
1411
+ Builtins::kFrameDropper_LiveEdit)) {
1412
+ // OK, we can drop our own code.
1413
+ *mode = Debug::FRAME_DROPPED_IN_DIRECT_CALL;
1414
+ } else if (pre_top_frame_code->kind() == Code::STUB &&
1415
+ pre_top_frame_code->major_key()) {
1416
+ // Entry from our unit tests, it's fine, we support this case.
1417
+ *mode = Debug::FRAME_DROPPED_IN_DIRECT_CALL;
1418
+ } else {
1419
+ return "Unknown structure of stack above changing function";
1420
+ }
1421
+
1422
+ Address unused_stack_top = top_frame->sp();
1423
+ Address unused_stack_bottom = bottom_js_frame->fp()
1424
+ - Debug::kFrameDropperFrameSize * kPointerSize // Size of the new frame.
1425
+ + kPointerSize; // Bigger address end is exclusive.
1426
+
1427
+ if (unused_stack_top > unused_stack_bottom) {
1428
+ return "Not enough space for frame dropper frame";
1429
+ }
1430
+
1431
+ // Committing now. After this point we should return only NULL value.
1432
+
1433
+ FixTryCatchHandler(pre_top_frame, bottom_js_frame);
1434
+ // Make sure FixTryCatchHandler is idempotent.
1435
+ ASSERT(!FixTryCatchHandler(pre_top_frame, bottom_js_frame));
1436
+
1437
+ Handle<Code> code = Isolate::Current()->builtins()->FrameDropper_LiveEdit();
1438
+ top_frame->set_pc(code->entry());
1439
+ pre_top_frame->SetCallerFp(bottom_js_frame->fp());
1440
+
1441
+ *restarter_frame_function_pointer =
1442
+ Debug::SetUpFrameDropperFrame(bottom_js_frame, code);
1443
+
1444
+ ASSERT((**restarter_frame_function_pointer)->IsJSFunction());
1445
+
1446
+ for (Address a = unused_stack_top;
1447
+ a < unused_stack_bottom;
1448
+ a += kPointerSize) {
1449
+ Memory::Object_at(a) = Smi::FromInt(0);
1450
+ }
1451
+
1452
+ return NULL;
1453
+ }
1454
+
1455
+
1456
+ static bool IsDropableFrame(StackFrame* frame) {
1457
+ return !frame->is_exit();
1458
+ }
1459
+
1460
+ // Fills result array with statuses of functions. Modifies the stack
1461
+ // removing all listed function if possible and if do_drop is true.
1462
+ static const char* DropActivationsInActiveThread(
1463
+ Handle<JSArray> shared_info_array, Handle<JSArray> result, bool do_drop) {
1464
+ Debug* debug = Isolate::Current()->debug();
1465
+ ZoneScope scope(DELETE_ON_EXIT);
1466
+ Vector<StackFrame*> frames = CreateStackMap();
1467
+
1468
+ int array_len = Smi::cast(shared_info_array->length())->value();
1469
+
1470
+ int top_frame_index = -1;
1471
+ int frame_index = 0;
1472
+ for (; frame_index < frames.length(); frame_index++) {
1473
+ StackFrame* frame = frames[frame_index];
1474
+ if (frame->id() == debug->break_frame_id()) {
1475
+ top_frame_index = frame_index;
1476
+ break;
1477
+ }
1478
+ if (CheckActivation(shared_info_array, result, frame,
1479
+ LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE)) {
1480
+ // We are still above break_frame. It is not a target frame,
1481
+ // it is a problem.
1482
+ return "Debugger mark-up on stack is not found";
1483
+ }
1484
+ }
1485
+
1486
+ if (top_frame_index == -1) {
1487
+ // We haven't found break frame, but no function is blocking us anyway.
1488
+ return NULL;
1489
+ }
1490
+
1491
+ bool target_frame_found = false;
1492
+ int bottom_js_frame_index = top_frame_index;
1493
+ bool c_code_found = false;
1494
+
1495
+ for (; frame_index < frames.length(); frame_index++) {
1496
+ StackFrame* frame = frames[frame_index];
1497
+ if (!IsDropableFrame(frame)) {
1498
+ c_code_found = true;
1499
+ break;
1500
+ }
1501
+ if (CheckActivation(shared_info_array, result, frame,
1502
+ LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) {
1503
+ target_frame_found = true;
1504
+ bottom_js_frame_index = frame_index;
1505
+ }
1506
+ }
1507
+
1508
+ if (c_code_found) {
1509
+ // There is a C frames on stack. Check that there are no target frames
1510
+ // below them.
1511
+ for (; frame_index < frames.length(); frame_index++) {
1512
+ StackFrame* frame = frames[frame_index];
1513
+ if (frame->is_java_script()) {
1514
+ if (CheckActivation(shared_info_array, result, frame,
1515
+ LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE)) {
1516
+ // Cannot drop frame under C frames.
1517
+ return NULL;
1518
+ }
1519
+ }
1520
+ }
1521
+ }
1522
+
1523
+ if (!do_drop) {
1524
+ // We are in check-only mode.
1525
+ return NULL;
1526
+ }
1527
+
1528
+ if (!target_frame_found) {
1529
+ // Nothing to drop.
1530
+ return NULL;
1531
+ }
1532
+
1533
+ Debug::FrameDropMode drop_mode = Debug::FRAMES_UNTOUCHED;
1534
+ Object** restarter_frame_function_pointer = NULL;
1535
+ const char* error_message = DropFrames(frames, top_frame_index,
1536
+ bottom_js_frame_index, &drop_mode,
1537
+ &restarter_frame_function_pointer);
1538
+
1539
+ if (error_message != NULL) {
1540
+ return error_message;
1541
+ }
1542
+
1543
+ // Adjust break_frame after some frames has been dropped.
1544
+ StackFrame::Id new_id = StackFrame::NO_ID;
1545
+ for (int i = bottom_js_frame_index + 1; i < frames.length(); i++) {
1546
+ if (frames[i]->type() == StackFrame::JAVA_SCRIPT) {
1547
+ new_id = frames[i]->id();
1548
+ break;
1549
+ }
1550
+ }
1551
+ debug->FramesHaveBeenDropped(new_id, drop_mode,
1552
+ restarter_frame_function_pointer);
1553
+
1554
+ // Replace "blocked on active" with "replaced on active" status.
1555
+ for (int i = 0; i < array_len; i++) {
1556
+ if (result->GetElement(i) ==
1557
+ Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) {
1558
+ Handle<Object> replaced(
1559
+ Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK));
1560
+ SetElementNonStrict(result, i, replaced);
1561
+ }
1562
+ }
1563
+ return NULL;
1564
+ }
1565
+
1566
+
1567
+ class InactiveThreadActivationsChecker : public ThreadVisitor {
1568
+ public:
1569
+ InactiveThreadActivationsChecker(Handle<JSArray> shared_info_array,
1570
+ Handle<JSArray> result)
1571
+ : shared_info_array_(shared_info_array), result_(result),
1572
+ has_blocked_functions_(false) {
1573
+ }
1574
+ void VisitThread(Isolate* isolate, ThreadLocalTop* top) {
1575
+ for (StackFrameIterator it(isolate, top); !it.done(); it.Advance()) {
1576
+ has_blocked_functions_ |= CheckActivation(
1577
+ shared_info_array_, result_, it.frame(),
1578
+ LiveEdit::FUNCTION_BLOCKED_ON_OTHER_STACK);
1579
+ }
1580
+ }
1581
+ bool HasBlockedFunctions() {
1582
+ return has_blocked_functions_;
1583
+ }
1584
+
1585
+ private:
1586
+ Handle<JSArray> shared_info_array_;
1587
+ Handle<JSArray> result_;
1588
+ bool has_blocked_functions_;
1589
+ };
1590
+
1591
+
1592
+ Handle<JSArray> LiveEdit::CheckAndDropActivations(
1593
+ Handle<JSArray> shared_info_array, bool do_drop) {
1594
+ int len = Smi::cast(shared_info_array->length())->value();
1595
+
1596
+ Handle<JSArray> result = FACTORY->NewJSArray(len);
1597
+
1598
+ // Fill the default values.
1599
+ for (int i = 0; i < len; i++) {
1600
+ SetElementNonStrict(
1601
+ result,
1602
+ i,
1603
+ Handle<Smi>(Smi::FromInt(FUNCTION_AVAILABLE_FOR_PATCH)));
1604
+ }
1605
+
1606
+
1607
+ // First check inactive threads. Fail if some functions are blocked there.
1608
+ InactiveThreadActivationsChecker inactive_threads_checker(shared_info_array,
1609
+ result);
1610
+ Isolate::Current()->thread_manager()->IterateArchivedThreads(
1611
+ &inactive_threads_checker);
1612
+ if (inactive_threads_checker.HasBlockedFunctions()) {
1613
+ return result;
1614
+ }
1615
+
1616
+ // Try to drop activations from the current stack.
1617
+ const char* error_message =
1618
+ DropActivationsInActiveThread(shared_info_array, result, do_drop);
1619
+ if (error_message != NULL) {
1620
+ // Add error message as an array extra element.
1621
+ Vector<const char> vector_message(error_message, StrLength(error_message));
1622
+ Handle<String> str = FACTORY->NewStringFromAscii(vector_message);
1623
+ SetElementNonStrict(result, len, str);
1624
+ }
1625
+ return result;
1626
+ }
1627
+
1628
+
1629
+ LiveEditFunctionTracker::LiveEditFunctionTracker(Isolate* isolate,
1630
+ FunctionLiteral* fun)
1631
+ : isolate_(isolate) {
1632
+ if (isolate_->active_function_info_listener() != NULL) {
1633
+ isolate_->active_function_info_listener()->FunctionStarted(fun);
1634
+ }
1635
+ }
1636
+
1637
+
1638
+ LiveEditFunctionTracker::~LiveEditFunctionTracker() {
1639
+ if (isolate_->active_function_info_listener() != NULL) {
1640
+ isolate_->active_function_info_listener()->FunctionDone();
1641
+ }
1642
+ }
1643
+
1644
+
1645
+ void LiveEditFunctionTracker::RecordFunctionInfo(
1646
+ Handle<SharedFunctionInfo> info, FunctionLiteral* lit) {
1647
+ if (isolate_->active_function_info_listener() != NULL) {
1648
+ isolate_->active_function_info_listener()->FunctionInfo(info, lit->scope());
1649
+ }
1650
+ }
1651
+
1652
+
1653
+ void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) {
1654
+ isolate_->active_function_info_listener()->FunctionCode(code);
1655
+ }
1656
+
1657
+
1658
+ bool LiveEditFunctionTracker::IsActive(Isolate* isolate) {
1659
+ return isolate->active_function_info_listener() != NULL;
1660
+ }
1661
+
1662
+
1663
+ #else // ENABLE_DEBUGGER_SUPPORT
1664
+
1665
+ // This ifdef-else-endif section provides working or stub implementation of
1666
+ // LiveEditFunctionTracker.
1667
+ LiveEditFunctionTracker::LiveEditFunctionTracker(Isolate* isolate,
1668
+ FunctionLiteral* fun) {
1669
+ }
1670
+
1671
+
1672
+ LiveEditFunctionTracker::~LiveEditFunctionTracker() {
1673
+ }
1674
+
1675
+
1676
+ void LiveEditFunctionTracker::RecordFunctionInfo(
1677
+ Handle<SharedFunctionInfo> info, FunctionLiteral* lit) {
1678
+ }
1679
+
1680
+
1681
+ void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) {
1682
+ }
1683
+
1684
+
1685
+ bool LiveEditFunctionTracker::IsActive() {
1686
+ return false;
1687
+ }
1688
+
1689
+ #endif // ENABLE_DEBUGGER_SUPPORT
1690
+
1691
+
1692
+
1693
+ } } // namespace v8::internal