libv8-sgonyea 3.3.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (500) hide show
  1. data/.gitignore +8 -0
  2. data/.gitmodules +3 -0
  3. data/Gemfile +4 -0
  4. data/README.md +76 -0
  5. data/Rakefile +113 -0
  6. data/ext/libv8/extconf.rb +28 -0
  7. data/lib/libv8.rb +15 -0
  8. data/lib/libv8/Makefile +30 -0
  9. data/lib/libv8/detect_cpu.rb +27 -0
  10. data/lib/libv8/fpic-on-linux-amd64.patch +13 -0
  11. data/lib/libv8/v8/.gitignore +35 -0
  12. data/lib/libv8/v8/AUTHORS +44 -0
  13. data/lib/libv8/v8/ChangeLog +2839 -0
  14. data/lib/libv8/v8/LICENSE +52 -0
  15. data/lib/libv8/v8/LICENSE.strongtalk +29 -0
  16. data/lib/libv8/v8/LICENSE.v8 +26 -0
  17. data/lib/libv8/v8/LICENSE.valgrind +45 -0
  18. data/lib/libv8/v8/SConstruct +1478 -0
  19. data/lib/libv8/v8/build/README.txt +49 -0
  20. data/lib/libv8/v8/build/all.gyp +18 -0
  21. data/lib/libv8/v8/build/armu.gypi +32 -0
  22. data/lib/libv8/v8/build/common.gypi +144 -0
  23. data/lib/libv8/v8/build/gyp_v8 +145 -0
  24. data/lib/libv8/v8/include/v8-debug.h +395 -0
  25. data/lib/libv8/v8/include/v8-preparser.h +117 -0
  26. data/lib/libv8/v8/include/v8-profiler.h +505 -0
  27. data/lib/libv8/v8/include/v8-testing.h +104 -0
  28. data/lib/libv8/v8/include/v8.h +4124 -0
  29. data/lib/libv8/v8/include/v8stdint.h +53 -0
  30. data/lib/libv8/v8/preparser/SConscript +38 -0
  31. data/lib/libv8/v8/preparser/preparser-process.cc +379 -0
  32. data/lib/libv8/v8/src/SConscript +368 -0
  33. data/lib/libv8/v8/src/accessors.cc +767 -0
  34. data/lib/libv8/v8/src/accessors.h +123 -0
  35. data/lib/libv8/v8/src/allocation-inl.h +49 -0
  36. data/lib/libv8/v8/src/allocation.cc +122 -0
  37. data/lib/libv8/v8/src/allocation.h +143 -0
  38. data/lib/libv8/v8/src/api.cc +5845 -0
  39. data/lib/libv8/v8/src/api.h +574 -0
  40. data/lib/libv8/v8/src/apinatives.js +110 -0
  41. data/lib/libv8/v8/src/apiutils.h +73 -0
  42. data/lib/libv8/v8/src/arguments.h +118 -0
  43. data/lib/libv8/v8/src/arm/assembler-arm-inl.h +353 -0
  44. data/lib/libv8/v8/src/arm/assembler-arm.cc +2661 -0
  45. data/lib/libv8/v8/src/arm/assembler-arm.h +1375 -0
  46. data/lib/libv8/v8/src/arm/builtins-arm.cc +1658 -0
  47. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +6398 -0
  48. data/lib/libv8/v8/src/arm/code-stubs-arm.h +673 -0
  49. data/lib/libv8/v8/src/arm/codegen-arm.cc +52 -0
  50. data/lib/libv8/v8/src/arm/codegen-arm.h +91 -0
  51. data/lib/libv8/v8/src/arm/constants-arm.cc +152 -0
  52. data/lib/libv8/v8/src/arm/constants-arm.h +775 -0
  53. data/lib/libv8/v8/src/arm/cpu-arm.cc +120 -0
  54. data/lib/libv8/v8/src/arm/debug-arm.cc +317 -0
  55. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +754 -0
  56. data/lib/libv8/v8/src/arm/disasm-arm.cc +1506 -0
  57. data/lib/libv8/v8/src/arm/frames-arm.cc +45 -0
  58. data/lib/libv8/v8/src/arm/frames-arm.h +168 -0
  59. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +4375 -0
  60. data/lib/libv8/v8/src/arm/ic-arm.cc +1562 -0
  61. data/lib/libv8/v8/src/arm/lithium-arm.cc +2206 -0
  62. data/lib/libv8/v8/src/arm/lithium-arm.h +2348 -0
  63. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +4526 -0
  64. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +403 -0
  65. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
  66. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.h +84 -0
  67. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +3163 -0
  68. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +1126 -0
  69. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
  70. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
  71. data/lib/libv8/v8/src/arm/simulator-arm.cc +3424 -0
  72. data/lib/libv8/v8/src/arm/simulator-arm.h +431 -0
  73. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +4243 -0
  74. data/lib/libv8/v8/src/array.js +1366 -0
  75. data/lib/libv8/v8/src/assembler.cc +1207 -0
  76. data/lib/libv8/v8/src/assembler.h +858 -0
  77. data/lib/libv8/v8/src/ast-inl.h +112 -0
  78. data/lib/libv8/v8/src/ast.cc +1146 -0
  79. data/lib/libv8/v8/src/ast.h +2188 -0
  80. data/lib/libv8/v8/src/atomicops.h +167 -0
  81. data/lib/libv8/v8/src/atomicops_internals_arm_gcc.h +145 -0
  82. data/lib/libv8/v8/src/atomicops_internals_mips_gcc.h +169 -0
  83. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.cc +133 -0
  84. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.h +287 -0
  85. data/lib/libv8/v8/src/atomicops_internals_x86_macosx.h +301 -0
  86. data/lib/libv8/v8/src/atomicops_internals_x86_msvc.h +203 -0
  87. data/lib/libv8/v8/src/bignum-dtoa.cc +655 -0
  88. data/lib/libv8/v8/src/bignum-dtoa.h +81 -0
  89. data/lib/libv8/v8/src/bignum.cc +768 -0
  90. data/lib/libv8/v8/src/bignum.h +140 -0
  91. data/lib/libv8/v8/src/bootstrapper.cc +2184 -0
  92. data/lib/libv8/v8/src/bootstrapper.h +188 -0
  93. data/lib/libv8/v8/src/builtins.cc +1707 -0
  94. data/lib/libv8/v8/src/builtins.h +371 -0
  95. data/lib/libv8/v8/src/bytecodes-irregexp.h +105 -0
  96. data/lib/libv8/v8/src/cached-powers.cc +177 -0
  97. data/lib/libv8/v8/src/cached-powers.h +65 -0
  98. data/lib/libv8/v8/src/char-predicates-inl.h +94 -0
  99. data/lib/libv8/v8/src/char-predicates.h +67 -0
  100. data/lib/libv8/v8/src/checks.cc +110 -0
  101. data/lib/libv8/v8/src/checks.h +296 -0
  102. data/lib/libv8/v8/src/circular-queue-inl.h +53 -0
  103. data/lib/libv8/v8/src/circular-queue.cc +122 -0
  104. data/lib/libv8/v8/src/circular-queue.h +103 -0
  105. data/lib/libv8/v8/src/code-stubs.cc +267 -0
  106. data/lib/libv8/v8/src/code-stubs.h +1011 -0
  107. data/lib/libv8/v8/src/code.h +70 -0
  108. data/lib/libv8/v8/src/codegen.cc +231 -0
  109. data/lib/libv8/v8/src/codegen.h +84 -0
  110. data/lib/libv8/v8/src/compilation-cache.cc +540 -0
  111. data/lib/libv8/v8/src/compilation-cache.h +287 -0
  112. data/lib/libv8/v8/src/compiler.cc +786 -0
  113. data/lib/libv8/v8/src/compiler.h +312 -0
  114. data/lib/libv8/v8/src/contexts.cc +347 -0
  115. data/lib/libv8/v8/src/contexts.h +391 -0
  116. data/lib/libv8/v8/src/conversions-inl.h +106 -0
  117. data/lib/libv8/v8/src/conversions.cc +1131 -0
  118. data/lib/libv8/v8/src/conversions.h +135 -0
  119. data/lib/libv8/v8/src/counters.cc +93 -0
  120. data/lib/libv8/v8/src/counters.h +254 -0
  121. data/lib/libv8/v8/src/cpu-profiler-inl.h +101 -0
  122. data/lib/libv8/v8/src/cpu-profiler.cc +609 -0
  123. data/lib/libv8/v8/src/cpu-profiler.h +302 -0
  124. data/lib/libv8/v8/src/cpu.h +69 -0
  125. data/lib/libv8/v8/src/d8-debug.cc +367 -0
  126. data/lib/libv8/v8/src/d8-debug.h +158 -0
  127. data/lib/libv8/v8/src/d8-posix.cc +695 -0
  128. data/lib/libv8/v8/src/d8-readline.cc +130 -0
  129. data/lib/libv8/v8/src/d8-windows.cc +42 -0
  130. data/lib/libv8/v8/src/d8.cc +803 -0
  131. data/lib/libv8/v8/src/d8.gyp +91 -0
  132. data/lib/libv8/v8/src/d8.h +235 -0
  133. data/lib/libv8/v8/src/d8.js +2798 -0
  134. data/lib/libv8/v8/src/data-flow.cc +66 -0
  135. data/lib/libv8/v8/src/data-flow.h +205 -0
  136. data/lib/libv8/v8/src/date.js +1103 -0
  137. data/lib/libv8/v8/src/dateparser-inl.h +127 -0
  138. data/lib/libv8/v8/src/dateparser.cc +178 -0
  139. data/lib/libv8/v8/src/dateparser.h +266 -0
  140. data/lib/libv8/v8/src/debug-agent.cc +447 -0
  141. data/lib/libv8/v8/src/debug-agent.h +129 -0
  142. data/lib/libv8/v8/src/debug-debugger.js +2569 -0
  143. data/lib/libv8/v8/src/debug.cc +3165 -0
  144. data/lib/libv8/v8/src/debug.h +1057 -0
  145. data/lib/libv8/v8/src/deoptimizer.cc +1256 -0
  146. data/lib/libv8/v8/src/deoptimizer.h +602 -0
  147. data/lib/libv8/v8/src/disasm.h +80 -0
  148. data/lib/libv8/v8/src/disassembler.cc +343 -0
  149. data/lib/libv8/v8/src/disassembler.h +58 -0
  150. data/lib/libv8/v8/src/diy-fp.cc +58 -0
  151. data/lib/libv8/v8/src/diy-fp.h +117 -0
  152. data/lib/libv8/v8/src/double.h +238 -0
  153. data/lib/libv8/v8/src/dtoa.cc +103 -0
  154. data/lib/libv8/v8/src/dtoa.h +85 -0
  155. data/lib/libv8/v8/src/execution.cc +849 -0
  156. data/lib/libv8/v8/src/execution.h +297 -0
  157. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +250 -0
  158. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +89 -0
  159. data/lib/libv8/v8/src/extensions/experimental/collator.cc +218 -0
  160. data/lib/libv8/v8/src/extensions/experimental/collator.h +69 -0
  161. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +94 -0
  162. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +78 -0
  163. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +54 -0
  164. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +112 -0
  165. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +60 -0
  166. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +43 -0
  167. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +49 -0
  168. data/lib/libv8/v8/src/extensions/experimental/i18n.js +180 -0
  169. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +251 -0
  170. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +95 -0
  171. data/lib/libv8/v8/src/extensions/externalize-string-extension.cc +141 -0
  172. data/lib/libv8/v8/src/extensions/externalize-string-extension.h +50 -0
  173. data/lib/libv8/v8/src/extensions/gc-extension.cc +58 -0
  174. data/lib/libv8/v8/src/extensions/gc-extension.h +49 -0
  175. data/lib/libv8/v8/src/factory.cc +1222 -0
  176. data/lib/libv8/v8/src/factory.h +442 -0
  177. data/lib/libv8/v8/src/fast-dtoa.cc +736 -0
  178. data/lib/libv8/v8/src/fast-dtoa.h +83 -0
  179. data/lib/libv8/v8/src/fixed-dtoa.cc +405 -0
  180. data/lib/libv8/v8/src/fixed-dtoa.h +55 -0
  181. data/lib/libv8/v8/src/flag-definitions.h +560 -0
  182. data/lib/libv8/v8/src/flags.cc +551 -0
  183. data/lib/libv8/v8/src/flags.h +79 -0
  184. data/lib/libv8/v8/src/frames-inl.h +247 -0
  185. data/lib/libv8/v8/src/frames.cc +1243 -0
  186. data/lib/libv8/v8/src/frames.h +870 -0
  187. data/lib/libv8/v8/src/full-codegen.cc +1374 -0
  188. data/lib/libv8/v8/src/full-codegen.h +771 -0
  189. data/lib/libv8/v8/src/func-name-inferrer.cc +92 -0
  190. data/lib/libv8/v8/src/func-name-inferrer.h +111 -0
  191. data/lib/libv8/v8/src/gdb-jit.cc +1555 -0
  192. data/lib/libv8/v8/src/gdb-jit.h +143 -0
  193. data/lib/libv8/v8/src/global-handles.cc +665 -0
  194. data/lib/libv8/v8/src/global-handles.h +284 -0
  195. data/lib/libv8/v8/src/globals.h +325 -0
  196. data/lib/libv8/v8/src/handles-inl.h +177 -0
  197. data/lib/libv8/v8/src/handles.cc +987 -0
  198. data/lib/libv8/v8/src/handles.h +382 -0
  199. data/lib/libv8/v8/src/hashmap.cc +230 -0
  200. data/lib/libv8/v8/src/hashmap.h +123 -0
  201. data/lib/libv8/v8/src/heap-inl.h +704 -0
  202. data/lib/libv8/v8/src/heap-profiler.cc +1173 -0
  203. data/lib/libv8/v8/src/heap-profiler.h +397 -0
  204. data/lib/libv8/v8/src/heap.cc +5930 -0
  205. data/lib/libv8/v8/src/heap.h +2268 -0
  206. data/lib/libv8/v8/src/hydrogen-instructions.cc +1769 -0
  207. data/lib/libv8/v8/src/hydrogen-instructions.h +3971 -0
  208. data/lib/libv8/v8/src/hydrogen.cc +6239 -0
  209. data/lib/libv8/v8/src/hydrogen.h +1202 -0
  210. data/lib/libv8/v8/src/ia32/assembler-ia32-inl.h +446 -0
  211. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +2487 -0
  212. data/lib/libv8/v8/src/ia32/assembler-ia32.h +1144 -0
  213. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +1621 -0
  214. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +6198 -0
  215. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +517 -0
  216. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +265 -0
  217. data/lib/libv8/v8/src/ia32/codegen-ia32.h +79 -0
  218. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +88 -0
  219. data/lib/libv8/v8/src/ia32/debug-ia32.cc +312 -0
  220. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +774 -0
  221. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +1628 -0
  222. data/lib/libv8/v8/src/ia32/frames-ia32.cc +45 -0
  223. data/lib/libv8/v8/src/ia32/frames-ia32.h +142 -0
  224. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +4338 -0
  225. data/lib/libv8/v8/src/ia32/ic-ia32.cc +1597 -0
  226. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +4461 -0
  227. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +375 -0
  228. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +475 -0
  229. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
  230. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +2261 -0
  231. data/lib/libv8/v8/src/ia32/lithium-ia32.h +2396 -0
  232. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +2136 -0
  233. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +775 -0
  234. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +1263 -0
  235. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
  236. data/lib/libv8/v8/src/ia32/simulator-ia32.cc +30 -0
  237. data/lib/libv8/v8/src/ia32/simulator-ia32.h +74 -0
  238. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +3847 -0
  239. data/lib/libv8/v8/src/ic-inl.h +130 -0
  240. data/lib/libv8/v8/src/ic.cc +2577 -0
  241. data/lib/libv8/v8/src/ic.h +736 -0
  242. data/lib/libv8/v8/src/inspector.cc +63 -0
  243. data/lib/libv8/v8/src/inspector.h +62 -0
  244. data/lib/libv8/v8/src/interpreter-irregexp.cc +659 -0
  245. data/lib/libv8/v8/src/interpreter-irregexp.h +49 -0
  246. data/lib/libv8/v8/src/isolate-inl.h +50 -0
  247. data/lib/libv8/v8/src/isolate.cc +1869 -0
  248. data/lib/libv8/v8/src/isolate.h +1382 -0
  249. data/lib/libv8/v8/src/json-parser.cc +504 -0
  250. data/lib/libv8/v8/src/json-parser.h +161 -0
  251. data/lib/libv8/v8/src/json.js +342 -0
  252. data/lib/libv8/v8/src/jsregexp.cc +5385 -0
  253. data/lib/libv8/v8/src/jsregexp.h +1492 -0
  254. data/lib/libv8/v8/src/list-inl.h +212 -0
  255. data/lib/libv8/v8/src/list.h +174 -0
  256. data/lib/libv8/v8/src/lithium-allocator-inl.h +142 -0
  257. data/lib/libv8/v8/src/lithium-allocator.cc +2123 -0
  258. data/lib/libv8/v8/src/lithium-allocator.h +630 -0
  259. data/lib/libv8/v8/src/lithium.cc +190 -0
  260. data/lib/libv8/v8/src/lithium.h +597 -0
  261. data/lib/libv8/v8/src/liveedit-debugger.js +1082 -0
  262. data/lib/libv8/v8/src/liveedit.cc +1691 -0
  263. data/lib/libv8/v8/src/liveedit.h +180 -0
  264. data/lib/libv8/v8/src/liveobjectlist-inl.h +126 -0
  265. data/lib/libv8/v8/src/liveobjectlist.cc +2589 -0
  266. data/lib/libv8/v8/src/liveobjectlist.h +322 -0
  267. data/lib/libv8/v8/src/log-inl.h +59 -0
  268. data/lib/libv8/v8/src/log-utils.cc +428 -0
  269. data/lib/libv8/v8/src/log-utils.h +231 -0
  270. data/lib/libv8/v8/src/log.cc +1993 -0
  271. data/lib/libv8/v8/src/log.h +476 -0
  272. data/lib/libv8/v8/src/macro-assembler.h +120 -0
  273. data/lib/libv8/v8/src/macros.py +178 -0
  274. data/lib/libv8/v8/src/mark-compact.cc +3143 -0
  275. data/lib/libv8/v8/src/mark-compact.h +506 -0
  276. data/lib/libv8/v8/src/math.js +264 -0
  277. data/lib/libv8/v8/src/messages.cc +179 -0
  278. data/lib/libv8/v8/src/messages.h +113 -0
  279. data/lib/libv8/v8/src/messages.js +1096 -0
  280. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +312 -0
  281. data/lib/libv8/v8/src/mips/assembler-mips.cc +1960 -0
  282. data/lib/libv8/v8/src/mips/assembler-mips.h +1138 -0
  283. data/lib/libv8/v8/src/mips/builtins-mips.cc +1628 -0
  284. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +6656 -0
  285. data/lib/libv8/v8/src/mips/code-stubs-mips.h +682 -0
  286. data/lib/libv8/v8/src/mips/codegen-mips.cc +52 -0
  287. data/lib/libv8/v8/src/mips/codegen-mips.h +98 -0
  288. data/lib/libv8/v8/src/mips/constants-mips.cc +352 -0
  289. data/lib/libv8/v8/src/mips/constants-mips.h +739 -0
  290. data/lib/libv8/v8/src/mips/cpu-mips.cc +96 -0
  291. data/lib/libv8/v8/src/mips/debug-mips.cc +308 -0
  292. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +91 -0
  293. data/lib/libv8/v8/src/mips/disasm-mips.cc +1050 -0
  294. data/lib/libv8/v8/src/mips/frames-mips.cc +47 -0
  295. data/lib/libv8/v8/src/mips/frames-mips.h +219 -0
  296. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +4388 -0
  297. data/lib/libv8/v8/src/mips/ic-mips.cc +1580 -0
  298. data/lib/libv8/v8/src/mips/lithium-codegen-mips.h +65 -0
  299. data/lib/libv8/v8/src/mips/lithium-mips.h +307 -0
  300. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +4056 -0
  301. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +1214 -0
  302. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +1251 -0
  303. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +252 -0
  304. data/lib/libv8/v8/src/mips/simulator-mips.cc +2621 -0
  305. data/lib/libv8/v8/src/mips/simulator-mips.h +401 -0
  306. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +4285 -0
  307. data/lib/libv8/v8/src/mirror-debugger.js +2382 -0
  308. data/lib/libv8/v8/src/mksnapshot.cc +328 -0
  309. data/lib/libv8/v8/src/natives.h +64 -0
  310. data/lib/libv8/v8/src/objects-debug.cc +738 -0
  311. data/lib/libv8/v8/src/objects-inl.h +4323 -0
  312. data/lib/libv8/v8/src/objects-printer.cc +829 -0
  313. data/lib/libv8/v8/src/objects-visiting.cc +148 -0
  314. data/lib/libv8/v8/src/objects-visiting.h +424 -0
  315. data/lib/libv8/v8/src/objects.cc +10585 -0
  316. data/lib/libv8/v8/src/objects.h +6838 -0
  317. data/lib/libv8/v8/src/parser.cc +4997 -0
  318. data/lib/libv8/v8/src/parser.h +765 -0
  319. data/lib/libv8/v8/src/platform-cygwin.cc +779 -0
  320. data/lib/libv8/v8/src/platform-freebsd.cc +826 -0
  321. data/lib/libv8/v8/src/platform-linux.cc +1149 -0
  322. data/lib/libv8/v8/src/platform-macos.cc +830 -0
  323. data/lib/libv8/v8/src/platform-nullos.cc +479 -0
  324. data/lib/libv8/v8/src/platform-openbsd.cc +640 -0
  325. data/lib/libv8/v8/src/platform-posix.cc +424 -0
  326. data/lib/libv8/v8/src/platform-solaris.cc +762 -0
  327. data/lib/libv8/v8/src/platform-tls-mac.h +62 -0
  328. data/lib/libv8/v8/src/platform-tls-win32.h +62 -0
  329. data/lib/libv8/v8/src/platform-tls.h +50 -0
  330. data/lib/libv8/v8/src/platform-win32.cc +2021 -0
  331. data/lib/libv8/v8/src/platform.h +667 -0
  332. data/lib/libv8/v8/src/preparse-data-format.h +62 -0
  333. data/lib/libv8/v8/src/preparse-data.cc +183 -0
  334. data/lib/libv8/v8/src/preparse-data.h +225 -0
  335. data/lib/libv8/v8/src/preparser-api.cc +220 -0
  336. data/lib/libv8/v8/src/preparser.cc +1450 -0
  337. data/lib/libv8/v8/src/preparser.h +493 -0
  338. data/lib/libv8/v8/src/prettyprinter.cc +1493 -0
  339. data/lib/libv8/v8/src/prettyprinter.h +223 -0
  340. data/lib/libv8/v8/src/profile-generator-inl.h +128 -0
  341. data/lib/libv8/v8/src/profile-generator.cc +3098 -0
  342. data/lib/libv8/v8/src/profile-generator.h +1126 -0
  343. data/lib/libv8/v8/src/property.cc +105 -0
  344. data/lib/libv8/v8/src/property.h +365 -0
  345. data/lib/libv8/v8/src/proxy.js +83 -0
  346. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp-inl.h +78 -0
  347. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.cc +471 -0
  348. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.h +142 -0
  349. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.cc +373 -0
  350. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.h +104 -0
  351. data/lib/libv8/v8/src/regexp-macro-assembler.cc +267 -0
  352. data/lib/libv8/v8/src/regexp-macro-assembler.h +243 -0
  353. data/lib/libv8/v8/src/regexp-stack.cc +111 -0
  354. data/lib/libv8/v8/src/regexp-stack.h +147 -0
  355. data/lib/libv8/v8/src/regexp.js +483 -0
  356. data/lib/libv8/v8/src/rewriter.cc +360 -0
  357. data/lib/libv8/v8/src/rewriter.h +50 -0
  358. data/lib/libv8/v8/src/runtime-profiler.cc +489 -0
  359. data/lib/libv8/v8/src/runtime-profiler.h +201 -0
  360. data/lib/libv8/v8/src/runtime.cc +12227 -0
  361. data/lib/libv8/v8/src/runtime.h +652 -0
  362. data/lib/libv8/v8/src/runtime.js +649 -0
  363. data/lib/libv8/v8/src/safepoint-table.cc +256 -0
  364. data/lib/libv8/v8/src/safepoint-table.h +270 -0
  365. data/lib/libv8/v8/src/scanner-base.cc +952 -0
  366. data/lib/libv8/v8/src/scanner-base.h +670 -0
  367. data/lib/libv8/v8/src/scanner.cc +345 -0
  368. data/lib/libv8/v8/src/scanner.h +146 -0
  369. data/lib/libv8/v8/src/scopeinfo.cc +646 -0
  370. data/lib/libv8/v8/src/scopeinfo.h +254 -0
  371. data/lib/libv8/v8/src/scopes.cc +1150 -0
  372. data/lib/libv8/v8/src/scopes.h +507 -0
  373. data/lib/libv8/v8/src/serialize.cc +1574 -0
  374. data/lib/libv8/v8/src/serialize.h +589 -0
  375. data/lib/libv8/v8/src/shell.h +55 -0
  376. data/lib/libv8/v8/src/simulator.h +43 -0
  377. data/lib/libv8/v8/src/small-pointer-list.h +163 -0
  378. data/lib/libv8/v8/src/smart-pointer.h +109 -0
  379. data/lib/libv8/v8/src/snapshot-common.cc +83 -0
  380. data/lib/libv8/v8/src/snapshot-empty.cc +54 -0
  381. data/lib/libv8/v8/src/snapshot.h +91 -0
  382. data/lib/libv8/v8/src/spaces-inl.h +529 -0
  383. data/lib/libv8/v8/src/spaces.cc +3145 -0
  384. data/lib/libv8/v8/src/spaces.h +2369 -0
  385. data/lib/libv8/v8/src/splay-tree-inl.h +310 -0
  386. data/lib/libv8/v8/src/splay-tree.h +205 -0
  387. data/lib/libv8/v8/src/string-search.cc +41 -0
  388. data/lib/libv8/v8/src/string-search.h +568 -0
  389. data/lib/libv8/v8/src/string-stream.cc +592 -0
  390. data/lib/libv8/v8/src/string-stream.h +191 -0
  391. data/lib/libv8/v8/src/string.js +994 -0
  392. data/lib/libv8/v8/src/strtod.cc +440 -0
  393. data/lib/libv8/v8/src/strtod.h +40 -0
  394. data/lib/libv8/v8/src/stub-cache.cc +1965 -0
  395. data/lib/libv8/v8/src/stub-cache.h +924 -0
  396. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +3925 -0
  397. data/lib/libv8/v8/src/token.cc +63 -0
  398. data/lib/libv8/v8/src/token.h +288 -0
  399. data/lib/libv8/v8/src/type-info.cc +507 -0
  400. data/lib/libv8/v8/src/type-info.h +272 -0
  401. data/lib/libv8/v8/src/unbound-queue-inl.h +95 -0
  402. data/lib/libv8/v8/src/unbound-queue.h +69 -0
  403. data/lib/libv8/v8/src/unicode-inl.h +238 -0
  404. data/lib/libv8/v8/src/unicode.cc +1624 -0
  405. data/lib/libv8/v8/src/unicode.h +280 -0
  406. data/lib/libv8/v8/src/uri.js +408 -0
  407. data/lib/libv8/v8/src/utils-inl.h +48 -0
  408. data/lib/libv8/v8/src/utils.cc +371 -0
  409. data/lib/libv8/v8/src/utils.h +800 -0
  410. data/lib/libv8/v8/src/v8-counters.cc +62 -0
  411. data/lib/libv8/v8/src/v8-counters.h +314 -0
  412. data/lib/libv8/v8/src/v8.cc +213 -0
  413. data/lib/libv8/v8/src/v8.h +131 -0
  414. data/lib/libv8/v8/src/v8checks.h +64 -0
  415. data/lib/libv8/v8/src/v8dll-main.cc +44 -0
  416. data/lib/libv8/v8/src/v8globals.h +512 -0
  417. data/lib/libv8/v8/src/v8memory.h +82 -0
  418. data/lib/libv8/v8/src/v8natives.js +1310 -0
  419. data/lib/libv8/v8/src/v8preparserdll-main.cc +39 -0
  420. data/lib/libv8/v8/src/v8threads.cc +464 -0
  421. data/lib/libv8/v8/src/v8threads.h +165 -0
  422. data/lib/libv8/v8/src/v8utils.h +319 -0
  423. data/lib/libv8/v8/src/variables.cc +114 -0
  424. data/lib/libv8/v8/src/variables.h +167 -0
  425. data/lib/libv8/v8/src/version.cc +116 -0
  426. data/lib/libv8/v8/src/version.h +68 -0
  427. data/lib/libv8/v8/src/vm-state-inl.h +138 -0
  428. data/lib/libv8/v8/src/vm-state.h +71 -0
  429. data/lib/libv8/v8/src/win32-headers.h +96 -0
  430. data/lib/libv8/v8/src/x64/assembler-x64-inl.h +462 -0
  431. data/lib/libv8/v8/src/x64/assembler-x64.cc +3027 -0
  432. data/lib/libv8/v8/src/x64/assembler-x64.h +1633 -0
  433. data/lib/libv8/v8/src/x64/builtins-x64.cc +1520 -0
  434. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +5132 -0
  435. data/lib/libv8/v8/src/x64/code-stubs-x64.h +514 -0
  436. data/lib/libv8/v8/src/x64/codegen-x64.cc +146 -0
  437. data/lib/libv8/v8/src/x64/codegen-x64.h +76 -0
  438. data/lib/libv8/v8/src/x64/cpu-x64.cc +88 -0
  439. data/lib/libv8/v8/src/x64/debug-x64.cc +319 -0
  440. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +815 -0
  441. data/lib/libv8/v8/src/x64/disasm-x64.cc +1832 -0
  442. data/lib/libv8/v8/src/x64/frames-x64.cc +45 -0
  443. data/lib/libv8/v8/src/x64/frames-x64.h +130 -0
  444. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +4318 -0
  445. data/lib/libv8/v8/src/x64/ic-x64.cc +1608 -0
  446. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +4267 -0
  447. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +367 -0
  448. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.cc +320 -0
  449. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.h +74 -0
  450. data/lib/libv8/v8/src/x64/lithium-x64.cc +2202 -0
  451. data/lib/libv8/v8/src/x64/lithium-x64.h +2333 -0
  452. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +3745 -0
  453. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +1290 -0
  454. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
  455. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
  456. data/lib/libv8/v8/src/x64/simulator-x64.cc +27 -0
  457. data/lib/libv8/v8/src/x64/simulator-x64.h +72 -0
  458. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +3610 -0
  459. data/lib/libv8/v8/src/zone-inl.h +140 -0
  460. data/lib/libv8/v8/src/zone.cc +196 -0
  461. data/lib/libv8/v8/src/zone.h +240 -0
  462. data/lib/libv8/v8/tools/codemap.js +265 -0
  463. data/lib/libv8/v8/tools/consarray.js +93 -0
  464. data/lib/libv8/v8/tools/csvparser.js +78 -0
  465. data/lib/libv8/v8/tools/disasm.py +92 -0
  466. data/lib/libv8/v8/tools/freebsd-tick-processor +10 -0
  467. data/lib/libv8/v8/tools/gc-nvp-trace-processor.py +342 -0
  468. data/lib/libv8/v8/tools/gcmole/README +62 -0
  469. data/lib/libv8/v8/tools/gcmole/gccause.lua +60 -0
  470. data/lib/libv8/v8/tools/gcmole/gcmole.cc +1261 -0
  471. data/lib/libv8/v8/tools/gcmole/gcmole.lua +378 -0
  472. data/lib/libv8/v8/tools/generate-ten-powers.scm +286 -0
  473. data/lib/libv8/v8/tools/grokdump.py +841 -0
  474. data/lib/libv8/v8/tools/gyp/v8.gyp +995 -0
  475. data/lib/libv8/v8/tools/js2c.py +364 -0
  476. data/lib/libv8/v8/tools/jsmin.py +280 -0
  477. data/lib/libv8/v8/tools/linux-tick-processor +35 -0
  478. data/lib/libv8/v8/tools/ll_prof.py +942 -0
  479. data/lib/libv8/v8/tools/logreader.js +185 -0
  480. data/lib/libv8/v8/tools/mac-nm +18 -0
  481. data/lib/libv8/v8/tools/mac-tick-processor +6 -0
  482. data/lib/libv8/v8/tools/oom_dump/README +31 -0
  483. data/lib/libv8/v8/tools/oom_dump/SConstruct +42 -0
  484. data/lib/libv8/v8/tools/oom_dump/oom_dump.cc +288 -0
  485. data/lib/libv8/v8/tools/presubmit.py +305 -0
  486. data/lib/libv8/v8/tools/process-heap-prof.py +120 -0
  487. data/lib/libv8/v8/tools/profile.js +751 -0
  488. data/lib/libv8/v8/tools/profile_view.js +219 -0
  489. data/lib/libv8/v8/tools/run-valgrind.py +77 -0
  490. data/lib/libv8/v8/tools/splaytree.js +316 -0
  491. data/lib/libv8/v8/tools/stats-viewer.py +468 -0
  492. data/lib/libv8/v8/tools/test.py +1510 -0
  493. data/lib/libv8/v8/tools/tickprocessor-driver.js +59 -0
  494. data/lib/libv8/v8/tools/tickprocessor.js +877 -0
  495. data/lib/libv8/v8/tools/utils.py +96 -0
  496. data/lib/libv8/v8/tools/visual_studio/README.txt +12 -0
  497. data/lib/libv8/v8/tools/windows-tick-processor.bat +30 -0
  498. data/lib/libv8/version.rb +5 -0
  499. data/libv8.gemspec +36 -0
  500. metadata +578 -0
@@ -0,0 +1,1082 @@
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
+ // LiveEdit feature implementation. The script should be executed after
29
+ // debug-debugger.js.
30
+
31
+ // A LiveEdit namespace. It contains functions that modifies JavaScript code
32
+ // according to changes of script source (if possible).
33
+ //
34
+ // When new script source is put in, the difference is calculated textually,
35
+ // in form of list of delete/add/change chunks. The functions that include
36
+ // change chunk(s) get recompiled, or their enclosing functions are
37
+ // recompiled instead.
38
+ // If the function may not be recompiled (e.g. it was completely erased in new
39
+ // version of the script) it remains unchanged, but the code that could
40
+ // create a new instance of this function goes away. An old version of script
41
+ // is created to back up this obsolete function.
42
+ // All unchanged functions have their positions updated accordingly.
43
+ //
44
+ // LiveEdit namespace is declared inside a single function constructor.
45
+ Debug.LiveEdit = new function() {
46
+
47
+ // Forward declaration for minifier.
48
+ var FunctionStatus;
49
+
50
+ // Applies the change to the script.
51
+ // The change is in form of list of chunks encoded in a single array as
52
+ // a series of triplets (pos1_start, pos1_end, pos2_end)
53
+ function ApplyPatchMultiChunk(script, diff_array, new_source, preview_only,
54
+ change_log) {
55
+
56
+ var old_source = script.source;
57
+
58
+ // Gather compile information about old version of script.
59
+ var old_compile_info = GatherCompileInfo(old_source, script);
60
+
61
+ // Build tree structures for old and new versions of the script.
62
+ var root_old_node = BuildCodeInfoTree(old_compile_info);
63
+
64
+ var pos_translator = new PosTranslator(diff_array);
65
+
66
+ // Analyze changes.
67
+ MarkChangedFunctions(root_old_node, pos_translator.GetChunks());
68
+
69
+ // Find all SharedFunctionInfo's that were compiled from this script.
70
+ FindLiveSharedInfos(root_old_node, script);
71
+
72
+ // Gather compile information about new version of script.
73
+ var new_compile_info;
74
+ try {
75
+ new_compile_info = GatherCompileInfo(new_source, script);
76
+ } catch (e) {
77
+ throw new Failure("Failed to compile new version of script: " + e);
78
+ }
79
+ var root_new_node = BuildCodeInfoTree(new_compile_info);
80
+
81
+ // Link recompiled script data with other data.
82
+ FindCorrespondingFunctions(root_old_node, root_new_node);
83
+
84
+ // Prepare to-do lists.
85
+ var replace_code_list = new Array();
86
+ var link_to_old_script_list = new Array();
87
+ var link_to_original_script_list = new Array();
88
+ var update_positions_list = new Array();
89
+
90
+ function HarvestTodo(old_node) {
91
+ function CollectDamaged(node) {
92
+ link_to_old_script_list.push(node);
93
+ for (var i = 0; i < node.children.length; i++) {
94
+ CollectDamaged(node.children[i]);
95
+ }
96
+ }
97
+
98
+ // Recursively collects all newly compiled functions that are going into
99
+ // business and should have link to the actual script updated.
100
+ function CollectNew(node_list) {
101
+ for (var i = 0; i < node_list.length; i++) {
102
+ link_to_original_script_list.push(node_list[i]);
103
+ CollectNew(node_list[i].children);
104
+ }
105
+ }
106
+
107
+ if (old_node.status == FunctionStatus.DAMAGED) {
108
+ CollectDamaged(old_node);
109
+ return;
110
+ }
111
+ if (old_node.status == FunctionStatus.UNCHANGED) {
112
+ update_positions_list.push(old_node);
113
+ } else if (old_node.status == FunctionStatus.SOURCE_CHANGED) {
114
+ update_positions_list.push(old_node);
115
+ } else if (old_node.status == FunctionStatus.CHANGED) {
116
+ replace_code_list.push(old_node);
117
+ CollectNew(old_node.unmatched_new_nodes);
118
+ }
119
+ for (var i = 0; i < old_node.children.length; i++) {
120
+ HarvestTodo(old_node.children[i]);
121
+ }
122
+ }
123
+
124
+ var preview_description = {
125
+ change_tree: DescribeChangeTree(root_old_node),
126
+ textual_diff: {
127
+ old_len: old_source.length,
128
+ new_len: new_source.length,
129
+ chunks: diff_array
130
+ },
131
+ updated: false
132
+ };
133
+
134
+ if (preview_only) {
135
+ return preview_description;
136
+ }
137
+
138
+ HarvestTodo(root_old_node);
139
+
140
+ // Collect shared infos for functions whose code need to be patched.
141
+ var replaced_function_infos = new Array();
142
+ for (var i = 0; i < replace_code_list.length; i++) {
143
+ var live_shared_function_infos =
144
+ replace_code_list[i].live_shared_function_infos;
145
+
146
+ if (live_shared_function_infos) {
147
+ for (var j = 0; j < live_shared_function_infos.length; j++) {
148
+ replaced_function_infos.push(live_shared_function_infos[j]);
149
+ }
150
+ }
151
+ }
152
+
153
+ // We haven't changed anything before this line yet.
154
+ // Committing all changes.
155
+
156
+ // Check that function being patched is not currently on stack or drop them.
157
+ var dropped_functions_number =
158
+ CheckStackActivations(replaced_function_infos, change_log);
159
+
160
+ preview_description.stack_modified = dropped_functions_number != 0;
161
+
162
+ // Start with breakpoints. Convert their line/column positions and
163
+ // temporary remove.
164
+ var break_points_restorer = TemporaryRemoveBreakPoints(script, change_log);
165
+
166
+ var old_script;
167
+
168
+ // Create an old script only if there are function that should be linked
169
+ // to old version.
170
+ if (link_to_old_script_list.length == 0) {
171
+ %LiveEditReplaceScript(script, new_source, null);
172
+ old_script = void 0;
173
+ } else {
174
+ var old_script_name = CreateNameForOldScript(script);
175
+
176
+ // Update the script text and create a new script representing an old
177
+ // version of the script.
178
+ old_script = %LiveEditReplaceScript(script, new_source,
179
+ old_script_name);
180
+
181
+ var link_to_old_script_report = new Array();
182
+ change_log.push( { linked_to_old_script: link_to_old_script_report } );
183
+
184
+ // We need to link to old script all former nested functions.
185
+ for (var i = 0; i < link_to_old_script_list.length; i++) {
186
+ LinkToOldScript(link_to_old_script_list[i], old_script,
187
+ link_to_old_script_report);
188
+ }
189
+
190
+ preview_description.created_script_name = old_script_name;
191
+ }
192
+
193
+ // Link to an actual script all the functions that we are going to use.
194
+ for (var i = 0; i < link_to_original_script_list.length; i++) {
195
+ %LiveEditFunctionSetScript(
196
+ link_to_original_script_list[i].info.shared_function_info, script);
197
+ }
198
+
199
+ for (var i = 0; i < replace_code_list.length; i++) {
200
+ PatchFunctionCode(replace_code_list[i], change_log);
201
+ }
202
+
203
+ var position_patch_report = new Array();
204
+ change_log.push( {position_patched: position_patch_report} );
205
+
206
+ for (var i = 0; i < update_positions_list.length; i++) {
207
+ // TODO(LiveEdit): take into account wether it's source_changed or
208
+ // unchanged and whether positions changed at all.
209
+ PatchPositions(update_positions_list[i], diff_array,
210
+ position_patch_report);
211
+
212
+ if (update_positions_list[i].live_shared_function_infos) {
213
+ update_positions_list[i].live_shared_function_infos.
214
+ forEach(function (info) {
215
+ %LiveEditFunctionSourceUpdated(info.raw_array);
216
+ });
217
+ }
218
+ }
219
+
220
+ break_points_restorer(pos_translator, old_script);
221
+
222
+ preview_description.updated = true;
223
+ return preview_description;
224
+ }
225
+ // Function is public.
226
+ this.ApplyPatchMultiChunk = ApplyPatchMultiChunk;
227
+
228
+
229
+ // Fully compiles source string as a script. Returns Array of
230
+ // FunctionCompileInfo -- a descriptions of all functions of the script.
231
+ // Elements of array are ordered by start positions of functions (from top
232
+ // to bottom) in the source. Fields outer_index and next_sibling_index help
233
+ // to navigate the nesting structure of functions.
234
+ //
235
+ // All functions get compiled linked to script provided as parameter script.
236
+ // TODO(LiveEdit): consider not using actual scripts as script, because
237
+ // we have to manually erase all links right after compile.
238
+ function GatherCompileInfo(source, script) {
239
+ // Get function info, elements are partially sorted (it is a tree of
240
+ // nested functions serialized as parent followed by serialized children.
241
+ var raw_compile_info = %LiveEditGatherCompileInfo(script, source);
242
+
243
+ // Sort function infos by start position field.
244
+ var compile_info = new Array();
245
+ var old_index_map = new Array();
246
+ for (var i = 0; i < raw_compile_info.length; i++) {
247
+ var info = new FunctionCompileInfo(raw_compile_info[i]);
248
+ // Remove all links to the actual script. Breakpoints system and
249
+ // LiveEdit itself believe that any function in heap that points to a
250
+ // particular script is a regular function.
251
+ // For some functions we will restore this link later.
252
+ %LiveEditFunctionSetScript(info.shared_function_info, void 0);
253
+ compile_info.push(info);
254
+ old_index_map.push(i);
255
+ }
256
+
257
+ for (var i = 0; i < compile_info.length; i++) {
258
+ var k = i;
259
+ for (var j = i + 1; j < compile_info.length; j++) {
260
+ if (compile_info[k].start_position > compile_info[j].start_position) {
261
+ k = j;
262
+ }
263
+ }
264
+ if (k != i) {
265
+ var temp_info = compile_info[k];
266
+ var temp_index = old_index_map[k];
267
+ compile_info[k] = compile_info[i];
268
+ old_index_map[k] = old_index_map[i];
269
+ compile_info[i] = temp_info;
270
+ old_index_map[i] = temp_index;
271
+ }
272
+ }
273
+
274
+ // After sorting update outer_inder field using old_index_map. Also
275
+ // set next_sibling_index field.
276
+ var current_index = 0;
277
+
278
+ // The recursive function, that goes over all children of a particular
279
+ // node (i.e. function info).
280
+ function ResetIndexes(new_parent_index, old_parent_index) {
281
+ var previous_sibling = -1;
282
+ while (current_index < compile_info.length &&
283
+ compile_info[current_index].outer_index == old_parent_index) {
284
+ var saved_index = current_index;
285
+ compile_info[saved_index].outer_index = new_parent_index;
286
+ if (previous_sibling != -1) {
287
+ compile_info[previous_sibling].next_sibling_index = saved_index;
288
+ }
289
+ previous_sibling = saved_index;
290
+ current_index++;
291
+ ResetIndexes(saved_index, old_index_map[saved_index]);
292
+ }
293
+ if (previous_sibling != -1) {
294
+ compile_info[previous_sibling].next_sibling_index = -1;
295
+ }
296
+ }
297
+
298
+ ResetIndexes(-1, -1);
299
+ Assert(current_index == compile_info.length);
300
+
301
+ return compile_info;
302
+ }
303
+
304
+
305
+ // Replaces function's Code.
306
+ function PatchFunctionCode(old_node, change_log) {
307
+ var new_info = old_node.corresponding_node.info;
308
+ if (old_node.live_shared_function_infos) {
309
+ old_node.live_shared_function_infos.forEach(function (old_info) {
310
+ %LiveEditReplaceFunctionCode(new_info.raw_array,
311
+ old_info.raw_array);
312
+
313
+ // The function got a new code. However, this new code brings all new
314
+ // instances of SharedFunctionInfo for nested functions. However,
315
+ // we want the original instances to be used wherever possible.
316
+ // (This is because old instances and new instances will be both
317
+ // linked to a script and breakpoints subsystem does not really
318
+ // expects this; neither does LiveEdit subsystem on next call).
319
+ for (var i = 0; i < old_node.children.length; i++) {
320
+ if (old_node.children[i].corresponding_node) {
321
+ var corresponding_child_info =
322
+ old_node.children[i].corresponding_node.info.
323
+ shared_function_info;
324
+
325
+ if (old_node.children[i].live_shared_function_infos) {
326
+ old_node.children[i].live_shared_function_infos.
327
+ forEach(function (old_child_info) {
328
+ %LiveEditReplaceRefToNestedFunction(old_info.info,
329
+ corresponding_child_info,
330
+ old_child_info.info);
331
+ });
332
+ }
333
+ }
334
+ }
335
+ });
336
+
337
+ change_log.push( {function_patched: new_info.function_name} );
338
+ } else {
339
+ change_log.push( {function_patched: new_info.function_name,
340
+ function_info_not_found: true} );
341
+ }
342
+ }
343
+
344
+
345
+ // Makes a function associated with another instance of a script (the
346
+ // one representing its old version). This way the function still
347
+ // may access its own text.
348
+ function LinkToOldScript(old_info_node, old_script, report_array) {
349
+ if (old_info_node.live_shared_function_infos) {
350
+ old_info_node.live_shared_function_infos.
351
+ forEach(function (info) {
352
+ %LiveEditFunctionSetScript(info.info, old_script);
353
+ });
354
+
355
+ report_array.push( { name: old_info_node.info.function_name } );
356
+ } else {
357
+ report_array.push(
358
+ { name: old_info_node.info.function_name, not_found: true } );
359
+ }
360
+ }
361
+
362
+
363
+ // Returns function that restores breakpoints.
364
+ function TemporaryRemoveBreakPoints(original_script, change_log) {
365
+ var script_break_points = GetScriptBreakPoints(original_script);
366
+
367
+ var break_points_update_report = [];
368
+ change_log.push( { break_points_update: break_points_update_report } );
369
+
370
+ var break_point_old_positions = [];
371
+ for (var i = 0; i < script_break_points.length; i++) {
372
+ var break_point = script_break_points[i];
373
+
374
+ break_point.clear();
375
+
376
+ // TODO(LiveEdit): be careful with resource offset here.
377
+ var break_point_position = Debug.findScriptSourcePosition(original_script,
378
+ break_point.line(), break_point.column());
379
+
380
+ var old_position_description = {
381
+ position: break_point_position,
382
+ line: break_point.line(),
383
+ column: break_point.column()
384
+ }
385
+ break_point_old_positions.push(old_position_description);
386
+ }
387
+
388
+
389
+ // Restores breakpoints and creates their copies in the "old" copy of
390
+ // the script.
391
+ return function (pos_translator, old_script_copy_opt) {
392
+ // Update breakpoints (change positions and restore them in old version
393
+ // of script.
394
+ for (var i = 0; i < script_break_points.length; i++) {
395
+ var break_point = script_break_points[i];
396
+ if (old_script_copy_opt) {
397
+ var clone = break_point.cloneForOtherScript(old_script_copy_opt);
398
+ clone.set(old_script_copy_opt);
399
+
400
+ break_points_update_report.push( {
401
+ type: "copied_to_old",
402
+ id: break_point.number(),
403
+ new_id: clone.number(),
404
+ positions: break_point_old_positions[i]
405
+ } );
406
+ }
407
+
408
+ var updated_position = pos_translator.Translate(
409
+ break_point_old_positions[i].position,
410
+ PosTranslator.ShiftWithTopInsideChunkHandler);
411
+
412
+ var new_location =
413
+ original_script.locationFromPosition(updated_position, false);
414
+
415
+ break_point.update_positions(new_location.line, new_location.column);
416
+
417
+ var new_position_description = {
418
+ position: updated_position,
419
+ line: new_location.line,
420
+ column: new_location.column
421
+ }
422
+
423
+ break_point.set(original_script);
424
+
425
+ break_points_update_report.push( { type: "position_changed",
426
+ id: break_point.number(),
427
+ old_positions: break_point_old_positions[i],
428
+ new_positions: new_position_description
429
+ } );
430
+ }
431
+ }
432
+ }
433
+
434
+
435
+ function Assert(condition, message) {
436
+ if (!condition) {
437
+ if (message) {
438
+ throw "Assert " + message;
439
+ } else {
440
+ throw "Assert";
441
+ }
442
+ }
443
+ }
444
+
445
+ function DiffChunk(pos1, pos2, len1, len2) {
446
+ this.pos1 = pos1;
447
+ this.pos2 = pos2;
448
+ this.len1 = len1;
449
+ this.len2 = len2;
450
+ }
451
+
452
+ function PosTranslator(diff_array) {
453
+ var chunks = new Array();
454
+ var current_diff = 0;
455
+ for (var i = 0; i < diff_array.length; i += 3) {
456
+ var pos1_begin = diff_array[i];
457
+ var pos2_begin = pos1_begin + current_diff;
458
+ var pos1_end = diff_array[i + 1];
459
+ var pos2_end = diff_array[i + 2];
460
+ chunks.push(new DiffChunk(pos1_begin, pos2_begin, pos1_end - pos1_begin,
461
+ pos2_end - pos2_begin));
462
+ current_diff = pos2_end - pos1_end;
463
+ }
464
+ this.chunks = chunks;
465
+ }
466
+ PosTranslator.prototype.GetChunks = function() {
467
+ return this.chunks;
468
+ }
469
+
470
+ PosTranslator.prototype.Translate = function(pos, inside_chunk_handler) {
471
+ var array = this.chunks;
472
+ if (array.length == 0 || pos < array[0].pos1) {
473
+ return pos;
474
+ }
475
+ var chunk_index1 = 0;
476
+ var chunk_index2 = array.length - 1;
477
+
478
+ while (chunk_index1 < chunk_index2) {
479
+ var middle_index = Math.floor((chunk_index1 + chunk_index2) / 2);
480
+ if (pos < array[middle_index + 1].pos1) {
481
+ chunk_index2 = middle_index;
482
+ } else {
483
+ chunk_index1 = middle_index + 1;
484
+ }
485
+ }
486
+ var chunk = array[chunk_index1];
487
+ if (pos >= chunk.pos1 + chunk.len1) {
488
+ return pos + chunk.pos2 + chunk.len2 - chunk.pos1 - chunk.len1;
489
+ }
490
+
491
+ if (!inside_chunk_handler) {
492
+ inside_chunk_handler = PosTranslator.DefaultInsideChunkHandler;
493
+ }
494
+ return inside_chunk_handler(pos, chunk);
495
+ }
496
+
497
+ PosTranslator.DefaultInsideChunkHandler = function(pos, diff_chunk) {
498
+ Assert(false, "Cannot translate position in changed area");
499
+ }
500
+
501
+ PosTranslator.ShiftWithTopInsideChunkHandler =
502
+ function(pos, diff_chunk) {
503
+ // We carelessly do not check whether we stay inside the chunk after
504
+ // translation.
505
+ return pos - diff_chunk.pos1 + diff_chunk.pos2;
506
+ }
507
+
508
+ var FunctionStatus = {
509
+ // No change to function or its inner functions; however its positions
510
+ // in script may have been shifted.
511
+ UNCHANGED: "unchanged",
512
+ // The code of a function remains unchanged, but something happened inside
513
+ // some inner functions.
514
+ SOURCE_CHANGED: "source changed",
515
+ // The code of a function is changed or some nested function cannot be
516
+ // properly patched so this function must be recompiled.
517
+ CHANGED: "changed",
518
+ // Function is changed but cannot be patched.
519
+ DAMAGED: "damaged"
520
+ }
521
+
522
+ function CodeInfoTreeNode(code_info, children, array_index) {
523
+ this.info = code_info;
524
+ this.children = children;
525
+ // an index in array of compile_info
526
+ this.array_index = array_index;
527
+ this.parent = void 0;
528
+
529
+ this.status = FunctionStatus.UNCHANGED;
530
+ // Status explanation is used for debugging purposes and will be shown
531
+ // in user UI if some explanations are needed.
532
+ this.status_explanation = void 0;
533
+ this.new_start_pos = void 0;
534
+ this.new_end_pos = void 0;
535
+ this.corresponding_node = void 0;
536
+ this.unmatched_new_nodes = void 0;
537
+
538
+ // 'Textual' correspondence/matching is weaker than 'pure'
539
+ // correspondence/matching. We need 'textual' level for visual presentation
540
+ // in UI, we use 'pure' level for actual code manipulation.
541
+ // Sometimes only function body is changed (functions in old and new script
542
+ // textually correspond), but we cannot patch the code, so we see them
543
+ // as an old function deleted and new function created.
544
+ this.textual_corresponding_node = void 0;
545
+ this.textually_unmatched_new_nodes = void 0;
546
+
547
+ this.live_shared_function_infos = void 0;
548
+ }
549
+
550
+ // From array of function infos that is implicitly a tree creates
551
+ // an actual tree of functions in script.
552
+ function BuildCodeInfoTree(code_info_array) {
553
+ // Throughtout all function we iterate over input array.
554
+ var index = 0;
555
+
556
+ // Recursive function that builds a branch of tree.
557
+ function BuildNode() {
558
+ var my_index = index;
559
+ index++;
560
+ var child_array = new Array();
561
+ while (index < code_info_array.length &&
562
+ code_info_array[index].outer_index == my_index) {
563
+ child_array.push(BuildNode());
564
+ }
565
+ var node = new CodeInfoTreeNode(code_info_array[my_index], child_array,
566
+ my_index);
567
+ for (var i = 0; i < child_array.length; i++) {
568
+ child_array[i].parent = node;
569
+ }
570
+ return node;
571
+ }
572
+
573
+ var root = BuildNode();
574
+ Assert(index == code_info_array.length);
575
+ return root;
576
+ }
577
+
578
+ // Applies a list of the textual diff chunks onto the tree of functions.
579
+ // Determines status of each function (from unchanged to damaged). However
580
+ // children of unchanged functions are ignored.
581
+ function MarkChangedFunctions(code_info_tree, chunks) {
582
+
583
+ // A convenient interator over diff chunks that also translates
584
+ // positions from old to new in a current non-changed part of script.
585
+ var chunk_it = new function() {
586
+ var chunk_index = 0;
587
+ var pos_diff = 0;
588
+ this.current = function() { return chunks[chunk_index]; }
589
+ this.next = function() {
590
+ var chunk = chunks[chunk_index];
591
+ pos_diff = chunk.pos2 + chunk.len2 - (chunk.pos1 + chunk.len1);
592
+ chunk_index++;
593
+ }
594
+ this.done = function() { return chunk_index >= chunks.length; }
595
+ this.TranslatePos = function(pos) { return pos + pos_diff; }
596
+ };
597
+
598
+ // A recursive function that processes internals of a function and all its
599
+ // inner functions. Iterator chunk_it initially points to a chunk that is
600
+ // below function start.
601
+ function ProcessInternals(info_node) {
602
+ info_node.new_start_pos = chunk_it.TranslatePos(
603
+ info_node.info.start_position);
604
+ var child_index = 0;
605
+ var code_changed = false;
606
+ var source_changed = false;
607
+ // Simultaneously iterates over child functions and over chunks.
608
+ while (!chunk_it.done() &&
609
+ chunk_it.current().pos1 < info_node.info.end_position) {
610
+ if (child_index < info_node.children.length) {
611
+ var child = info_node.children[child_index];
612
+
613
+ if (child.info.end_position <= chunk_it.current().pos1) {
614
+ ProcessUnchangedChild(child);
615
+ child_index++;
616
+ continue;
617
+ } else if (child.info.start_position >=
618
+ chunk_it.current().pos1 + chunk_it.current().len1) {
619
+ code_changed = true;
620
+ chunk_it.next();
621
+ continue;
622
+ } else if (child.info.start_position <= chunk_it.current().pos1 &&
623
+ child.info.end_position >= chunk_it.current().pos1 +
624
+ chunk_it.current().len1) {
625
+ ProcessInternals(child);
626
+ source_changed = source_changed ||
627
+ ( child.status != FunctionStatus.UNCHANGED );
628
+ code_changed = code_changed ||
629
+ ( child.status == FunctionStatus.DAMAGED );
630
+ child_index++;
631
+ continue;
632
+ } else {
633
+ code_changed = true;
634
+ child.status = FunctionStatus.DAMAGED;
635
+ child.status_explanation =
636
+ "Text diff overlaps with function boundary";
637
+ child_index++;
638
+ continue;
639
+ }
640
+ } else {
641
+ if (chunk_it.current().pos1 + chunk_it.current().len1 <=
642
+ info_node.info.end_position) {
643
+ info_node.status = FunctionStatus.CHANGED;
644
+ chunk_it.next();
645
+ continue;
646
+ } else {
647
+ info_node.status = FunctionStatus.DAMAGED;
648
+ info_node.status_explanation =
649
+ "Text diff overlaps with function boundary";
650
+ return;
651
+ }
652
+ }
653
+ Assert("Unreachable", false);
654
+ }
655
+ while (child_index < info_node.children.length) {
656
+ var child = info_node.children[child_index];
657
+ ProcessUnchangedChild(child);
658
+ child_index++;
659
+ }
660
+ if (code_changed) {
661
+ info_node.status = FunctionStatus.CHANGED;
662
+ } else if (source_changed) {
663
+ info_node.status = FunctionStatus.SOURCE_CHANGED;
664
+ }
665
+ info_node.new_end_pos =
666
+ chunk_it.TranslatePos(info_node.info.end_position);
667
+ }
668
+
669
+ function ProcessUnchangedChild(node) {
670
+ node.new_start_pos = chunk_it.TranslatePos(node.info.start_position);
671
+ node.new_end_pos = chunk_it.TranslatePos(node.info.end_position);
672
+ }
673
+
674
+ ProcessInternals(code_info_tree);
675
+ }
676
+
677
+ // For ecah old function (if it is not damaged) tries to find a corresponding
678
+ // function in new script. Typically it should succeed (non-damaged functions
679
+ // by definition may only have changes inside their bodies). However there are
680
+ // reasons for corresponence not to be found; function with unmodified text
681
+ // in new script may become enclosed into other function; the innocent change
682
+ // inside function body may in fact be something like "} function B() {" that
683
+ // splits a function into 2 functions.
684
+ function FindCorrespondingFunctions(old_code_tree, new_code_tree) {
685
+
686
+ // A recursive function that tries to find a correspondence for all
687
+ // child functions and for their inner functions.
688
+ function ProcessChildren(old_node, new_node) {
689
+ var old_children = old_node.children;
690
+ var new_children = new_node.children;
691
+
692
+ var unmatched_new_nodes_list = [];
693
+ var textually_unmatched_new_nodes_list = [];
694
+
695
+ var old_index = 0;
696
+ var new_index = 0;
697
+ while (old_index < old_children.length) {
698
+ if (old_children[old_index].status == FunctionStatus.DAMAGED) {
699
+ old_index++;
700
+ } else if (new_index < new_children.length) {
701
+ if (new_children[new_index].info.start_position <
702
+ old_children[old_index].new_start_pos) {
703
+ unmatched_new_nodes_list.push(new_children[new_index]);
704
+ textually_unmatched_new_nodes_list.push(new_children[new_index]);
705
+ new_index++;
706
+ } else if (new_children[new_index].info.start_position ==
707
+ old_children[old_index].new_start_pos) {
708
+ if (new_children[new_index].info.end_position ==
709
+ old_children[old_index].new_end_pos) {
710
+ old_children[old_index].corresponding_node =
711
+ new_children[new_index];
712
+ old_children[old_index].textual_corresponding_node =
713
+ new_children[new_index];
714
+ if (old_children[old_index].status != FunctionStatus.UNCHANGED) {
715
+ ProcessChildren(old_children[old_index],
716
+ new_children[new_index]);
717
+ if (old_children[old_index].status == FunctionStatus.DAMAGED) {
718
+ unmatched_new_nodes_list.push(
719
+ old_children[old_index].corresponding_node);
720
+ old_children[old_index].corresponding_node = void 0;
721
+ old_node.status = FunctionStatus.CHANGED;
722
+ }
723
+ }
724
+ } else {
725
+ old_children[old_index].status = FunctionStatus.DAMAGED;
726
+ old_children[old_index].status_explanation =
727
+ "No corresponding function in new script found";
728
+ old_node.status = FunctionStatus.CHANGED;
729
+ unmatched_new_nodes_list.push(new_children[new_index]);
730
+ textually_unmatched_new_nodes_list.push(new_children[new_index]);
731
+ }
732
+ new_index++;
733
+ old_index++;
734
+ } else {
735
+ old_children[old_index].status = FunctionStatus.DAMAGED;
736
+ old_children[old_index].status_explanation =
737
+ "No corresponding function in new script found";
738
+ old_node.status = FunctionStatus.CHANGED;
739
+ old_index++;
740
+ }
741
+ } else {
742
+ old_children[old_index].status = FunctionStatus.DAMAGED;
743
+ old_children[old_index].status_explanation =
744
+ "No corresponding function in new script found";
745
+ old_node.status = FunctionStatus.CHANGED;
746
+ old_index++;
747
+ }
748
+ }
749
+
750
+ while (new_index < new_children.length) {
751
+ unmatched_new_nodes_list.push(new_children[new_index]);
752
+ textually_unmatched_new_nodes_list.push(new_children[new_index]);
753
+ new_index++;
754
+ }
755
+
756
+ if (old_node.status == FunctionStatus.CHANGED) {
757
+ var why_wrong_expectations =
758
+ WhyFunctionExpectationsDiffer(old_node.info, new_node.info);
759
+ if (why_wrong_expectations) {
760
+ old_node.status = FunctionStatus.DAMAGED;
761
+ old_node.status_explanation = why_wrong_expectations;
762
+ }
763
+ }
764
+ old_node.unmatched_new_nodes = unmatched_new_nodes_list;
765
+ old_node.textually_unmatched_new_nodes =
766
+ textually_unmatched_new_nodes_list;
767
+ }
768
+
769
+ ProcessChildren(old_code_tree, new_code_tree);
770
+
771
+ old_code_tree.corresponding_node = new_code_tree;
772
+ old_code_tree.textual_corresponding_node = new_code_tree;
773
+
774
+ Assert(old_code_tree.status != FunctionStatus.DAMAGED,
775
+ "Script became damaged");
776
+ }
777
+
778
+ function FindLiveSharedInfos(old_code_tree, script) {
779
+ var shared_raw_list = %LiveEditFindSharedFunctionInfosForScript(script);
780
+
781
+ var shared_infos = new Array();
782
+
783
+ for (var i = 0; i < shared_raw_list.length; i++) {
784
+ shared_infos.push(new SharedInfoWrapper(shared_raw_list[i]));
785
+ }
786
+
787
+ // Finds all SharedFunctionInfos that corresponds to compile info
788
+ // in old version of the script.
789
+ function FindFunctionInfos(compile_info) {
790
+ var wrappers = [];
791
+
792
+ for (var i = 0; i < shared_infos.length; i++) {
793
+ var wrapper = shared_infos[i];
794
+ if (wrapper.start_position == compile_info.start_position &&
795
+ wrapper.end_position == compile_info.end_position) {
796
+ wrappers.push(wrapper);
797
+ }
798
+ }
799
+
800
+ if (wrappers.length > 0) {
801
+ return wrappers;
802
+ }
803
+ }
804
+
805
+ function TraverseTree(node) {
806
+ node.live_shared_function_infos = FindFunctionInfos(node.info);
807
+
808
+ for (var i = 0; i < node.children.length; i++) {
809
+ TraverseTree(node.children[i]);
810
+ }
811
+ }
812
+
813
+ TraverseTree(old_code_tree);
814
+ }
815
+
816
+
817
+ // An object describing function compilation details. Its index fields
818
+ // apply to indexes inside array that stores these objects.
819
+ function FunctionCompileInfo(raw_array) {
820
+ this.function_name = raw_array[0];
821
+ this.start_position = raw_array[1];
822
+ this.end_position = raw_array[2];
823
+ this.param_num = raw_array[3];
824
+ this.code = raw_array[4];
825
+ this.code_scope_info = raw_array[5];
826
+ this.scope_info = raw_array[6];
827
+ this.outer_index = raw_array[7];
828
+ this.shared_function_info = raw_array[8];
829
+ this.next_sibling_index = null;
830
+ this.raw_array = raw_array;
831
+ }
832
+
833
+ function SharedInfoWrapper(raw_array) {
834
+ this.function_name = raw_array[0];
835
+ this.start_position = raw_array[1];
836
+ this.end_position = raw_array[2];
837
+ this.info = raw_array[3];
838
+ this.raw_array = raw_array;
839
+ }
840
+
841
+ // Changes positions (including all statments) in function.
842
+ function PatchPositions(old_info_node, diff_array, report_array) {
843
+ if (old_info_node.live_shared_function_infos) {
844
+ old_info_node.live_shared_function_infos.forEach(function (info) {
845
+ %LiveEditPatchFunctionPositions(info.raw_array,
846
+ diff_array);
847
+ });
848
+
849
+ report_array.push( { name: old_info_node.info.function_name } );
850
+ } else {
851
+ // TODO(LiveEdit): function is not compiled yet or is already collected.
852
+ report_array.push(
853
+ { name: old_info_node.info.function_name, info_not_found: true } );
854
+ }
855
+ }
856
+
857
+ // Adds a suffix to script name to mark that it is old version.
858
+ function CreateNameForOldScript(script) {
859
+ // TODO(635): try better than this; support several changes.
860
+ return script.name + " (old)";
861
+ }
862
+
863
+ // Compares a function interface old and new version, whether it
864
+ // changed or not. Returns explanation if they differ.
865
+ function WhyFunctionExpectationsDiffer(function_info1, function_info2) {
866
+ // Check that function has the same number of parameters (there may exist
867
+ // an adapter, that won't survive function parameter number change).
868
+ if (function_info1.param_num != function_info2.param_num) {
869
+ return "Changed parameter number: " + function_info1.param_num +
870
+ " and " + function_info2.param_num;
871
+ }
872
+ var scope_info1 = function_info1.scope_info;
873
+ var scope_info2 = function_info2.scope_info;
874
+
875
+ var scope_info1_text;
876
+ var scope_info2_text;
877
+
878
+ if (scope_info1) {
879
+ scope_info1_text = scope_info1.toString();
880
+ } else {
881
+ scope_info1_text = "";
882
+ }
883
+ if (scope_info2) {
884
+ scope_info2_text = scope_info2.toString();
885
+ } else {
886
+ scope_info2_text = "";
887
+ }
888
+
889
+ if (scope_info1_text != scope_info2_text) {
890
+ return "Incompatible variable maps: [" + scope_info1_text +
891
+ "] and [" + scope_info2_text + "]";
892
+ }
893
+ // No differences. Return undefined.
894
+ return;
895
+ }
896
+
897
+ // Minifier forward declaration.
898
+ var FunctionPatchabilityStatus;
899
+
900
+ // For array of wrapped shared function infos checks that none of them
901
+ // have activations on stack (of any thread). Throws a Failure exception
902
+ // if this proves to be false.
903
+ function CheckStackActivations(shared_wrapper_list, change_log) {
904
+ var shared_list = new Array();
905
+ for (var i = 0; i < shared_wrapper_list.length; i++) {
906
+ shared_list[i] = shared_wrapper_list[i].info;
907
+ }
908
+ var result = %LiveEditCheckAndDropActivations(shared_list, true);
909
+ if (result[shared_list.length]) {
910
+ // Extra array element may contain error message.
911
+ throw new Failure(result[shared_list.length]);
912
+ }
913
+
914
+ var problems = new Array();
915
+ var dropped = new Array();
916
+ for (var i = 0; i < shared_list.length; i++) {
917
+ var shared = shared_wrapper_list[i];
918
+ if (result[i] == FunctionPatchabilityStatus.REPLACED_ON_ACTIVE_STACK) {
919
+ dropped.push({ name: shared.function_name } );
920
+ } else if (result[i] != FunctionPatchabilityStatus.AVAILABLE_FOR_PATCH) {
921
+ var description = {
922
+ name: shared.function_name,
923
+ start_pos: shared.start_position,
924
+ end_pos: shared.end_position,
925
+ replace_problem:
926
+ FunctionPatchabilityStatus.SymbolName(result[i])
927
+ };
928
+ problems.push(description);
929
+ }
930
+ }
931
+ if (dropped.length > 0) {
932
+ change_log.push({ dropped_from_stack: dropped });
933
+ }
934
+ if (problems.length > 0) {
935
+ change_log.push( { functions_on_stack: problems } );
936
+ throw new Failure("Blocked by functions on stack");
937
+ }
938
+
939
+ return dropped.length;
940
+ }
941
+
942
+ // A copy of the FunctionPatchabilityStatus enum from liveedit.h
943
+ var FunctionPatchabilityStatus = {
944
+ AVAILABLE_FOR_PATCH: 1,
945
+ BLOCKED_ON_ACTIVE_STACK: 2,
946
+ BLOCKED_ON_OTHER_STACK: 3,
947
+ BLOCKED_UNDER_NATIVE_CODE: 4,
948
+ REPLACED_ON_ACTIVE_STACK: 5
949
+ }
950
+
951
+ FunctionPatchabilityStatus.SymbolName = function(code) {
952
+ var enum = FunctionPatchabilityStatus;
953
+ for (name in enum) {
954
+ if (enum[name] == code) {
955
+ return name;
956
+ }
957
+ }
958
+ }
959
+
960
+
961
+ // A logical failure in liveedit process. This means that change_log
962
+ // is valid and consistent description of what happened.
963
+ function Failure(message) {
964
+ this.message = message;
965
+ }
966
+ // Function (constructor) is public.
967
+ this.Failure = Failure;
968
+
969
+ Failure.prototype.toString = function() {
970
+ return "LiveEdit Failure: " + this.message;
971
+ }
972
+
973
+ // A testing entry.
974
+ function GetPcFromSourcePos(func, source_pos) {
975
+ return %GetFunctionCodePositionFromSource(func, source_pos);
976
+ }
977
+ // Function is public.
978
+ this.GetPcFromSourcePos = GetPcFromSourcePos;
979
+
980
+ // LiveEdit main entry point: changes a script text to a new string.
981
+ function SetScriptSource(script, new_source, preview_only, change_log) {
982
+ var old_source = script.source;
983
+ var diff = CompareStrings(old_source, new_source);
984
+ return ApplyPatchMultiChunk(script, diff, new_source, preview_only,
985
+ change_log);
986
+ }
987
+ // Function is public.
988
+ this.SetScriptSource = SetScriptSource;
989
+
990
+ function CompareStrings(s1, s2) {
991
+ return %LiveEditCompareStrings(s1, s2);
992
+ }
993
+
994
+ // Applies the change to the script.
995
+ // The change is always a substring (change_pos, change_pos + change_len)
996
+ // being replaced with a completely different string new_str.
997
+ // This API is a legacy and is obsolete.
998
+ //
999
+ // @param {Script} script that is being changed
1000
+ // @param {Array} change_log a list that collects engineer-readable
1001
+ // description of what happened.
1002
+ function ApplySingleChunkPatch(script, change_pos, change_len, new_str,
1003
+ change_log) {
1004
+ var old_source = script.source;
1005
+
1006
+ // Prepare new source string.
1007
+ var new_source = old_source.substring(0, change_pos) +
1008
+ new_str + old_source.substring(change_pos + change_len);
1009
+
1010
+ return ApplyPatchMultiChunk(script,
1011
+ [ change_pos, change_pos + change_len, change_pos + new_str.length],
1012
+ new_source, false, change_log);
1013
+ }
1014
+
1015
+ // Creates JSON description for a change tree.
1016
+ function DescribeChangeTree(old_code_tree) {
1017
+
1018
+ function ProcessOldNode(node) {
1019
+ var child_infos = [];
1020
+ for (var i = 0; i < node.children.length; i++) {
1021
+ var child = node.children[i];
1022
+ if (child.status != FunctionStatus.UNCHANGED) {
1023
+ child_infos.push(ProcessOldNode(child));
1024
+ }
1025
+ }
1026
+ var new_child_infos = [];
1027
+ if (node.textually_unmatched_new_nodes) {
1028
+ for (var i = 0; i < node.textually_unmatched_new_nodes.length; i++) {
1029
+ var child = node.textually_unmatched_new_nodes[i];
1030
+ new_child_infos.push(ProcessNewNode(child));
1031
+ }
1032
+ }
1033
+ var res = {
1034
+ name: node.info.function_name,
1035
+ positions: DescribePositions(node),
1036
+ status: node.status,
1037
+ children: child_infos,
1038
+ new_children: new_child_infos
1039
+ };
1040
+ if (node.status_explanation) {
1041
+ res.status_explanation = node.status_explanation;
1042
+ }
1043
+ if (node.textual_corresponding_node) {
1044
+ res.new_positions = DescribePositions(node.textual_corresponding_node);
1045
+ }
1046
+ return res;
1047
+ }
1048
+
1049
+ function ProcessNewNode(node) {
1050
+ var child_infos = [];
1051
+ // Do not list ancestors.
1052
+ if (false) {
1053
+ for (var i = 0; i < node.children.length; i++) {
1054
+ child_infos.push(ProcessNewNode(node.children[i]));
1055
+ }
1056
+ }
1057
+ var res = {
1058
+ name: node.info.function_name,
1059
+ positions: DescribePositions(node),
1060
+ children: child_infos,
1061
+ };
1062
+ return res;
1063
+ }
1064
+
1065
+ function DescribePositions(node) {
1066
+ return {
1067
+ start_position: node.info.start_position,
1068
+ end_position: node.info.end_position
1069
+ };
1070
+ }
1071
+
1072
+ return ProcessOldNode(old_code_tree);
1073
+ }
1074
+
1075
+
1076
+ // Functions are public for tests.
1077
+ this.TestApi = {
1078
+ PosTranslator: PosTranslator,
1079
+ CompareStrings: CompareStrings,
1080
+ ApplySingleChunkPatch: ApplySingleChunkPatch
1081
+ }
1082
+ }