therubyracer 0.4.9-x86-linux

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 (637) hide show
  1. data/.gitignore +11 -0
  2. data/.gitmodules +3 -0
  3. data/Doxyfile +1514 -0
  4. data/History.txt +43 -0
  5. data/README.rdoc +157 -0
  6. data/Rakefile +51 -0
  7. data/docs/data_conversion.txt +18 -0
  8. data/ext/v8/callbacks.cpp +160 -0
  9. data/ext/v8/callbacks.h +14 -0
  10. data/ext/v8/convert_ruby.cpp +8 -0
  11. data/ext/v8/convert_ruby.h +99 -0
  12. data/ext/v8/convert_string.cpp +10 -0
  13. data/ext/v8/convert_string.h +73 -0
  14. data/ext/v8/convert_v8.cpp +9 -0
  15. data/ext/v8/convert_v8.h +121 -0
  16. data/ext/v8/converters.cpp +83 -0
  17. data/ext/v8/converters.h +23 -0
  18. data/ext/v8/extconf.rb +36 -0
  19. data/ext/v8/upstream/2.0.6/.gitignore +26 -0
  20. data/ext/v8/upstream/2.0.6/AUTHORS +23 -0
  21. data/ext/v8/upstream/2.0.6/ChangeLog +1479 -0
  22. data/ext/v8/upstream/2.0.6/LICENSE +55 -0
  23. data/ext/v8/upstream/2.0.6/SConstruct +1028 -0
  24. data/ext/v8/upstream/2.0.6/include/v8-debug.h +275 -0
  25. data/ext/v8/upstream/2.0.6/include/v8.h +3236 -0
  26. data/ext/v8/upstream/2.0.6/src/SConscript +283 -0
  27. data/ext/v8/upstream/2.0.6/src/accessors.cc +695 -0
  28. data/ext/v8/upstream/2.0.6/src/accessors.h +114 -0
  29. data/ext/v8/upstream/2.0.6/src/allocation.cc +198 -0
  30. data/ext/v8/upstream/2.0.6/src/allocation.h +169 -0
  31. data/ext/v8/upstream/2.0.6/src/api.cc +3831 -0
  32. data/ext/v8/upstream/2.0.6/src/api.h +479 -0
  33. data/ext/v8/upstream/2.0.6/src/apinatives.js +110 -0
  34. data/ext/v8/upstream/2.0.6/src/apiutils.h +69 -0
  35. data/ext/v8/upstream/2.0.6/src/arguments.h +97 -0
  36. data/ext/v8/upstream/2.0.6/src/arm/assembler-arm-inl.h +277 -0
  37. data/ext/v8/upstream/2.0.6/src/arm/assembler-arm.cc +1821 -0
  38. data/ext/v8/upstream/2.0.6/src/arm/assembler-arm.h +1027 -0
  39. data/ext/v8/upstream/2.0.6/src/arm/assembler-thumb2-inl.h +267 -0
  40. data/ext/v8/upstream/2.0.6/src/arm/assembler-thumb2.cc +1821 -0
  41. data/ext/v8/upstream/2.0.6/src/arm/assembler-thumb2.h +1027 -0
  42. data/ext/v8/upstream/2.0.6/src/arm/builtins-arm.cc +1271 -0
  43. data/ext/v8/upstream/2.0.6/src/arm/codegen-arm-inl.h +74 -0
  44. data/ext/v8/upstream/2.0.6/src/arm/codegen-arm.cc +6682 -0
  45. data/ext/v8/upstream/2.0.6/src/arm/codegen-arm.h +535 -0
  46. data/ext/v8/upstream/2.0.6/src/arm/constants-arm.cc +112 -0
  47. data/ext/v8/upstream/2.0.6/src/arm/constants-arm.h +347 -0
  48. data/ext/v8/upstream/2.0.6/src/arm/cpu-arm.cc +132 -0
  49. data/ext/v8/upstream/2.0.6/src/arm/debug-arm.cc +213 -0
  50. data/ext/v8/upstream/2.0.6/src/arm/disasm-arm.cc +1166 -0
  51. data/ext/v8/upstream/2.0.6/src/arm/fast-codegen-arm.cc +1698 -0
  52. data/ext/v8/upstream/2.0.6/src/arm/frames-arm.cc +123 -0
  53. data/ext/v8/upstream/2.0.6/src/arm/frames-arm.h +162 -0
  54. data/ext/v8/upstream/2.0.6/src/arm/ic-arm.cc +849 -0
  55. data/ext/v8/upstream/2.0.6/src/arm/jump-target-arm.cc +238 -0
  56. data/ext/v8/upstream/2.0.6/src/arm/macro-assembler-arm.cc +1259 -0
  57. data/ext/v8/upstream/2.0.6/src/arm/macro-assembler-arm.h +423 -0
  58. data/ext/v8/upstream/2.0.6/src/arm/regexp-macro-assembler-arm.cc +1266 -0
  59. data/ext/v8/upstream/2.0.6/src/arm/regexp-macro-assembler-arm.h +282 -0
  60. data/ext/v8/upstream/2.0.6/src/arm/register-allocator-arm-inl.h +103 -0
  61. data/ext/v8/upstream/2.0.6/src/arm/register-allocator-arm.cc +59 -0
  62. data/ext/v8/upstream/2.0.6/src/arm/register-allocator-arm.h +43 -0
  63. data/ext/v8/upstream/2.0.6/src/arm/simulator-arm.cc +2264 -0
  64. data/ext/v8/upstream/2.0.6/src/arm/simulator-arm.h +306 -0
  65. data/ext/v8/upstream/2.0.6/src/arm/stub-cache-arm.cc +1516 -0
  66. data/ext/v8/upstream/2.0.6/src/arm/virtual-frame-arm.cc +412 -0
  67. data/ext/v8/upstream/2.0.6/src/arm/virtual-frame-arm.h +532 -0
  68. data/ext/v8/upstream/2.0.6/src/array.js +1154 -0
  69. data/ext/v8/upstream/2.0.6/src/assembler.cc +772 -0
  70. data/ext/v8/upstream/2.0.6/src/assembler.h +525 -0
  71. data/ext/v8/upstream/2.0.6/src/ast.cc +512 -0
  72. data/ext/v8/upstream/2.0.6/src/ast.h +1820 -0
  73. data/ext/v8/upstream/2.0.6/src/bootstrapper.cc +1680 -0
  74. data/ext/v8/upstream/2.0.6/src/bootstrapper.h +103 -0
  75. data/ext/v8/upstream/2.0.6/src/builtins.cc +851 -0
  76. data/ext/v8/upstream/2.0.6/src/builtins.h +245 -0
  77. data/ext/v8/upstream/2.0.6/src/bytecodes-irregexp.h +104 -0
  78. data/ext/v8/upstream/2.0.6/src/char-predicates-inl.h +86 -0
  79. data/ext/v8/upstream/2.0.6/src/char-predicates.h +65 -0
  80. data/ext/v8/upstream/2.0.6/src/checks.cc +100 -0
  81. data/ext/v8/upstream/2.0.6/src/checks.h +284 -0
  82. data/ext/v8/upstream/2.0.6/src/code-stubs.cc +164 -0
  83. data/ext/v8/upstream/2.0.6/src/code-stubs.h +164 -0
  84. data/ext/v8/upstream/2.0.6/src/code.h +68 -0
  85. data/ext/v8/upstream/2.0.6/src/codegen-inl.h +88 -0
  86. data/ext/v8/upstream/2.0.6/src/codegen.cc +504 -0
  87. data/ext/v8/upstream/2.0.6/src/codegen.h +522 -0
  88. data/ext/v8/upstream/2.0.6/src/compilation-cache.cc +490 -0
  89. data/ext/v8/upstream/2.0.6/src/compilation-cache.h +98 -0
  90. data/ext/v8/upstream/2.0.6/src/compiler.cc +1132 -0
  91. data/ext/v8/upstream/2.0.6/src/compiler.h +107 -0
  92. data/ext/v8/upstream/2.0.6/src/contexts.cc +256 -0
  93. data/ext/v8/upstream/2.0.6/src/contexts.h +345 -0
  94. data/ext/v8/upstream/2.0.6/src/conversions-inl.h +95 -0
  95. data/ext/v8/upstream/2.0.6/src/conversions.cc +709 -0
  96. data/ext/v8/upstream/2.0.6/src/conversions.h +118 -0
  97. data/ext/v8/upstream/2.0.6/src/counters.cc +78 -0
  98. data/ext/v8/upstream/2.0.6/src/counters.h +239 -0
  99. data/ext/v8/upstream/2.0.6/src/cpu.h +65 -0
  100. data/ext/v8/upstream/2.0.6/src/d8-debug.cc +345 -0
  101. data/ext/v8/upstream/2.0.6/src/d8-debug.h +155 -0
  102. data/ext/v8/upstream/2.0.6/src/d8-posix.cc +675 -0
  103. data/ext/v8/upstream/2.0.6/src/d8-readline.cc +128 -0
  104. data/ext/v8/upstream/2.0.6/src/d8-windows.cc +42 -0
  105. data/ext/v8/upstream/2.0.6/src/d8.cc +776 -0
  106. data/ext/v8/upstream/2.0.6/src/d8.h +225 -0
  107. data/ext/v8/upstream/2.0.6/src/d8.js +1625 -0
  108. data/ext/v8/upstream/2.0.6/src/date-delay.js +1138 -0
  109. data/ext/v8/upstream/2.0.6/src/dateparser-inl.h +114 -0
  110. data/ext/v8/upstream/2.0.6/src/dateparser.cc +186 -0
  111. data/ext/v8/upstream/2.0.6/src/dateparser.h +240 -0
  112. data/ext/v8/upstream/2.0.6/src/debug-agent.cc +425 -0
  113. data/ext/v8/upstream/2.0.6/src/debug-agent.h +129 -0
  114. data/ext/v8/upstream/2.0.6/src/debug-delay.js +2073 -0
  115. data/ext/v8/upstream/2.0.6/src/debug.cc +2751 -0
  116. data/ext/v8/upstream/2.0.6/src/debug.h +866 -0
  117. data/ext/v8/upstream/2.0.6/src/disasm.h +77 -0
  118. data/ext/v8/upstream/2.0.6/src/disassembler.cc +318 -0
  119. data/ext/v8/upstream/2.0.6/src/disassembler.h +56 -0
  120. data/ext/v8/upstream/2.0.6/src/dtoa-config.c +91 -0
  121. data/ext/v8/upstream/2.0.6/src/execution.cc +701 -0
  122. data/ext/v8/upstream/2.0.6/src/execution.h +312 -0
  123. data/ext/v8/upstream/2.0.6/src/factory.cc +957 -0
  124. data/ext/v8/upstream/2.0.6/src/factory.h +393 -0
  125. data/ext/v8/upstream/2.0.6/src/fast-codegen.cc +725 -0
  126. data/ext/v8/upstream/2.0.6/src/fast-codegen.h +371 -0
  127. data/ext/v8/upstream/2.0.6/src/flag-definitions.h +426 -0
  128. data/ext/v8/upstream/2.0.6/src/flags.cc +555 -0
  129. data/ext/v8/upstream/2.0.6/src/flags.h +81 -0
  130. data/ext/v8/upstream/2.0.6/src/frame-element.cc +45 -0
  131. data/ext/v8/upstream/2.0.6/src/frame-element.h +235 -0
  132. data/ext/v8/upstream/2.0.6/src/frames-inl.h +215 -0
  133. data/ext/v8/upstream/2.0.6/src/frames.cc +749 -0
  134. data/ext/v8/upstream/2.0.6/src/frames.h +659 -0
  135. data/ext/v8/upstream/2.0.6/src/func-name-inferrer.cc +76 -0
  136. data/ext/v8/upstream/2.0.6/src/func-name-inferrer.h +135 -0
  137. data/ext/v8/upstream/2.0.6/src/global-handles.cc +516 -0
  138. data/ext/v8/upstream/2.0.6/src/global-handles.h +180 -0
  139. data/ext/v8/upstream/2.0.6/src/globals.h +608 -0
  140. data/ext/v8/upstream/2.0.6/src/handles-inl.h +76 -0
  141. data/ext/v8/upstream/2.0.6/src/handles.cc +811 -0
  142. data/ext/v8/upstream/2.0.6/src/handles.h +367 -0
  143. data/ext/v8/upstream/2.0.6/src/hashmap.cc +226 -0
  144. data/ext/v8/upstream/2.0.6/src/hashmap.h +120 -0
  145. data/ext/v8/upstream/2.0.6/src/heap-inl.h +407 -0
  146. data/ext/v8/upstream/2.0.6/src/heap-profiler.cc +695 -0
  147. data/ext/v8/upstream/2.0.6/src/heap-profiler.h +277 -0
  148. data/ext/v8/upstream/2.0.6/src/heap.cc +4204 -0
  149. data/ext/v8/upstream/2.0.6/src/heap.h +1704 -0
  150. data/ext/v8/upstream/2.0.6/src/ia32/assembler-ia32-inl.h +325 -0
  151. data/ext/v8/upstream/2.0.6/src/ia32/assembler-ia32.cc +2375 -0
  152. data/ext/v8/upstream/2.0.6/src/ia32/assembler-ia32.h +914 -0
  153. data/ext/v8/upstream/2.0.6/src/ia32/builtins-ia32.cc +1222 -0
  154. data/ext/v8/upstream/2.0.6/src/ia32/codegen-ia32-inl.h +46 -0
  155. data/ext/v8/upstream/2.0.6/src/ia32/codegen-ia32.cc +9770 -0
  156. data/ext/v8/upstream/2.0.6/src/ia32/codegen-ia32.h +834 -0
  157. data/ext/v8/upstream/2.0.6/src/ia32/cpu-ia32.cc +79 -0
  158. data/ext/v8/upstream/2.0.6/src/ia32/debug-ia32.cc +208 -0
  159. data/ext/v8/upstream/2.0.6/src/ia32/disasm-ia32.cc +1357 -0
  160. data/ext/v8/upstream/2.0.6/src/ia32/fast-codegen-ia32.cc +1813 -0
  161. data/ext/v8/upstream/2.0.6/src/ia32/frames-ia32.cc +111 -0
  162. data/ext/v8/upstream/2.0.6/src/ia32/frames-ia32.h +135 -0
  163. data/ext/v8/upstream/2.0.6/src/ia32/ic-ia32.cc +1490 -0
  164. data/ext/v8/upstream/2.0.6/src/ia32/jump-target-ia32.cc +432 -0
  165. data/ext/v8/upstream/2.0.6/src/ia32/macro-assembler-ia32.cc +1517 -0
  166. data/ext/v8/upstream/2.0.6/src/ia32/macro-assembler-ia32.h +528 -0
  167. data/ext/v8/upstream/2.0.6/src/ia32/regexp-macro-assembler-ia32.cc +1219 -0
  168. data/ext/v8/upstream/2.0.6/src/ia32/regexp-macro-assembler-ia32.h +230 -0
  169. data/ext/v8/upstream/2.0.6/src/ia32/register-allocator-ia32-inl.h +82 -0
  170. data/ext/v8/upstream/2.0.6/src/ia32/register-allocator-ia32.cc +99 -0
  171. data/ext/v8/upstream/2.0.6/src/ia32/register-allocator-ia32.h +43 -0
  172. data/ext/v8/upstream/2.0.6/src/ia32/simulator-ia32.cc +30 -0
  173. data/ext/v8/upstream/2.0.6/src/ia32/simulator-ia32.h +62 -0
  174. data/ext/v8/upstream/2.0.6/src/ia32/stub-cache-ia32.cc +1961 -0
  175. data/ext/v8/upstream/2.0.6/src/ia32/virtual-frame-ia32.cc +1105 -0
  176. data/ext/v8/upstream/2.0.6/src/ia32/virtual-frame-ia32.h +580 -0
  177. data/ext/v8/upstream/2.0.6/src/ic-inl.h +93 -0
  178. data/ext/v8/upstream/2.0.6/src/ic.cc +1426 -0
  179. data/ext/v8/upstream/2.0.6/src/ic.h +443 -0
  180. data/ext/v8/upstream/2.0.6/src/interpreter-irregexp.cc +646 -0
  181. data/ext/v8/upstream/2.0.6/src/interpreter-irregexp.h +48 -0
  182. data/ext/v8/upstream/2.0.6/src/json-delay.js +254 -0
  183. data/ext/v8/upstream/2.0.6/src/jsregexp.cc +5234 -0
  184. data/ext/v8/upstream/2.0.6/src/jsregexp.h +1439 -0
  185. data/ext/v8/upstream/2.0.6/src/jump-target-inl.h +49 -0
  186. data/ext/v8/upstream/2.0.6/src/jump-target.cc +383 -0
  187. data/ext/v8/upstream/2.0.6/src/jump-target.h +280 -0
  188. data/ext/v8/upstream/2.0.6/src/list-inl.h +166 -0
  189. data/ext/v8/upstream/2.0.6/src/list.h +158 -0
  190. data/ext/v8/upstream/2.0.6/src/log-inl.h +126 -0
  191. data/ext/v8/upstream/2.0.6/src/log-utils.cc +503 -0
  192. data/ext/v8/upstream/2.0.6/src/log-utils.h +292 -0
  193. data/ext/v8/upstream/2.0.6/src/log.cc +1457 -0
  194. data/ext/v8/upstream/2.0.6/src/log.h +371 -0
  195. data/ext/v8/upstream/2.0.6/src/macro-assembler.h +93 -0
  196. data/ext/v8/upstream/2.0.6/src/macros.py +137 -0
  197. data/ext/v8/upstream/2.0.6/src/mark-compact.cc +2007 -0
  198. data/ext/v8/upstream/2.0.6/src/mark-compact.h +442 -0
  199. data/ext/v8/upstream/2.0.6/src/math.js +263 -0
  200. data/ext/v8/upstream/2.0.6/src/memory.h +74 -0
  201. data/ext/v8/upstream/2.0.6/src/messages.cc +177 -0
  202. data/ext/v8/upstream/2.0.6/src/messages.h +112 -0
  203. data/ext/v8/upstream/2.0.6/src/messages.js +937 -0
  204. data/ext/v8/upstream/2.0.6/src/mirror-delay.js +2332 -0
  205. data/ext/v8/upstream/2.0.6/src/mksnapshot.cc +169 -0
  206. data/ext/v8/upstream/2.0.6/src/natives.h +63 -0
  207. data/ext/v8/upstream/2.0.6/src/objects-debug.cc +1317 -0
  208. data/ext/v8/upstream/2.0.6/src/objects-inl.h +3044 -0
  209. data/ext/v8/upstream/2.0.6/src/objects.cc +8306 -0
  210. data/ext/v8/upstream/2.0.6/src/objects.h +4960 -0
  211. data/ext/v8/upstream/2.0.6/src/oprofile-agent.cc +116 -0
  212. data/ext/v8/upstream/2.0.6/src/oprofile-agent.h +69 -0
  213. data/ext/v8/upstream/2.0.6/src/parser.cc +4810 -0
  214. data/ext/v8/upstream/2.0.6/src/parser.h +195 -0
  215. data/ext/v8/upstream/2.0.6/src/platform-freebsd.cc +645 -0
  216. data/ext/v8/upstream/2.0.6/src/platform-linux.cc +808 -0
  217. data/ext/v8/upstream/2.0.6/src/platform-macos.cc +643 -0
  218. data/ext/v8/upstream/2.0.6/src/platform-nullos.cc +454 -0
  219. data/ext/v8/upstream/2.0.6/src/platform-openbsd.cc +597 -0
  220. data/ext/v8/upstream/2.0.6/src/platform-posix.cc +380 -0
  221. data/ext/v8/upstream/2.0.6/src/platform-win32.cc +1908 -0
  222. data/ext/v8/upstream/2.0.6/src/platform.h +556 -0
  223. data/ext/v8/upstream/2.0.6/src/prettyprinter.cc +1511 -0
  224. data/ext/v8/upstream/2.0.6/src/prettyprinter.h +219 -0
  225. data/ext/v8/upstream/2.0.6/src/property.cc +96 -0
  226. data/ext/v8/upstream/2.0.6/src/property.h +327 -0
  227. data/ext/v8/upstream/2.0.6/src/regexp-delay.js +406 -0
  228. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-irregexp-inl.h +78 -0
  229. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-irregexp.cc +464 -0
  230. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-irregexp.h +141 -0
  231. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-tracer.cc +356 -0
  232. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-tracer.h +103 -0
  233. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler.cc +240 -0
  234. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler.h +220 -0
  235. data/ext/v8/upstream/2.0.6/src/regexp-stack.cc +103 -0
  236. data/ext/v8/upstream/2.0.6/src/regexp-stack.h +123 -0
  237. data/ext/v8/upstream/2.0.6/src/register-allocator-inl.h +74 -0
  238. data/ext/v8/upstream/2.0.6/src/register-allocator.cc +100 -0
  239. data/ext/v8/upstream/2.0.6/src/register-allocator.h +295 -0
  240. data/ext/v8/upstream/2.0.6/src/rewriter.cc +855 -0
  241. data/ext/v8/upstream/2.0.6/src/rewriter.h +54 -0
  242. data/ext/v8/upstream/2.0.6/src/runtime.cc +8163 -0
  243. data/ext/v8/upstream/2.0.6/src/runtime.h +432 -0
  244. data/ext/v8/upstream/2.0.6/src/runtime.js +626 -0
  245. data/ext/v8/upstream/2.0.6/src/scanner.cc +1098 -0
  246. data/ext/v8/upstream/2.0.6/src/scanner.h +425 -0
  247. data/ext/v8/upstream/2.0.6/src/scopeinfo.cc +649 -0
  248. data/ext/v8/upstream/2.0.6/src/scopeinfo.h +236 -0
  249. data/ext/v8/upstream/2.0.6/src/scopes.cc +963 -0
  250. data/ext/v8/upstream/2.0.6/src/scopes.h +401 -0
  251. data/ext/v8/upstream/2.0.6/src/serialize.cc +1260 -0
  252. data/ext/v8/upstream/2.0.6/src/serialize.h +404 -0
  253. data/ext/v8/upstream/2.0.6/src/shell.h +55 -0
  254. data/ext/v8/upstream/2.0.6/src/simulator.h +41 -0
  255. data/ext/v8/upstream/2.0.6/src/smart-pointer.h +109 -0
  256. data/ext/v8/upstream/2.0.6/src/snapshot-common.cc +97 -0
  257. data/ext/v8/upstream/2.0.6/src/snapshot-empty.cc +40 -0
  258. data/ext/v8/upstream/2.0.6/src/snapshot.h +59 -0
  259. data/ext/v8/upstream/2.0.6/src/spaces-inl.h +372 -0
  260. data/ext/v8/upstream/2.0.6/src/spaces.cc +2864 -0
  261. data/ext/v8/upstream/2.0.6/src/spaces.h +2072 -0
  262. data/ext/v8/upstream/2.0.6/src/string-stream.cc +584 -0
  263. data/ext/v8/upstream/2.0.6/src/string-stream.h +189 -0
  264. data/ext/v8/upstream/2.0.6/src/string.js +901 -0
  265. data/ext/v8/upstream/2.0.6/src/stub-cache.cc +1108 -0
  266. data/ext/v8/upstream/2.0.6/src/stub-cache.h +578 -0
  267. data/ext/v8/upstream/2.0.6/src/third_party/dtoa/COPYING +15 -0
  268. data/ext/v8/upstream/2.0.6/src/third_party/dtoa/dtoa.c +3330 -0
  269. data/ext/v8/upstream/2.0.6/src/third_party/valgrind/valgrind.h +3925 -0
  270. data/ext/v8/upstream/2.0.6/src/token.cc +56 -0
  271. data/ext/v8/upstream/2.0.6/src/token.h +270 -0
  272. data/ext/v8/upstream/2.0.6/src/top.cc +991 -0
  273. data/ext/v8/upstream/2.0.6/src/top.h +459 -0
  274. data/ext/v8/upstream/2.0.6/src/unicode-inl.h +238 -0
  275. data/ext/v8/upstream/2.0.6/src/unicode.cc +749 -0
  276. data/ext/v8/upstream/2.0.6/src/unicode.h +279 -0
  277. data/ext/v8/upstream/2.0.6/src/uri.js +415 -0
  278. data/ext/v8/upstream/2.0.6/src/usage-analyzer.cc +426 -0
  279. data/ext/v8/upstream/2.0.6/src/usage-analyzer.h +40 -0
  280. data/ext/v8/upstream/2.0.6/src/utils.cc +322 -0
  281. data/ext/v8/upstream/2.0.6/src/utils.h +592 -0
  282. data/ext/v8/upstream/2.0.6/src/v8-counters.cc +55 -0
  283. data/ext/v8/upstream/2.0.6/src/v8-counters.h +198 -0
  284. data/ext/v8/upstream/2.0.6/src/v8.cc +193 -0
  285. data/ext/v8/upstream/2.0.6/src/v8.h +119 -0
  286. data/ext/v8/upstream/2.0.6/src/v8natives.js +846 -0
  287. data/ext/v8/upstream/2.0.6/src/v8threads.cc +450 -0
  288. data/ext/v8/upstream/2.0.6/src/v8threads.h +144 -0
  289. data/ext/v8/upstream/2.0.6/src/variables.cc +163 -0
  290. data/ext/v8/upstream/2.0.6/src/variables.h +235 -0
  291. data/ext/v8/upstream/2.0.6/src/version.cc +88 -0
  292. data/ext/v8/upstream/2.0.6/src/version.h +64 -0
  293. data/ext/v8/upstream/2.0.6/src/virtual-frame.cc +381 -0
  294. data/ext/v8/upstream/2.0.6/src/virtual-frame.h +44 -0
  295. data/ext/v8/upstream/2.0.6/src/x64/assembler-x64-inl.h +352 -0
  296. data/ext/v8/upstream/2.0.6/src/x64/assembler-x64.cc +2539 -0
  297. data/ext/v8/upstream/2.0.6/src/x64/assembler-x64.h +1399 -0
  298. data/ext/v8/upstream/2.0.6/src/x64/builtins-x64.cc +1255 -0
  299. data/ext/v8/upstream/2.0.6/src/x64/codegen-x64-inl.h +46 -0
  300. data/ext/v8/upstream/2.0.6/src/x64/codegen-x64.cc +8223 -0
  301. data/ext/v8/upstream/2.0.6/src/x64/codegen-x64.h +785 -0
  302. data/ext/v8/upstream/2.0.6/src/x64/cpu-x64.cc +79 -0
  303. data/ext/v8/upstream/2.0.6/src/x64/debug-x64.cc +202 -0
  304. data/ext/v8/upstream/2.0.6/src/x64/disasm-x64.cc +1596 -0
  305. data/ext/v8/upstream/2.0.6/src/x64/fast-codegen-x64.cc +1820 -0
  306. data/ext/v8/upstream/2.0.6/src/x64/frames-x64.cc +109 -0
  307. data/ext/v8/upstream/2.0.6/src/x64/frames-x64.h +121 -0
  308. data/ext/v8/upstream/2.0.6/src/x64/ic-x64.cc +1392 -0
  309. data/ext/v8/upstream/2.0.6/src/x64/jump-target-x64.cc +432 -0
  310. data/ext/v8/upstream/2.0.6/src/x64/macro-assembler-x64.cc +2409 -0
  311. data/ext/v8/upstream/2.0.6/src/x64/macro-assembler-x64.h +765 -0
  312. data/ext/v8/upstream/2.0.6/src/x64/regexp-macro-assembler-x64.cc +1337 -0
  313. data/ext/v8/upstream/2.0.6/src/x64/regexp-macro-assembler-x64.h +295 -0
  314. data/ext/v8/upstream/2.0.6/src/x64/register-allocator-x64-inl.h +86 -0
  315. data/ext/v8/upstream/2.0.6/src/x64/register-allocator-x64.cc +84 -0
  316. data/ext/v8/upstream/2.0.6/src/x64/register-allocator-x64.h +43 -0
  317. data/ext/v8/upstream/2.0.6/src/x64/simulator-x64.cc +27 -0
  318. data/ext/v8/upstream/2.0.6/src/x64/simulator-x64.h +63 -0
  319. data/ext/v8/upstream/2.0.6/src/x64/stub-cache-x64.cc +1884 -0
  320. data/ext/v8/upstream/2.0.6/src/x64/virtual-frame-x64.cc +1089 -0
  321. data/ext/v8/upstream/2.0.6/src/x64/virtual-frame-x64.h +560 -0
  322. data/ext/v8/upstream/2.0.6/src/zone-inl.h +297 -0
  323. data/ext/v8/upstream/2.0.6/src/zone.cc +193 -0
  324. data/ext/v8/upstream/2.0.6/src/zone.h +305 -0
  325. data/ext/v8/upstream/2.0.6/tools/codemap.js +258 -0
  326. data/ext/v8/upstream/2.0.6/tools/consarray.js +93 -0
  327. data/ext/v8/upstream/2.0.6/tools/csvparser.js +98 -0
  328. data/ext/v8/upstream/2.0.6/tools/gyp/v8.gyp +620 -0
  329. data/ext/v8/upstream/2.0.6/tools/js2c.py +376 -0
  330. data/ext/v8/upstream/2.0.6/tools/jsmin.py +280 -0
  331. data/ext/v8/upstream/2.0.6/tools/linux-tick-processor +24 -0
  332. data/ext/v8/upstream/2.0.6/tools/linux-tick-processor.py +78 -0
  333. data/ext/v8/upstream/2.0.6/tools/logreader.js +320 -0
  334. data/ext/v8/upstream/2.0.6/tools/mac-nm +18 -0
  335. data/ext/v8/upstream/2.0.6/tools/mac-tick-processor +6 -0
  336. data/ext/v8/upstream/2.0.6/tools/oprofile/annotate +7 -0
  337. data/ext/v8/upstream/2.0.6/tools/oprofile/common +19 -0
  338. data/ext/v8/upstream/2.0.6/tools/oprofile/dump +7 -0
  339. data/ext/v8/upstream/2.0.6/tools/oprofile/report +7 -0
  340. data/ext/v8/upstream/2.0.6/tools/oprofile/reset +7 -0
  341. data/ext/v8/upstream/2.0.6/tools/oprofile/run +14 -0
  342. data/ext/v8/upstream/2.0.6/tools/oprofile/shutdown +7 -0
  343. data/ext/v8/upstream/2.0.6/tools/oprofile/start +7 -0
  344. data/ext/v8/upstream/2.0.6/tools/presubmit.py +299 -0
  345. data/ext/v8/upstream/2.0.6/tools/process-heap-prof.py +120 -0
  346. data/ext/v8/upstream/2.0.6/tools/profile.js +621 -0
  347. data/ext/v8/upstream/2.0.6/tools/profile_view.js +224 -0
  348. data/ext/v8/upstream/2.0.6/tools/run-valgrind.py +77 -0
  349. data/ext/v8/upstream/2.0.6/tools/splaytree.js +322 -0
  350. data/ext/v8/upstream/2.0.6/tools/splaytree.py +226 -0
  351. data/ext/v8/upstream/2.0.6/tools/stats-viewer.py +456 -0
  352. data/ext/v8/upstream/2.0.6/tools/test.py +1370 -0
  353. data/ext/v8/upstream/2.0.6/tools/tickprocessor-driver.js +53 -0
  354. data/ext/v8/upstream/2.0.6/tools/tickprocessor.js +731 -0
  355. data/ext/v8/upstream/2.0.6/tools/tickprocessor.py +535 -0
  356. data/ext/v8/upstream/2.0.6/tools/utils.py +82 -0
  357. data/ext/v8/upstream/2.0.6/tools/visual_studio/README.txt +71 -0
  358. data/ext/v8/upstream/2.0.6/tools/visual_studio/arm.vsprops +14 -0
  359. data/ext/v8/upstream/2.0.6/tools/visual_studio/common.vsprops +35 -0
  360. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8.vcproj +199 -0
  361. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8_arm.vcproj +199 -0
  362. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8_x64.vcproj +201 -0
  363. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8js2c.cmd +6 -0
  364. data/ext/v8/upstream/2.0.6/tools/visual_studio/debug.vsprops +17 -0
  365. data/ext/v8/upstream/2.0.6/tools/visual_studio/ia32.vsprops +13 -0
  366. data/ext/v8/upstream/2.0.6/tools/visual_studio/js2c.cmd +6 -0
  367. data/ext/v8/upstream/2.0.6/tools/visual_studio/release.vsprops +24 -0
  368. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8.sln +101 -0
  369. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8.vcproj +223 -0
  370. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_arm.sln +74 -0
  371. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_arm.vcproj +223 -0
  372. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_base.vcproj +971 -0
  373. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_base_arm.vcproj +983 -0
  374. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_base_x64.vcproj +959 -0
  375. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_cctest.vcproj +255 -0
  376. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_cctest_arm.vcproj +243 -0
  377. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_cctest_x64.vcproj +257 -0
  378. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_mksnapshot.vcproj +151 -0
  379. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_mksnapshot_x64.vcproj +151 -0
  380. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_process_sample.vcproj +151 -0
  381. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_process_sample_arm.vcproj +151 -0
  382. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_process_sample_x64.vcproj +151 -0
  383. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_shell_sample.vcproj +151 -0
  384. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_shell_sample_arm.vcproj +151 -0
  385. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_shell_sample_x64.vcproj +153 -0
  386. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot.vcproj +142 -0
  387. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot_cc.vcproj +92 -0
  388. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot_cc_x64.vcproj +92 -0
  389. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot_x64.vcproj +142 -0
  390. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_x64.sln +101 -0
  391. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_x64.vcproj +223 -0
  392. data/ext/v8/upstream/2.0.6/tools/visual_studio/x64.vsprops +13 -0
  393. data/ext/v8/upstream/2.0.6/tools/windows-tick-processor.bat +5 -0
  394. data/ext/v8/upstream/2.0.6/tools/windows-tick-processor.py +137 -0
  395. data/ext/v8/upstream/Makefile +31 -0
  396. data/ext/v8/upstream/no-strict-aliasing.patch +13 -0
  397. data/ext/v8/upstream/scons/CHANGES.txt +5183 -0
  398. data/ext/v8/upstream/scons/LICENSE.txt +20 -0
  399. data/ext/v8/upstream/scons/MANIFEST +202 -0
  400. data/ext/v8/upstream/scons/PKG-INFO +13 -0
  401. data/ext/v8/upstream/scons/README.txt +273 -0
  402. data/ext/v8/upstream/scons/RELEASE.txt +1040 -0
  403. data/ext/v8/upstream/scons/engine/SCons/Action.py +1256 -0
  404. data/ext/v8/upstream/scons/engine/SCons/Builder.py +868 -0
  405. data/ext/v8/upstream/scons/engine/SCons/CacheDir.py +217 -0
  406. data/ext/v8/upstream/scons/engine/SCons/Conftest.py +794 -0
  407. data/ext/v8/upstream/scons/engine/SCons/Debug.py +237 -0
  408. data/ext/v8/upstream/scons/engine/SCons/Defaults.py +485 -0
  409. data/ext/v8/upstream/scons/engine/SCons/Environment.py +2327 -0
  410. data/ext/v8/upstream/scons/engine/SCons/Errors.py +207 -0
  411. data/ext/v8/upstream/scons/engine/SCons/Executor.py +636 -0
  412. data/ext/v8/upstream/scons/engine/SCons/Job.py +435 -0
  413. data/ext/v8/upstream/scons/engine/SCons/Memoize.py +292 -0
  414. data/ext/v8/upstream/scons/engine/SCons/Node/Alias.py +153 -0
  415. data/ext/v8/upstream/scons/engine/SCons/Node/FS.py +3220 -0
  416. data/ext/v8/upstream/scons/engine/SCons/Node/Python.py +128 -0
  417. data/ext/v8/upstream/scons/engine/SCons/Node/__init__.py +1341 -0
  418. data/ext/v8/upstream/scons/engine/SCons/Options/BoolOption.py +50 -0
  419. data/ext/v8/upstream/scons/engine/SCons/Options/EnumOption.py +50 -0
  420. data/ext/v8/upstream/scons/engine/SCons/Options/ListOption.py +50 -0
  421. data/ext/v8/upstream/scons/engine/SCons/Options/PackageOption.py +50 -0
  422. data/ext/v8/upstream/scons/engine/SCons/Options/PathOption.py +76 -0
  423. data/ext/v8/upstream/scons/engine/SCons/Options/__init__.py +74 -0
  424. data/ext/v8/upstream/scons/engine/SCons/PathList.py +232 -0
  425. data/ext/v8/upstream/scons/engine/SCons/Platform/__init__.py +236 -0
  426. data/ext/v8/upstream/scons/engine/SCons/Platform/aix.py +70 -0
  427. data/ext/v8/upstream/scons/engine/SCons/Platform/cygwin.py +55 -0
  428. data/ext/v8/upstream/scons/engine/SCons/Platform/darwin.py +46 -0
  429. data/ext/v8/upstream/scons/engine/SCons/Platform/hpux.py +46 -0
  430. data/ext/v8/upstream/scons/engine/SCons/Platform/irix.py +44 -0
  431. data/ext/v8/upstream/scons/engine/SCons/Platform/os2.py +58 -0
  432. data/ext/v8/upstream/scons/engine/SCons/Platform/posix.py +264 -0
  433. data/ext/v8/upstream/scons/engine/SCons/Platform/sunos.py +50 -0
  434. data/ext/v8/upstream/scons/engine/SCons/Platform/win32.py +386 -0
  435. data/ext/v8/upstream/scons/engine/SCons/SConf.py +1038 -0
  436. data/ext/v8/upstream/scons/engine/SCons/SConsign.py +381 -0
  437. data/ext/v8/upstream/scons/engine/SCons/Scanner/C.py +132 -0
  438. data/ext/v8/upstream/scons/engine/SCons/Scanner/D.py +74 -0
  439. data/ext/v8/upstream/scons/engine/SCons/Scanner/Dir.py +111 -0
  440. data/ext/v8/upstream/scons/engine/SCons/Scanner/Fortran.py +320 -0
  441. data/ext/v8/upstream/scons/engine/SCons/Scanner/IDL.py +48 -0
  442. data/ext/v8/upstream/scons/engine/SCons/Scanner/LaTeX.py +378 -0
  443. data/ext/v8/upstream/scons/engine/SCons/Scanner/Prog.py +103 -0
  444. data/ext/v8/upstream/scons/engine/SCons/Scanner/RC.py +55 -0
  445. data/ext/v8/upstream/scons/engine/SCons/Scanner/__init__.py +415 -0
  446. data/ext/v8/upstream/scons/engine/SCons/Script/Interactive.py +386 -0
  447. data/ext/v8/upstream/scons/engine/SCons/Script/Main.py +1360 -0
  448. data/ext/v8/upstream/scons/engine/SCons/Script/SConsOptions.py +944 -0
  449. data/ext/v8/upstream/scons/engine/SCons/Script/SConscript.py +642 -0
  450. data/ext/v8/upstream/scons/engine/SCons/Script/__init__.py +414 -0
  451. data/ext/v8/upstream/scons/engine/SCons/Sig.py +63 -0
  452. data/ext/v8/upstream/scons/engine/SCons/Subst.py +911 -0
  453. data/ext/v8/upstream/scons/engine/SCons/Taskmaster.py +1030 -0
  454. data/ext/v8/upstream/scons/engine/SCons/Tool/386asm.py +61 -0
  455. data/ext/v8/upstream/scons/engine/SCons/Tool/BitKeeper.py +65 -0
  456. data/ext/v8/upstream/scons/engine/SCons/Tool/CVS.py +73 -0
  457. data/ext/v8/upstream/scons/engine/SCons/Tool/FortranCommon.py +247 -0
  458. data/ext/v8/upstream/scons/engine/SCons/Tool/JavaCommon.py +324 -0
  459. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/__init__.py +56 -0
  460. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/arch.py +61 -0
  461. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/common.py +210 -0
  462. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/netframework.py +84 -0
  463. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/sdk.py +321 -0
  464. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/vc.py +367 -0
  465. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/vs.py +497 -0
  466. data/ext/v8/upstream/scons/engine/SCons/Tool/Perforce.py +104 -0
  467. data/ext/v8/upstream/scons/engine/SCons/Tool/PharLapCommon.py +138 -0
  468. data/ext/v8/upstream/scons/engine/SCons/Tool/RCS.py +64 -0
  469. data/ext/v8/upstream/scons/engine/SCons/Tool/SCCS.py +64 -0
  470. data/ext/v8/upstream/scons/engine/SCons/Tool/Subversion.py +71 -0
  471. data/ext/v8/upstream/scons/engine/SCons/Tool/__init__.py +675 -0
  472. data/ext/v8/upstream/scons/engine/SCons/Tool/aixc++.py +82 -0
  473. data/ext/v8/upstream/scons/engine/SCons/Tool/aixcc.py +74 -0
  474. data/ext/v8/upstream/scons/engine/SCons/Tool/aixf77.py +80 -0
  475. data/ext/v8/upstream/scons/engine/SCons/Tool/aixlink.py +76 -0
  476. data/ext/v8/upstream/scons/engine/SCons/Tool/applelink.py +71 -0
  477. data/ext/v8/upstream/scons/engine/SCons/Tool/ar.py +63 -0
  478. data/ext/v8/upstream/scons/engine/SCons/Tool/as.py +78 -0
  479. data/ext/v8/upstream/scons/engine/SCons/Tool/bcc32.py +82 -0
  480. data/ext/v8/upstream/scons/engine/SCons/Tool/c++.py +99 -0
  481. data/ext/v8/upstream/scons/engine/SCons/Tool/cc.py +114 -0
  482. data/ext/v8/upstream/scons/engine/SCons/Tool/cvf.py +58 -0
  483. data/ext/v8/upstream/scons/engine/SCons/Tool/default.py +50 -0
  484. data/ext/v8/upstream/scons/engine/SCons/Tool/dmd.py +224 -0
  485. data/ext/v8/upstream/scons/engine/SCons/Tool/dvi.py +64 -0
  486. data/ext/v8/upstream/scons/engine/SCons/Tool/dvipdf.py +125 -0
  487. data/ext/v8/upstream/scons/engine/SCons/Tool/dvips.py +94 -0
  488. data/ext/v8/upstream/scons/engine/SCons/Tool/f77.py +62 -0
  489. data/ext/v8/upstream/scons/engine/SCons/Tool/f90.py +62 -0
  490. data/ext/v8/upstream/scons/engine/SCons/Tool/f95.py +63 -0
  491. data/ext/v8/upstream/scons/engine/SCons/Tool/filesystem.py +98 -0
  492. data/ext/v8/upstream/scons/engine/SCons/Tool/fortran.py +63 -0
  493. data/ext/v8/upstream/scons/engine/SCons/Tool/g++.py +90 -0
  494. data/ext/v8/upstream/scons/engine/SCons/Tool/g77.py +73 -0
  495. data/ext/v8/upstream/scons/engine/SCons/Tool/gas.py +53 -0
  496. data/ext/v8/upstream/scons/engine/SCons/Tool/gcc.py +80 -0
  497. data/ext/v8/upstream/scons/engine/SCons/Tool/gfortran.py +64 -0
  498. data/ext/v8/upstream/scons/engine/SCons/Tool/gnulink.py +63 -0
  499. data/ext/v8/upstream/scons/engine/SCons/Tool/gs.py +81 -0
  500. data/ext/v8/upstream/scons/engine/SCons/Tool/hpc++.py +85 -0
  501. data/ext/v8/upstream/scons/engine/SCons/Tool/hpcc.py +53 -0
  502. data/ext/v8/upstream/scons/engine/SCons/Tool/hplink.py +77 -0
  503. data/ext/v8/upstream/scons/engine/SCons/Tool/icc.py +59 -0
  504. data/ext/v8/upstream/scons/engine/SCons/Tool/icl.py +52 -0
  505. data/ext/v8/upstream/scons/engine/SCons/Tool/ifl.py +72 -0
  506. data/ext/v8/upstream/scons/engine/SCons/Tool/ifort.py +90 -0
  507. data/ext/v8/upstream/scons/engine/SCons/Tool/ilink.py +59 -0
  508. data/ext/v8/upstream/scons/engine/SCons/Tool/ilink32.py +60 -0
  509. data/ext/v8/upstream/scons/engine/SCons/Tool/install.py +229 -0
  510. data/ext/v8/upstream/scons/engine/SCons/Tool/intelc.py +490 -0
  511. data/ext/v8/upstream/scons/engine/SCons/Tool/ipkg.py +71 -0
  512. data/ext/v8/upstream/scons/engine/SCons/Tool/jar.py +110 -0
  513. data/ext/v8/upstream/scons/engine/SCons/Tool/javac.py +234 -0
  514. data/ext/v8/upstream/scons/engine/SCons/Tool/javah.py +138 -0
  515. data/ext/v8/upstream/scons/engine/SCons/Tool/latex.py +79 -0
  516. data/ext/v8/upstream/scons/engine/SCons/Tool/lex.py +99 -0
  517. data/ext/v8/upstream/scons/engine/SCons/Tool/link.py +121 -0
  518. data/ext/v8/upstream/scons/engine/SCons/Tool/linkloc.py +112 -0
  519. data/ext/v8/upstream/scons/engine/SCons/Tool/m4.py +63 -0
  520. data/ext/v8/upstream/scons/engine/SCons/Tool/masm.py +77 -0
  521. data/ext/v8/upstream/scons/engine/SCons/Tool/midl.py +90 -0
  522. data/ext/v8/upstream/scons/engine/SCons/Tool/mingw.py +159 -0
  523. data/ext/v8/upstream/scons/engine/SCons/Tool/mslib.py +64 -0
  524. data/ext/v8/upstream/scons/engine/SCons/Tool/mslink.py +266 -0
  525. data/ext/v8/upstream/scons/engine/SCons/Tool/mssdk.py +50 -0
  526. data/ext/v8/upstream/scons/engine/SCons/Tool/msvc.py +269 -0
  527. data/ext/v8/upstream/scons/engine/SCons/Tool/msvs.py +1439 -0
  528. data/ext/v8/upstream/scons/engine/SCons/Tool/mwcc.py +208 -0
  529. data/ext/v8/upstream/scons/engine/SCons/Tool/mwld.py +107 -0
  530. data/ext/v8/upstream/scons/engine/SCons/Tool/nasm.py +72 -0
  531. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/__init__.py +314 -0
  532. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/ipk.py +185 -0
  533. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/msi.py +526 -0
  534. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/rpm.py +367 -0
  535. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_tarbz2.py +43 -0
  536. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_targz.py +43 -0
  537. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_zip.py +43 -0
  538. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/tarbz2.py +44 -0
  539. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/targz.py +44 -0
  540. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/zip.py +44 -0
  541. data/ext/v8/upstream/scons/engine/SCons/Tool/pdf.py +78 -0
  542. data/ext/v8/upstream/scons/engine/SCons/Tool/pdflatex.py +83 -0
  543. data/ext/v8/upstream/scons/engine/SCons/Tool/pdftex.py +108 -0
  544. data/ext/v8/upstream/scons/engine/SCons/Tool/qt.py +336 -0
  545. data/ext/v8/upstream/scons/engine/SCons/Tool/rmic.py +121 -0
  546. data/ext/v8/upstream/scons/engine/SCons/Tool/rpcgen.py +70 -0
  547. data/ext/v8/upstream/scons/engine/SCons/Tool/rpm.py +132 -0
  548. data/ext/v8/upstream/scons/engine/SCons/Tool/sgiar.py +68 -0
  549. data/ext/v8/upstream/scons/engine/SCons/Tool/sgic++.py +58 -0
  550. data/ext/v8/upstream/scons/engine/SCons/Tool/sgicc.py +53 -0
  551. data/ext/v8/upstream/scons/engine/SCons/Tool/sgilink.py +63 -0
  552. data/ext/v8/upstream/scons/engine/SCons/Tool/sunar.py +67 -0
  553. data/ext/v8/upstream/scons/engine/SCons/Tool/sunc++.py +142 -0
  554. data/ext/v8/upstream/scons/engine/SCons/Tool/suncc.py +58 -0
  555. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf77.py +63 -0
  556. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf90.py +64 -0
  557. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf95.py +64 -0
  558. data/ext/v8/upstream/scons/engine/SCons/Tool/sunlink.py +77 -0
  559. data/ext/v8/upstream/scons/engine/SCons/Tool/swig.py +186 -0
  560. data/ext/v8/upstream/scons/engine/SCons/Tool/tar.py +73 -0
  561. data/ext/v8/upstream/scons/engine/SCons/Tool/tex.py +805 -0
  562. data/ext/v8/upstream/scons/engine/SCons/Tool/textfile.py +175 -0
  563. data/ext/v8/upstream/scons/engine/SCons/Tool/tlib.py +53 -0
  564. data/ext/v8/upstream/scons/engine/SCons/Tool/wix.py +100 -0
  565. data/ext/v8/upstream/scons/engine/SCons/Tool/yacc.py +131 -0
  566. data/ext/v8/upstream/scons/engine/SCons/Tool/zip.py +100 -0
  567. data/ext/v8/upstream/scons/engine/SCons/Util.py +1645 -0
  568. data/ext/v8/upstream/scons/engine/SCons/Variables/BoolVariable.py +91 -0
  569. data/ext/v8/upstream/scons/engine/SCons/Variables/EnumVariable.py +107 -0
  570. data/ext/v8/upstream/scons/engine/SCons/Variables/ListVariable.py +139 -0
  571. data/ext/v8/upstream/scons/engine/SCons/Variables/PackageVariable.py +109 -0
  572. data/ext/v8/upstream/scons/engine/SCons/Variables/PathVariable.py +147 -0
  573. data/ext/v8/upstream/scons/engine/SCons/Variables/__init__.py +317 -0
  574. data/ext/v8/upstream/scons/engine/SCons/Warnings.py +228 -0
  575. data/ext/v8/upstream/scons/engine/SCons/__init__.py +49 -0
  576. data/ext/v8/upstream/scons/engine/SCons/compat/__init__.py +302 -0
  577. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_UserString.py +98 -0
  578. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_hashlib.py +91 -0
  579. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_itertools.py +124 -0
  580. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_optparse.py +1725 -0
  581. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_sets.py +583 -0
  582. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_sets15.py +176 -0
  583. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_shlex.py +325 -0
  584. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_subprocess.py +1296 -0
  585. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_textwrap.py +382 -0
  586. data/ext/v8/upstream/scons/engine/SCons/compat/builtins.py +187 -0
  587. data/ext/v8/upstream/scons/engine/SCons/cpp.py +598 -0
  588. data/ext/v8/upstream/scons/engine/SCons/dblite.py +248 -0
  589. data/ext/v8/upstream/scons/engine/SCons/exitfuncs.py +77 -0
  590. data/ext/v8/upstream/scons/os_spawnv_fix.diff +83 -0
  591. data/ext/v8/upstream/scons/scons-time.1 +1017 -0
  592. data/ext/v8/upstream/scons/scons.1 +15179 -0
  593. data/ext/v8/upstream/scons/sconsign.1 +208 -0
  594. data/ext/v8/upstream/scons/script/scons +184 -0
  595. data/ext/v8/upstream/scons/script/scons-time +1529 -0
  596. data/ext/v8/upstream/scons/script/scons.bat +31 -0
  597. data/ext/v8/upstream/scons/script/sconsign +508 -0
  598. data/ext/v8/upstream/scons/setup.cfg +6 -0
  599. data/ext/v8/upstream/scons/setup.py +427 -0
  600. data/ext/v8/v8.cpp +89 -0
  601. data/ext/v8/v8_cxt.cpp +92 -0
  602. data/ext/v8/v8_cxt.h +20 -0
  603. data/ext/v8/v8_func.cpp +10 -0
  604. data/ext/v8/v8_func.h +11 -0
  605. data/ext/v8/v8_msg.cpp +54 -0
  606. data/ext/v8/v8_msg.h +18 -0
  607. data/ext/v8/v8_obj.cpp +52 -0
  608. data/ext/v8/v8_obj.h +13 -0
  609. data/ext/v8/v8_ref.cpp +26 -0
  610. data/ext/v8/v8_ref.h +31 -0
  611. data/ext/v8/v8_script.cpp +20 -0
  612. data/ext/v8/v8_script.h +8 -0
  613. data/ext/v8/v8_standalone.cpp +69 -0
  614. data/ext/v8/v8_standalone.h +31 -0
  615. data/ext/v8/v8_str.cpp +17 -0
  616. data/ext/v8/v8_str.h +9 -0
  617. data/ext/v8/v8_template.cpp +53 -0
  618. data/ext/v8/v8_template.h +13 -0
  619. data/lib/v8.rb +10 -0
  620. data/lib/v8/context.rb +101 -0
  621. data/lib/v8/object.rb +38 -0
  622. data/lib/v8/to.rb +33 -0
  623. data/lib/v8/v8.so +0 -0
  624. data/script/console +10 -0
  625. data/script/destroy +14 -0
  626. data/script/generate +14 -0
  627. data/spec/ext/cxt_spec.rb +25 -0
  628. data/spec/ext/obj_spec.rb +13 -0
  629. data/spec/redjs/jsapi_spec.rb +405 -0
  630. data/spec/redjs/tap.rb +8 -0
  631. data/spec/redjs_helper.rb +3 -0
  632. data/spec/spec.opts +1 -0
  633. data/spec/spec_helper.rb +14 -0
  634. data/spec/v8/to_spec.rb +15 -0
  635. data/tasks/rspec.rake +21 -0
  636. data/therubyracer.gemspec +680 -0
  637. metadata +697 -0
@@ -0,0 +1,1680 @@
1
+ // Copyright 2006-2008 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
+
30
+ #include "accessors.h"
31
+ #include "api.h"
32
+ #include "bootstrapper.h"
33
+ #include "compiler.h"
34
+ #include "debug.h"
35
+ #include "execution.h"
36
+ #include "global-handles.h"
37
+ #include "macro-assembler.h"
38
+ #include "natives.h"
39
+ #include "snapshot.h"
40
+
41
+ namespace v8 {
42
+ namespace internal {
43
+
44
+ // A SourceCodeCache uses a FixedArray to store pairs of
45
+ // (AsciiString*, JSFunction*), mapping names of native code files
46
+ // (runtime.js, etc.) to precompiled functions. Instead of mapping
47
+ // names to functions it might make sense to let the JS2C tool
48
+ // generate an index for each native JS file.
49
+ class SourceCodeCache BASE_EMBEDDED {
50
+ public:
51
+ explicit SourceCodeCache(Script::Type type): type_(type), cache_(NULL) { }
52
+
53
+ void Initialize(bool create_heap_objects) {
54
+ cache_ = create_heap_objects ? Heap::empty_fixed_array() : NULL;
55
+ }
56
+
57
+ void Iterate(ObjectVisitor* v) {
58
+ v->VisitPointer(bit_cast<Object**, FixedArray**>(&cache_));
59
+ }
60
+
61
+
62
+ bool Lookup(Vector<const char> name, Handle<JSFunction>* handle) {
63
+ for (int i = 0; i < cache_->length(); i+=2) {
64
+ SeqAsciiString* str = SeqAsciiString::cast(cache_->get(i));
65
+ if (str->IsEqualTo(name)) {
66
+ *handle = Handle<JSFunction>(JSFunction::cast(cache_->get(i + 1)));
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+
73
+
74
+ void Add(Vector<const char> name, Handle<JSFunction> fun) {
75
+ ASSERT(fun->IsBoilerplate());
76
+ HandleScope scope;
77
+ int length = cache_->length();
78
+ Handle<FixedArray> new_array =
79
+ Factory::NewFixedArray(length + 2, TENURED);
80
+ cache_->CopyTo(0, *new_array, 0, cache_->length());
81
+ cache_ = *new_array;
82
+ Handle<String> str = Factory::NewStringFromAscii(name, TENURED);
83
+ cache_->set(length, *str);
84
+ cache_->set(length + 1, *fun);
85
+ Script::cast(fun->shared()->script())->set_type(Smi::FromInt(type_));
86
+ }
87
+
88
+ private:
89
+ Script::Type type_;
90
+ FixedArray* cache_;
91
+ DISALLOW_COPY_AND_ASSIGN(SourceCodeCache);
92
+ };
93
+
94
+ static SourceCodeCache natives_cache(Script::TYPE_NATIVE);
95
+ static SourceCodeCache extensions_cache(Script::TYPE_EXTENSION);
96
+ // This is for delete, not delete[].
97
+ static List<char*>* delete_these_non_arrays_on_tear_down = NULL;
98
+ // This is for delete[]
99
+ static List<char*>* delete_these_arrays_on_tear_down = NULL;
100
+
101
+
102
+ NativesExternalStringResource::NativesExternalStringResource(const char* source)
103
+ : data_(source), length_(StrLength(source)) {
104
+ if (delete_these_non_arrays_on_tear_down == NULL) {
105
+ delete_these_non_arrays_on_tear_down = new List<char*>(2);
106
+ }
107
+ // The resources are small objects and we only make a fixed number of
108
+ // them, but let's clean them up on exit for neatness.
109
+ delete_these_non_arrays_on_tear_down->
110
+ Add(reinterpret_cast<char*>(this));
111
+ }
112
+
113
+
114
+ Handle<String> Bootstrapper::NativesSourceLookup(int index) {
115
+ ASSERT(0 <= index && index < Natives::GetBuiltinsCount());
116
+ if (Heap::natives_source_cache()->get(index)->IsUndefined()) {
117
+ if (!Snapshot::IsEnabled() || FLAG_new_snapshot) {
118
+ // We can use external strings for the natives.
119
+ NativesExternalStringResource* resource =
120
+ new NativesExternalStringResource(
121
+ Natives::GetScriptSource(index).start());
122
+ Handle<String> source_code =
123
+ Factory::NewExternalStringFromAscii(resource);
124
+ Heap::natives_source_cache()->set(index, *source_code);
125
+ } else {
126
+ // Old snapshot code can't cope with external strings at all.
127
+ Handle<String> source_code =
128
+ Factory::NewStringFromAscii(Natives::GetScriptSource(index));
129
+ Heap::natives_source_cache()->set(index, *source_code);
130
+ }
131
+ }
132
+ Handle<Object> cached_source(Heap::natives_source_cache()->get(index));
133
+ return Handle<String>::cast(cached_source);
134
+ }
135
+
136
+
137
+ bool Bootstrapper::NativesCacheLookup(Vector<const char> name,
138
+ Handle<JSFunction>* handle) {
139
+ return natives_cache.Lookup(name, handle);
140
+ }
141
+
142
+
143
+ void Bootstrapper::NativesCacheAdd(Vector<const char> name,
144
+ Handle<JSFunction> fun) {
145
+ natives_cache.Add(name, fun);
146
+ }
147
+
148
+
149
+ void Bootstrapper::Initialize(bool create_heap_objects) {
150
+ natives_cache.Initialize(create_heap_objects);
151
+ extensions_cache.Initialize(create_heap_objects);
152
+ }
153
+
154
+
155
+ char* Bootstrapper::AllocateAutoDeletedArray(int bytes) {
156
+ char* memory = new char[bytes];
157
+ if (memory != NULL) {
158
+ if (delete_these_arrays_on_tear_down == NULL) {
159
+ delete_these_arrays_on_tear_down = new List<char*>(2);
160
+ }
161
+ delete_these_arrays_on_tear_down->Add(memory);
162
+ }
163
+ return memory;
164
+ }
165
+
166
+
167
+ void Bootstrapper::TearDown() {
168
+ if (delete_these_non_arrays_on_tear_down != NULL) {
169
+ int len = delete_these_non_arrays_on_tear_down->length();
170
+ ASSERT(len < 20); // Don't use this mechanism for unbounded allocations.
171
+ for (int i = 0; i < len; i++) {
172
+ delete delete_these_non_arrays_on_tear_down->at(i);
173
+ delete_these_non_arrays_on_tear_down->at(i) = NULL;
174
+ }
175
+ delete delete_these_non_arrays_on_tear_down;
176
+ delete_these_non_arrays_on_tear_down = NULL;
177
+ }
178
+
179
+ if (delete_these_arrays_on_tear_down != NULL) {
180
+ int len = delete_these_arrays_on_tear_down->length();
181
+ ASSERT(len < 1000); // Don't use this mechanism for unbounded allocations.
182
+ for (int i = 0; i < len; i++) {
183
+ delete[] delete_these_arrays_on_tear_down->at(i);
184
+ delete_these_arrays_on_tear_down->at(i) = NULL;
185
+ }
186
+ delete delete_these_arrays_on_tear_down;
187
+ delete_these_arrays_on_tear_down = NULL;
188
+ }
189
+
190
+ natives_cache.Initialize(false); // Yes, symmetrical
191
+ extensions_cache.Initialize(false);
192
+ }
193
+
194
+
195
+ // Pending fixups are code positions that refer to builtin code
196
+ // objects that were not available at the time the code was generated.
197
+ // The pending list is processed whenever an environment has been
198
+ // created.
199
+ class PendingFixups : public AllStatic {
200
+ public:
201
+ static void Add(Code* code, MacroAssembler* masm);
202
+ static bool Process(Handle<JSBuiltinsObject> builtins);
203
+
204
+ static void Iterate(ObjectVisitor* v);
205
+
206
+ private:
207
+ static List<Object*> code_;
208
+ static List<const char*> name_;
209
+ static List<int> pc_;
210
+ static List<uint32_t> flags_;
211
+
212
+ static void Clear();
213
+ };
214
+
215
+
216
+ List<Object*> PendingFixups::code_(0);
217
+ List<const char*> PendingFixups::name_(0);
218
+ List<int> PendingFixups::pc_(0);
219
+ List<uint32_t> PendingFixups::flags_(0);
220
+
221
+
222
+ void PendingFixups::Add(Code* code, MacroAssembler* masm) {
223
+ // Note this code is not only called during bootstrapping.
224
+ List<MacroAssembler::Unresolved>* unresolved = masm->unresolved();
225
+ int n = unresolved->length();
226
+ for (int i = 0; i < n; i++) {
227
+ const char* name = unresolved->at(i).name;
228
+ code_.Add(code);
229
+ name_.Add(name);
230
+ pc_.Add(unresolved->at(i).pc);
231
+ flags_.Add(unresolved->at(i).flags);
232
+ LOG(StringEvent("unresolved", name));
233
+ }
234
+ }
235
+
236
+
237
+ bool PendingFixups::Process(Handle<JSBuiltinsObject> builtins) {
238
+ HandleScope scope;
239
+ // NOTE: Extra fixups may be added to the list during the iteration
240
+ // due to lazy compilation of functions during the processing. Do not
241
+ // cache the result of getting the length of the code list.
242
+ for (int i = 0; i < code_.length(); i++) {
243
+ const char* name = name_[i];
244
+ uint32_t flags = flags_[i];
245
+ Handle<String> symbol = Factory::LookupAsciiSymbol(name);
246
+ Object* o = builtins->GetProperty(*symbol);
247
+ #ifdef DEBUG
248
+ if (!o->IsJSFunction()) {
249
+ V8_Fatal(__FILE__, __LINE__, "Cannot resolve call to builtin %s", name);
250
+ }
251
+ #endif
252
+ Handle<JSFunction> f = Handle<JSFunction>(JSFunction::cast(o));
253
+ // Make sure the number of parameters match the formal parameter count.
254
+ int argc = Bootstrapper::FixupFlagsArgumentsCount::decode(flags);
255
+ USE(argc);
256
+ ASSERT(f->shared()->formal_parameter_count() == argc);
257
+ if (!f->is_compiled()) {
258
+ // Do lazy compilation and check for stack overflows.
259
+ if (!CompileLazy(f, CLEAR_EXCEPTION)) {
260
+ Clear();
261
+ return false;
262
+ }
263
+ }
264
+ Code* code = Code::cast(code_[i]);
265
+ Address pc = code->instruction_start() + pc_[i];
266
+ RelocInfo target(pc, RelocInfo::CODE_TARGET, 0);
267
+ bool use_code_object = Bootstrapper::FixupFlagsUseCodeObject::decode(flags);
268
+ if (use_code_object) {
269
+ target.set_target_object(f->code());
270
+ } else {
271
+ target.set_target_address(f->code()->instruction_start());
272
+ }
273
+ LOG(StringEvent("resolved", name));
274
+ }
275
+ Clear();
276
+
277
+ // TODO(1240818): We should probably try to avoid doing this for all
278
+ // the V8 builtin JS files. It should only happen after running
279
+ // runtime.js - just like there shouldn't be any fixups left after
280
+ // that.
281
+ for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) {
282
+ Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i);
283
+ Handle<String> name = Factory::LookupAsciiSymbol(Builtins::GetName(id));
284
+ JSFunction* function = JSFunction::cast(builtins->GetProperty(*name));
285
+ builtins->set_javascript_builtin(id, function);
286
+ }
287
+
288
+ return true;
289
+ }
290
+
291
+
292
+ void PendingFixups::Clear() {
293
+ code_.Clear();
294
+ name_.Clear();
295
+ pc_.Clear();
296
+ flags_.Clear();
297
+ }
298
+
299
+
300
+ void PendingFixups::Iterate(ObjectVisitor* v) {
301
+ if (!code_.is_empty()) {
302
+ v->VisitPointers(&code_[0], &code_[0] + code_.length());
303
+ }
304
+ }
305
+
306
+
307
+ class Genesis BASE_EMBEDDED {
308
+ public:
309
+ Genesis(Handle<Object> global_object,
310
+ v8::Handle<v8::ObjectTemplate> global_template,
311
+ v8::ExtensionConfiguration* extensions);
312
+ ~Genesis();
313
+
314
+ Handle<Context> result() { return result_; }
315
+
316
+ Genesis* previous() { return previous_; }
317
+ static Genesis* current() { return current_; }
318
+
319
+ // Support for thread preemption.
320
+ static int ArchiveSpacePerThread();
321
+ static char* ArchiveState(char* to);
322
+ static char* RestoreState(char* from);
323
+
324
+ private:
325
+ Handle<Context> global_context_;
326
+
327
+ // There may be more than one active genesis object: When GC is
328
+ // triggered during environment creation there may be weak handle
329
+ // processing callbacks which may create new environments.
330
+ Genesis* previous_;
331
+ static Genesis* current_;
332
+
333
+ Handle<Context> global_context() { return global_context_; }
334
+
335
+ void CreateRoots(v8::Handle<v8::ObjectTemplate> global_template,
336
+ Handle<Object> global_object);
337
+ void InstallNativeFunctions();
338
+ bool InstallNatives();
339
+ bool InstallExtensions(v8::ExtensionConfiguration* extensions);
340
+ bool InstallExtension(const char* name);
341
+ bool InstallExtension(v8::RegisteredExtension* current);
342
+ bool InstallSpecialObjects();
343
+ bool ConfigureApiObject(Handle<JSObject> object,
344
+ Handle<ObjectTemplateInfo> object_template);
345
+ bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template);
346
+
347
+ // Migrates all properties from the 'from' object to the 'to'
348
+ // object and overrides the prototype in 'to' with the one from
349
+ // 'from'.
350
+ void TransferObject(Handle<JSObject> from, Handle<JSObject> to);
351
+ void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to);
352
+ void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
353
+
354
+ Handle<DescriptorArray> ComputeFunctionInstanceDescriptor(
355
+ bool make_prototype_read_only,
356
+ bool make_prototype_enumerable = false);
357
+ void MakeFunctionInstancePrototypeWritable();
358
+
359
+ void AddSpecialFunction(Handle<JSObject> prototype,
360
+ const char* name,
361
+ Handle<Code> code);
362
+
363
+ void BuildSpecialFunctionTable();
364
+
365
+ static bool CompileBuiltin(int index);
366
+ static bool CompileNative(Vector<const char> name, Handle<String> source);
367
+ static bool CompileScriptCached(Vector<const char> name,
368
+ Handle<String> source,
369
+ SourceCodeCache* cache,
370
+ v8::Extension* extension,
371
+ bool use_runtime_context);
372
+
373
+ Handle<Context> result_;
374
+ };
375
+
376
+ Genesis* Genesis::current_ = NULL;
377
+
378
+
379
+ void Bootstrapper::Iterate(ObjectVisitor* v) {
380
+ natives_cache.Iterate(v);
381
+ v->Synchronize("NativesCache");
382
+ extensions_cache.Iterate(v);
383
+ v->Synchronize("Extensions");
384
+ PendingFixups::Iterate(v);
385
+ v->Synchronize("PendingFixups");
386
+ }
387
+
388
+
389
+ // While setting up the environment, we collect code positions that
390
+ // need to be patched before we can run any code in the environment.
391
+ void Bootstrapper::AddFixup(Code* code, MacroAssembler* masm) {
392
+ PendingFixups::Add(code, masm);
393
+ }
394
+
395
+
396
+ bool Bootstrapper::IsActive() {
397
+ return Genesis::current() != NULL;
398
+ }
399
+
400
+
401
+ Handle<Context> Bootstrapper::CreateEnvironment(
402
+ Handle<Object> global_object,
403
+ v8::Handle<v8::ObjectTemplate> global_template,
404
+ v8::ExtensionConfiguration* extensions) {
405
+ Genesis genesis(global_object, global_template, extensions);
406
+ return genesis.result();
407
+ }
408
+
409
+
410
+ static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) {
411
+ // object.__proto__ = proto;
412
+ Handle<Map> old_to_map = Handle<Map>(object->map());
413
+ Handle<Map> new_to_map = Factory::CopyMapDropTransitions(old_to_map);
414
+ new_to_map->set_prototype(*proto);
415
+ object->set_map(*new_to_map);
416
+ }
417
+
418
+
419
+ void Bootstrapper::DetachGlobal(Handle<Context> env) {
420
+ JSGlobalProxy::cast(env->global_proxy())->set_context(*Factory::null_value());
421
+ SetObjectPrototype(Handle<JSObject>(env->global_proxy()),
422
+ Factory::null_value());
423
+ env->set_global_proxy(env->global());
424
+ env->global()->set_global_receiver(env->global());
425
+ }
426
+
427
+
428
+ Genesis::~Genesis() {
429
+ ASSERT(current_ == this);
430
+ current_ = previous_;
431
+ }
432
+
433
+
434
+ static Handle<JSFunction> InstallFunction(Handle<JSObject> target,
435
+ const char* name,
436
+ InstanceType type,
437
+ int instance_size,
438
+ Handle<JSObject> prototype,
439
+ Builtins::Name call,
440
+ bool is_ecma_native) {
441
+ Handle<String> symbol = Factory::LookupAsciiSymbol(name);
442
+ Handle<Code> call_code = Handle<Code>(Builtins::builtin(call));
443
+ Handle<JSFunction> function =
444
+ Factory::NewFunctionWithPrototype(symbol,
445
+ type,
446
+ instance_size,
447
+ prototype,
448
+ call_code,
449
+ is_ecma_native);
450
+ SetProperty(target, symbol, function, DONT_ENUM);
451
+ if (is_ecma_native) {
452
+ function->shared()->set_instance_class_name(*symbol);
453
+ }
454
+ return function;
455
+ }
456
+
457
+
458
+ Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor(
459
+ bool make_prototype_read_only,
460
+ bool make_prototype_enumerable) {
461
+ Handle<DescriptorArray> result = Factory::empty_descriptor_array();
462
+
463
+ // Add prototype.
464
+ PropertyAttributes attributes = static_cast<PropertyAttributes>(
465
+ (make_prototype_enumerable ? 0 : DONT_ENUM)
466
+ | DONT_DELETE
467
+ | (make_prototype_read_only ? READ_ONLY : 0));
468
+ result =
469
+ Factory::CopyAppendProxyDescriptor(
470
+ result,
471
+ Factory::prototype_symbol(),
472
+ Factory::NewProxy(&Accessors::FunctionPrototype),
473
+ attributes);
474
+
475
+ attributes =
476
+ static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
477
+ // Add length.
478
+ result =
479
+ Factory::CopyAppendProxyDescriptor(
480
+ result,
481
+ Factory::length_symbol(),
482
+ Factory::NewProxy(&Accessors::FunctionLength),
483
+ attributes);
484
+
485
+ // Add name.
486
+ result =
487
+ Factory::CopyAppendProxyDescriptor(
488
+ result,
489
+ Factory::name_symbol(),
490
+ Factory::NewProxy(&Accessors::FunctionName),
491
+ attributes);
492
+
493
+ // Add arguments.
494
+ result =
495
+ Factory::CopyAppendProxyDescriptor(
496
+ result,
497
+ Factory::arguments_symbol(),
498
+ Factory::NewProxy(&Accessors::FunctionArguments),
499
+ attributes);
500
+
501
+ // Add caller.
502
+ result =
503
+ Factory::CopyAppendProxyDescriptor(
504
+ result,
505
+ Factory::caller_symbol(),
506
+ Factory::NewProxy(&Accessors::FunctionCaller),
507
+ attributes);
508
+
509
+ return result;
510
+ }
511
+
512
+
513
+ void Genesis::CreateRoots(v8::Handle<v8::ObjectTemplate> global_template,
514
+ Handle<Object> global_object) {
515
+ HandleScope scope;
516
+ // Allocate the global context FixedArray first and then patch the
517
+ // closure and extension object later (we need the empty function
518
+ // and the global object, but in order to create those, we need the
519
+ // global context).
520
+ global_context_ =
521
+ Handle<Context>::cast(
522
+ GlobalHandles::Create(*Factory::NewGlobalContext()));
523
+ Top::set_context(*global_context());
524
+
525
+ // Allocate the message listeners object.
526
+ v8::NeanderArray listeners;
527
+ global_context()->set_message_listeners(*listeners.value());
528
+
529
+ // Allocate the map for function instances.
530
+ Handle<Map> fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
531
+ global_context()->set_function_instance_map(*fm);
532
+ // Please note that the prototype property for function instances must be
533
+ // writable.
534
+ Handle<DescriptorArray> function_map_descriptors =
535
+ ComputeFunctionInstanceDescriptor(false, false);
536
+ fm->set_instance_descriptors(*function_map_descriptors);
537
+
538
+ // Allocate the function map first and then patch the prototype later
539
+ fm = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
540
+ global_context()->set_function_map(*fm);
541
+ function_map_descriptors = ComputeFunctionInstanceDescriptor(true);
542
+ fm->set_instance_descriptors(*function_map_descriptors);
543
+
544
+ Handle<String> object_name = Handle<String>(Heap::Object_symbol());
545
+
546
+ { // --- O b j e c t ---
547
+ Handle<JSFunction> object_fun =
548
+ Factory::NewFunction(object_name, Factory::null_value());
549
+ Handle<Map> object_function_map =
550
+ Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
551
+ object_fun->set_initial_map(*object_function_map);
552
+ object_function_map->set_constructor(*object_fun);
553
+
554
+ global_context()->set_object_function(*object_fun);
555
+
556
+ // Allocate a new prototype for the object function.
557
+ Handle<JSObject> prototype = Factory::NewJSObject(Top::object_function(),
558
+ TENURED);
559
+
560
+ global_context()->set_initial_object_prototype(*prototype);
561
+ SetPrototype(object_fun, prototype);
562
+ object_function_map->
563
+ set_instance_descriptors(Heap::empty_descriptor_array());
564
+ }
565
+
566
+ // Allocate the empty function as the prototype for function ECMAScript
567
+ // 262 15.3.4.
568
+ Handle<String> symbol = Factory::LookupAsciiSymbol("Empty");
569
+ Handle<JSFunction> empty_function =
570
+ Factory::NewFunction(symbol, Factory::null_value());
571
+
572
+ { // --- E m p t y ---
573
+ Handle<Code> code =
574
+ Handle<Code>(Builtins::builtin(Builtins::EmptyFunction));
575
+ empty_function->set_code(*code);
576
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("() {}"));
577
+ Handle<Script> script = Factory::NewScript(source);
578
+ script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
579
+ empty_function->shared()->set_script(*script);
580
+ empty_function->shared()->set_start_position(0);
581
+ empty_function->shared()->set_end_position(source->length());
582
+ empty_function->shared()->DontAdaptArguments();
583
+ global_context()->function_map()->set_prototype(*empty_function);
584
+ global_context()->function_instance_map()->set_prototype(*empty_function);
585
+
586
+ // Allocate the function map first and then patch the prototype later
587
+ Handle<Map> empty_fm = Factory::CopyMapDropDescriptors(fm);
588
+ empty_fm->set_instance_descriptors(*function_map_descriptors);
589
+ empty_fm->set_prototype(global_context()->object_function()->prototype());
590
+ empty_function->set_map(*empty_fm);
591
+ }
592
+
593
+ { // --- G l o b a l ---
594
+ // Step 1: create a fresh inner JSGlobalObject
595
+ Handle<GlobalObject> object;
596
+ {
597
+ Handle<JSFunction> js_global_function;
598
+ Handle<ObjectTemplateInfo> js_global_template;
599
+ if (!global_template.IsEmpty()) {
600
+ // Get prototype template of the global_template
601
+ Handle<ObjectTemplateInfo> data =
602
+ v8::Utils::OpenHandle(*global_template);
603
+ Handle<FunctionTemplateInfo> global_constructor =
604
+ Handle<FunctionTemplateInfo>(
605
+ FunctionTemplateInfo::cast(data->constructor()));
606
+ Handle<Object> proto_template(global_constructor->prototype_template());
607
+ if (!proto_template->IsUndefined()) {
608
+ js_global_template =
609
+ Handle<ObjectTemplateInfo>::cast(proto_template);
610
+ }
611
+ }
612
+
613
+ if (js_global_template.is_null()) {
614
+ Handle<String> name = Handle<String>(Heap::empty_symbol());
615
+ Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
616
+ js_global_function =
617
+ Factory::NewFunction(name, JS_GLOBAL_OBJECT_TYPE,
618
+ JSGlobalObject::kSize, code, true);
619
+ // Change the constructor property of the prototype of the
620
+ // hidden global function to refer to the Object function.
621
+ Handle<JSObject> prototype =
622
+ Handle<JSObject>(
623
+ JSObject::cast(js_global_function->instance_prototype()));
624
+ SetProperty(prototype, Factory::constructor_symbol(),
625
+ Top::object_function(), NONE);
626
+ } else {
627
+ Handle<FunctionTemplateInfo> js_global_constructor(
628
+ FunctionTemplateInfo::cast(js_global_template->constructor()));
629
+ js_global_function =
630
+ Factory::CreateApiFunction(js_global_constructor,
631
+ Factory::InnerGlobalObject);
632
+ }
633
+
634
+ js_global_function->initial_map()->set_is_hidden_prototype();
635
+ object = Factory::NewGlobalObject(js_global_function);
636
+ }
637
+
638
+ // Set the global context for the global object.
639
+ object->set_global_context(*global_context());
640
+
641
+ // Step 2: create or re-initialize the global proxy object.
642
+ Handle<JSGlobalProxy> global_proxy;
643
+ {
644
+ Handle<JSFunction> global_proxy_function;
645
+ if (global_template.IsEmpty()) {
646
+ Handle<String> name = Handle<String>(Heap::empty_symbol());
647
+ Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
648
+ global_proxy_function =
649
+ Factory::NewFunction(name, JS_GLOBAL_PROXY_TYPE,
650
+ JSGlobalProxy::kSize, code, true);
651
+ } else {
652
+ Handle<ObjectTemplateInfo> data =
653
+ v8::Utils::OpenHandle(*global_template);
654
+ Handle<FunctionTemplateInfo> global_constructor(
655
+ FunctionTemplateInfo::cast(data->constructor()));
656
+ global_proxy_function =
657
+ Factory::CreateApiFunction(global_constructor,
658
+ Factory::OuterGlobalObject);
659
+ }
660
+
661
+ Handle<String> global_name = Factory::LookupAsciiSymbol("global");
662
+ global_proxy_function->shared()->set_instance_class_name(*global_name);
663
+ global_proxy_function->initial_map()->set_is_access_check_needed(true);
664
+
665
+ // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects
666
+
667
+ if (global_object.location() != NULL) {
668
+ ASSERT(global_object->IsJSGlobalProxy());
669
+ global_proxy =
670
+ ReinitializeJSGlobalProxy(
671
+ global_proxy_function,
672
+ Handle<JSGlobalProxy>::cast(global_object));
673
+ } else {
674
+ global_proxy = Handle<JSGlobalProxy>::cast(
675
+ Factory::NewJSObject(global_proxy_function, TENURED));
676
+ }
677
+
678
+ // Security setup: Set the security token of the global object to
679
+ // its the inner global. This makes the security check between two
680
+ // different contexts fail by default even in case of global
681
+ // object reinitialization.
682
+ object->set_global_receiver(*global_proxy);
683
+ global_proxy->set_context(*global_context());
684
+ }
685
+
686
+ { // --- G l o b a l C o n t e x t ---
687
+ // use the empty function as closure (no scope info)
688
+ global_context()->set_closure(*empty_function);
689
+ global_context()->set_fcontext(*global_context());
690
+ global_context()->set_previous(NULL);
691
+
692
+ // set extension and global object
693
+ global_context()->set_extension(*object);
694
+ global_context()->set_global(*object);
695
+ global_context()->set_global_proxy(*global_proxy);
696
+ // use inner global object as security token by default
697
+ global_context()->set_security_token(*object);
698
+ }
699
+
700
+ Handle<JSObject> global = Handle<JSObject>(global_context()->global());
701
+ SetProperty(global, object_name, Top::object_function(), DONT_ENUM);
702
+ }
703
+
704
+ Handle<JSObject> global = Handle<JSObject>(global_context()->global());
705
+
706
+ // Install global Function object
707
+ InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
708
+ empty_function, Builtins::Illegal, true); // ECMA native.
709
+
710
+ { // --- A r r a y ---
711
+ Handle<JSFunction> array_function =
712
+ InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
713
+ Top::initial_object_prototype(), Builtins::ArrayCode,
714
+ true);
715
+ array_function->shared()->set_construct_stub(
716
+ Builtins::builtin(Builtins::ArrayConstructCode));
717
+ array_function->shared()->DontAdaptArguments();
718
+
719
+ // This seems a bit hackish, but we need to make sure Array.length
720
+ // is 1.
721
+ array_function->shared()->set_length(1);
722
+ Handle<DescriptorArray> array_descriptors =
723
+ Factory::CopyAppendProxyDescriptor(
724
+ Factory::empty_descriptor_array(),
725
+ Factory::length_symbol(),
726
+ Factory::NewProxy(&Accessors::ArrayLength),
727
+ static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE));
728
+
729
+ // Cache the fast JavaScript array map
730
+ global_context()->set_js_array_map(array_function->initial_map());
731
+ global_context()->js_array_map()->set_instance_descriptors(
732
+ *array_descriptors);
733
+ // array_function is used internally. JS code creating array object should
734
+ // search for the 'Array' property on the global object and use that one
735
+ // as the constructor. 'Array' property on a global object can be
736
+ // overwritten by JS code.
737
+ global_context()->set_array_function(*array_function);
738
+ }
739
+
740
+ { // --- N u m b e r ---
741
+ Handle<JSFunction> number_fun =
742
+ InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
743
+ Top::initial_object_prototype(), Builtins::Illegal,
744
+ true);
745
+ global_context()->set_number_function(*number_fun);
746
+ }
747
+
748
+ { // --- B o o l e a n ---
749
+ Handle<JSFunction> boolean_fun =
750
+ InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
751
+ Top::initial_object_prototype(), Builtins::Illegal,
752
+ true);
753
+ global_context()->set_boolean_function(*boolean_fun);
754
+ }
755
+
756
+ { // --- S t r i n g ---
757
+ Handle<JSFunction> string_fun =
758
+ InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize,
759
+ Top::initial_object_prototype(), Builtins::Illegal,
760
+ true);
761
+ global_context()->set_string_function(*string_fun);
762
+ // Add 'length' property to strings.
763
+ Handle<DescriptorArray> string_descriptors =
764
+ Factory::CopyAppendProxyDescriptor(
765
+ Factory::empty_descriptor_array(),
766
+ Factory::length_symbol(),
767
+ Factory::NewProxy(&Accessors::StringLength),
768
+ static_cast<PropertyAttributes>(DONT_ENUM |
769
+ DONT_DELETE |
770
+ READ_ONLY));
771
+
772
+ Handle<Map> string_map =
773
+ Handle<Map>(global_context()->string_function()->initial_map());
774
+ string_map->set_instance_descriptors(*string_descriptors);
775
+ }
776
+
777
+ { // --- D a t e ---
778
+ // Builtin functions for Date.prototype.
779
+ Handle<JSFunction> date_fun =
780
+ InstallFunction(global, "Date", JS_VALUE_TYPE, JSValue::kSize,
781
+ Top::initial_object_prototype(), Builtins::Illegal,
782
+ true);
783
+
784
+ global_context()->set_date_function(*date_fun);
785
+ }
786
+
787
+
788
+ { // -- R e g E x p
789
+ // Builtin functions for RegExp.prototype.
790
+ Handle<JSFunction> regexp_fun =
791
+ InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
792
+ Top::initial_object_prototype(), Builtins::Illegal,
793
+ true);
794
+
795
+ global_context()->set_regexp_function(*regexp_fun);
796
+ }
797
+
798
+ { // -- J S O N
799
+ Handle<String> name = Factory::NewStringFromAscii(CStrVector("JSON"));
800
+ Handle<JSFunction> cons = Factory::NewFunction(
801
+ name,
802
+ Factory::the_hole_value());
803
+ cons->SetInstancePrototype(global_context()->initial_object_prototype());
804
+ cons->SetInstanceClassName(*name);
805
+ Handle<JSObject> json_object = Factory::NewJSObject(cons, TENURED);
806
+ ASSERT(json_object->IsJSObject());
807
+ SetProperty(global, name, json_object, DONT_ENUM);
808
+ global_context()->set_json_object(*json_object);
809
+ }
810
+
811
+ { // --- arguments_boilerplate_
812
+ // Make sure we can recognize argument objects at runtime.
813
+ // This is done by introducing an anonymous function with
814
+ // class_name equals 'Arguments'.
815
+ Handle<String> symbol = Factory::LookupAsciiSymbol("Arguments");
816
+ Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
817
+ Handle<JSObject> prototype =
818
+ Handle<JSObject>(
819
+ JSObject::cast(global_context()->object_function()->prototype()));
820
+
821
+ Handle<JSFunction> function =
822
+ Factory::NewFunctionWithPrototype(symbol,
823
+ JS_OBJECT_TYPE,
824
+ JSObject::kHeaderSize,
825
+ prototype,
826
+ code,
827
+ false);
828
+ ASSERT(!function->has_initial_map());
829
+ function->shared()->set_instance_class_name(*symbol);
830
+ function->shared()->set_expected_nof_properties(2);
831
+ Handle<JSObject> result = Factory::NewJSObject(function);
832
+
833
+ global_context()->set_arguments_boilerplate(*result);
834
+ // Note: callee must be added as the first property and
835
+ // length must be added as the second property.
836
+ SetProperty(result, Factory::callee_symbol(),
837
+ Factory::undefined_value(),
838
+ DONT_ENUM);
839
+ SetProperty(result, Factory::length_symbol(),
840
+ Factory::undefined_value(),
841
+ DONT_ENUM);
842
+
843
+ #ifdef DEBUG
844
+ LookupResult lookup;
845
+ result->LocalLookup(Heap::callee_symbol(), &lookup);
846
+ ASSERT(lookup.IsValid() && (lookup.type() == FIELD));
847
+ ASSERT(lookup.GetFieldIndex() == Heap::arguments_callee_index);
848
+
849
+ result->LocalLookup(Heap::length_symbol(), &lookup);
850
+ ASSERT(lookup.IsValid() && (lookup.type() == FIELD));
851
+ ASSERT(lookup.GetFieldIndex() == Heap::arguments_length_index);
852
+
853
+ ASSERT(result->map()->inobject_properties() > Heap::arguments_callee_index);
854
+ ASSERT(result->map()->inobject_properties() > Heap::arguments_length_index);
855
+
856
+ // Check the state of the object.
857
+ ASSERT(result->HasFastProperties());
858
+ ASSERT(result->HasFastElements());
859
+ #endif
860
+ }
861
+
862
+ { // --- context extension
863
+ // Create a function for the context extension objects.
864
+ Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
865
+ Handle<JSFunction> context_extension_fun =
866
+ Factory::NewFunction(Factory::empty_symbol(),
867
+ JS_CONTEXT_EXTENSION_OBJECT_TYPE,
868
+ JSObject::kHeaderSize,
869
+ code,
870
+ true);
871
+
872
+ Handle<String> name = Factory::LookupAsciiSymbol("context_extension");
873
+ context_extension_fun->shared()->set_instance_class_name(*name);
874
+ global_context()->set_context_extension_function(*context_extension_fun);
875
+ }
876
+
877
+
878
+ {
879
+ // Setup the call-as-function delegate.
880
+ Handle<Code> code =
881
+ Handle<Code>(Builtins::builtin(Builtins::HandleApiCallAsFunction));
882
+ Handle<JSFunction> delegate =
883
+ Factory::NewFunction(Factory::empty_symbol(), JS_OBJECT_TYPE,
884
+ JSObject::kHeaderSize, code, true);
885
+ global_context()->set_call_as_function_delegate(*delegate);
886
+ delegate->shared()->DontAdaptArguments();
887
+ }
888
+
889
+ {
890
+ // Setup the call-as-constructor delegate.
891
+ Handle<Code> code =
892
+ Handle<Code>(Builtins::builtin(Builtins::HandleApiCallAsConstructor));
893
+ Handle<JSFunction> delegate =
894
+ Factory::NewFunction(Factory::empty_symbol(), JS_OBJECT_TYPE,
895
+ JSObject::kHeaderSize, code, true);
896
+ global_context()->set_call_as_constructor_delegate(*delegate);
897
+ delegate->shared()->DontAdaptArguments();
898
+ }
899
+
900
+ global_context()->set_special_function_table(Heap::empty_fixed_array());
901
+
902
+ // Initialize the out of memory slot.
903
+ global_context()->set_out_of_memory(Heap::false_value());
904
+
905
+ // Initialize the data slot.
906
+ global_context()->set_data(Heap::undefined_value());
907
+ }
908
+
909
+
910
+ bool Genesis::CompileBuiltin(int index) {
911
+ Vector<const char> name = Natives::GetScriptName(index);
912
+ Handle<String> source_code = Bootstrapper::NativesSourceLookup(index);
913
+ return CompileNative(name, source_code);
914
+ }
915
+
916
+
917
+ bool Genesis::CompileNative(Vector<const char> name, Handle<String> source) {
918
+ HandleScope scope;
919
+ #ifdef ENABLE_DEBUGGER_SUPPORT
920
+ Debugger::set_compiling_natives(true);
921
+ #endif
922
+ bool result =
923
+ CompileScriptCached(name, source, &natives_cache, NULL, true);
924
+ ASSERT(Top::has_pending_exception() != result);
925
+ if (!result) Top::clear_pending_exception();
926
+ #ifdef ENABLE_DEBUGGER_SUPPORT
927
+ Debugger::set_compiling_natives(false);
928
+ #endif
929
+ return result;
930
+ }
931
+
932
+
933
+ bool Genesis::CompileScriptCached(Vector<const char> name,
934
+ Handle<String> source,
935
+ SourceCodeCache* cache,
936
+ v8::Extension* extension,
937
+ bool use_runtime_context) {
938
+ HandleScope scope;
939
+ Handle<JSFunction> boilerplate;
940
+
941
+ // If we can't find the function in the cache, we compile a new
942
+ // function and insert it into the cache.
943
+ if (!cache->Lookup(name, &boilerplate)) {
944
+ ASSERT(source->IsAsciiRepresentation());
945
+ Handle<String> script_name = Factory::NewStringFromUtf8(name);
946
+ boilerplate =
947
+ Compiler::Compile(source, script_name, 0, 0, extension, NULL);
948
+ if (boilerplate.is_null()) return false;
949
+ cache->Add(name, boilerplate);
950
+ }
951
+
952
+ // Setup the function context. Conceptually, we should clone the
953
+ // function before overwriting the context but since we're in a
954
+ // single-threaded environment it is not strictly necessary.
955
+ ASSERT(Top::context()->IsGlobalContext());
956
+ Handle<Context> context =
957
+ Handle<Context>(use_runtime_context
958
+ ? Top::context()->runtime_context()
959
+ : Top::context());
960
+ Handle<JSFunction> fun =
961
+ Factory::NewFunctionFromBoilerplate(boilerplate, context);
962
+
963
+ // Call function using the either the runtime object or the global
964
+ // object as the receiver. Provide no parameters.
965
+ Handle<Object> receiver =
966
+ Handle<Object>(use_runtime_context
967
+ ? Top::context()->builtins()
968
+ : Top::context()->global());
969
+ bool has_pending_exception;
970
+ Handle<Object> result =
971
+ Execution::Call(fun, receiver, 0, NULL, &has_pending_exception);
972
+ if (has_pending_exception) return false;
973
+ return PendingFixups::Process(
974
+ Handle<JSBuiltinsObject>(Top::context()->builtins()));
975
+ }
976
+
977
+
978
+ #define INSTALL_NATIVE(Type, name, var) \
979
+ Handle<String> var##_name = Factory::LookupAsciiSymbol(name); \
980
+ global_context()->set_##var(Type::cast(global_context()-> \
981
+ builtins()-> \
982
+ GetProperty(*var##_name)));
983
+
984
+ void Genesis::InstallNativeFunctions() {
985
+ HandleScope scope;
986
+ INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun);
987
+ INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun);
988
+ INSTALL_NATIVE(JSFunction, "ToString", to_string_fun);
989
+ INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun);
990
+ INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun);
991
+ INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun);
992
+ INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun);
993
+ INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun);
994
+ INSTALL_NATIVE(JSFunction, "ToBoolean", to_boolean_fun);
995
+ INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun);
996
+ INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun);
997
+ INSTALL_NATIVE(JSFunction, "ConfigureTemplateInstance",
998
+ configure_instance_fun);
999
+ INSTALL_NATIVE(JSFunction, "MakeMessage", make_message_fun);
1000
+ INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun);
1001
+ INSTALL_NATIVE(JSObject, "functionCache", function_cache);
1002
+ }
1003
+
1004
+ #undef INSTALL_NATIVE
1005
+
1006
+
1007
+ bool Genesis::InstallNatives() {
1008
+ HandleScope scope;
1009
+
1010
+ // Create a function for the builtins object. Allocate space for the
1011
+ // JavaScript builtins, a reference to the builtins object
1012
+ // (itself) and a reference to the global_context directly in the object.
1013
+ Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
1014
+ Handle<JSFunction> builtins_fun =
1015
+ Factory::NewFunction(Factory::empty_symbol(), JS_BUILTINS_OBJECT_TYPE,
1016
+ JSBuiltinsObject::kSize, code, true);
1017
+
1018
+ Handle<String> name = Factory::LookupAsciiSymbol("builtins");
1019
+ builtins_fun->shared()->set_instance_class_name(*name);
1020
+
1021
+ // Allocate the builtins object.
1022
+ Handle<JSBuiltinsObject> builtins =
1023
+ Handle<JSBuiltinsObject>::cast(Factory::NewGlobalObject(builtins_fun));
1024
+ builtins->set_builtins(*builtins);
1025
+ builtins->set_global_context(*global_context());
1026
+ builtins->set_global_receiver(*builtins);
1027
+
1028
+ // Setup the 'global' properties of the builtins object. The
1029
+ // 'global' property that refers to the global object is the only
1030
+ // way to get from code running in the builtins context to the
1031
+ // global object.
1032
+ static const PropertyAttributes attributes =
1033
+ static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE);
1034
+ SetProperty(builtins, Factory::LookupAsciiSymbol("global"),
1035
+ Handle<Object>(global_context()->global()), attributes);
1036
+
1037
+ // Setup the reference from the global object to the builtins object.
1038
+ JSGlobalObject::cast(global_context()->global())->set_builtins(*builtins);
1039
+
1040
+ // Create a bridge function that has context in the global context.
1041
+ Handle<JSFunction> bridge =
1042
+ Factory::NewFunction(Factory::empty_symbol(), Factory::undefined_value());
1043
+ ASSERT(bridge->context() == *Top::global_context());
1044
+
1045
+ // Allocate the builtins context.
1046
+ Handle<Context> context =
1047
+ Factory::NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge);
1048
+ context->set_global(*builtins); // override builtins global object
1049
+
1050
+ global_context()->set_runtime_context(*context);
1051
+
1052
+ { // -- S c r i p t
1053
+ // Builtin functions for Script.
1054
+ Handle<JSFunction> script_fun =
1055
+ InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize,
1056
+ Top::initial_object_prototype(), Builtins::Illegal,
1057
+ false);
1058
+ Handle<JSObject> prototype =
1059
+ Factory::NewJSObject(Top::object_function(), TENURED);
1060
+ SetPrototype(script_fun, prototype);
1061
+ global_context()->set_script_function(*script_fun);
1062
+
1063
+ // Add 'source' and 'data' property to scripts.
1064
+ PropertyAttributes common_attributes =
1065
+ static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
1066
+ Handle<Proxy> proxy_source = Factory::NewProxy(&Accessors::ScriptSource);
1067
+ Handle<DescriptorArray> script_descriptors =
1068
+ Factory::CopyAppendProxyDescriptor(
1069
+ Factory::empty_descriptor_array(),
1070
+ Factory::LookupAsciiSymbol("source"),
1071
+ proxy_source,
1072
+ common_attributes);
1073
+ Handle<Proxy> proxy_name = Factory::NewProxy(&Accessors::ScriptName);
1074
+ script_descriptors =
1075
+ Factory::CopyAppendProxyDescriptor(
1076
+ script_descriptors,
1077
+ Factory::LookupAsciiSymbol("name"),
1078
+ proxy_name,
1079
+ common_attributes);
1080
+ Handle<Proxy> proxy_id = Factory::NewProxy(&Accessors::ScriptId);
1081
+ script_descriptors =
1082
+ Factory::CopyAppendProxyDescriptor(
1083
+ script_descriptors,
1084
+ Factory::LookupAsciiSymbol("id"),
1085
+ proxy_id,
1086
+ common_attributes);
1087
+ Handle<Proxy> proxy_line_offset =
1088
+ Factory::NewProxy(&Accessors::ScriptLineOffset);
1089
+ script_descriptors =
1090
+ Factory::CopyAppendProxyDescriptor(
1091
+ script_descriptors,
1092
+ Factory::LookupAsciiSymbol("line_offset"),
1093
+ proxy_line_offset,
1094
+ common_attributes);
1095
+ Handle<Proxy> proxy_column_offset =
1096
+ Factory::NewProxy(&Accessors::ScriptColumnOffset);
1097
+ script_descriptors =
1098
+ Factory::CopyAppendProxyDescriptor(
1099
+ script_descriptors,
1100
+ Factory::LookupAsciiSymbol("column_offset"),
1101
+ proxy_column_offset,
1102
+ common_attributes);
1103
+ Handle<Proxy> proxy_data = Factory::NewProxy(&Accessors::ScriptData);
1104
+ script_descriptors =
1105
+ Factory::CopyAppendProxyDescriptor(
1106
+ script_descriptors,
1107
+ Factory::LookupAsciiSymbol("data"),
1108
+ proxy_data,
1109
+ common_attributes);
1110
+ Handle<Proxy> proxy_type = Factory::NewProxy(&Accessors::ScriptType);
1111
+ script_descriptors =
1112
+ Factory::CopyAppendProxyDescriptor(
1113
+ script_descriptors,
1114
+ Factory::LookupAsciiSymbol("type"),
1115
+ proxy_type,
1116
+ common_attributes);
1117
+ Handle<Proxy> proxy_compilation_type =
1118
+ Factory::NewProxy(&Accessors::ScriptCompilationType);
1119
+ script_descriptors =
1120
+ Factory::CopyAppendProxyDescriptor(
1121
+ script_descriptors,
1122
+ Factory::LookupAsciiSymbol("compilation_type"),
1123
+ proxy_compilation_type,
1124
+ common_attributes);
1125
+ Handle<Proxy> proxy_line_ends =
1126
+ Factory::NewProxy(&Accessors::ScriptLineEnds);
1127
+ script_descriptors =
1128
+ Factory::CopyAppendProxyDescriptor(
1129
+ script_descriptors,
1130
+ Factory::LookupAsciiSymbol("line_ends"),
1131
+ proxy_line_ends,
1132
+ common_attributes);
1133
+ Handle<Proxy> proxy_context_data =
1134
+ Factory::NewProxy(&Accessors::ScriptContextData);
1135
+ script_descriptors =
1136
+ Factory::CopyAppendProxyDescriptor(
1137
+ script_descriptors,
1138
+ Factory::LookupAsciiSymbol("context_data"),
1139
+ proxy_context_data,
1140
+ common_attributes);
1141
+ Handle<Proxy> proxy_eval_from_script =
1142
+ Factory::NewProxy(&Accessors::ScriptEvalFromScript);
1143
+ script_descriptors =
1144
+ Factory::CopyAppendProxyDescriptor(
1145
+ script_descriptors,
1146
+ Factory::LookupAsciiSymbol("eval_from_script"),
1147
+ proxy_eval_from_script,
1148
+ common_attributes);
1149
+ Handle<Proxy> proxy_eval_from_script_position =
1150
+ Factory::NewProxy(&Accessors::ScriptEvalFromScriptPosition);
1151
+ script_descriptors =
1152
+ Factory::CopyAppendProxyDescriptor(
1153
+ script_descriptors,
1154
+ Factory::LookupAsciiSymbol("eval_from_script_position"),
1155
+ proxy_eval_from_script_position,
1156
+ common_attributes);
1157
+ Handle<Proxy> proxy_eval_from_function_name =
1158
+ Factory::NewProxy(&Accessors::ScriptEvalFromFunctionName);
1159
+ script_descriptors =
1160
+ Factory::CopyAppendProxyDescriptor(
1161
+ script_descriptors,
1162
+ Factory::LookupAsciiSymbol("eval_from_function_name"),
1163
+ proxy_eval_from_function_name,
1164
+ common_attributes);
1165
+
1166
+ Handle<Map> script_map = Handle<Map>(script_fun->initial_map());
1167
+ script_map->set_instance_descriptors(*script_descriptors);
1168
+
1169
+ // Allocate the empty script.
1170
+ Handle<Script> script = Factory::NewScript(Factory::empty_string());
1171
+ script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
1172
+ global_context()->set_empty_script(*script);
1173
+ }
1174
+
1175
+ if (FLAG_natives_file == NULL) {
1176
+ // Without natives file, install default natives.
1177
+ for (int i = Natives::GetDelayCount();
1178
+ i < Natives::GetBuiltinsCount();
1179
+ i++) {
1180
+ if (!CompileBuiltin(i)) return false;
1181
+ }
1182
+
1183
+ // Setup natives with lazy loading.
1184
+ SetupLazy(Handle<JSFunction>(global_context()->date_function()),
1185
+ Natives::GetIndex("date"),
1186
+ Top::global_context(),
1187
+ Handle<Context>(Top::context()->runtime_context()));
1188
+ SetupLazy(Handle<JSFunction>(global_context()->regexp_function()),
1189
+ Natives::GetIndex("regexp"),
1190
+ Top::global_context(),
1191
+ Handle<Context>(Top::context()->runtime_context()));
1192
+ SetupLazy(Handle<JSObject>(global_context()->json_object()),
1193
+ Natives::GetIndex("json"),
1194
+ Top::global_context(),
1195
+ Handle<Context>(Top::context()->runtime_context()));
1196
+
1197
+ } else if (strlen(FLAG_natives_file) != 0) {
1198
+ // Otherwise install natives from natives file if file exists and
1199
+ // compiles.
1200
+ bool exists;
1201
+ Vector<const char> source = ReadFile(FLAG_natives_file, &exists);
1202
+ Handle<String> source_string = Factory::NewStringFromAscii(source);
1203
+ if (source.is_empty()) return false;
1204
+ bool result = CompileNative(CStrVector(FLAG_natives_file), source_string);
1205
+ if (!result) return false;
1206
+
1207
+ } else {
1208
+ // Empty natives file name - do not install any natives.
1209
+ PrintF("Warning: Running without installed natives!\n");
1210
+ return true;
1211
+ }
1212
+
1213
+ InstallNativeFunctions();
1214
+
1215
+ // Install Function.prototype.call and apply.
1216
+ { Handle<String> key = Factory::function_class_symbol();
1217
+ Handle<JSFunction> function =
1218
+ Handle<JSFunction>::cast(GetProperty(Top::global(), key));
1219
+ Handle<JSObject> proto =
1220
+ Handle<JSObject>(JSObject::cast(function->instance_prototype()));
1221
+
1222
+ // Install the call and the apply functions.
1223
+ Handle<JSFunction> call =
1224
+ InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1225
+ Factory::NewJSObject(Top::object_function(), TENURED),
1226
+ Builtins::FunctionCall,
1227
+ false);
1228
+ Handle<JSFunction> apply =
1229
+ InstallFunction(proto, "apply", JS_OBJECT_TYPE, JSObject::kHeaderSize,
1230
+ Factory::NewJSObject(Top::object_function(), TENURED),
1231
+ Builtins::FunctionApply,
1232
+ false);
1233
+
1234
+ // Make sure that Function.prototype.call appears to be compiled.
1235
+ // The code will never be called, but inline caching for call will
1236
+ // only work if it appears to be compiled.
1237
+ call->shared()->DontAdaptArguments();
1238
+ ASSERT(call->is_compiled());
1239
+
1240
+ // Set the expected parameters for apply to 2; required by builtin.
1241
+ apply->shared()->set_formal_parameter_count(2);
1242
+
1243
+ // Set the lengths for the functions to satisfy ECMA-262.
1244
+ call->shared()->set_length(1);
1245
+ apply->shared()->set_length(2);
1246
+ }
1247
+
1248
+ #ifdef DEBUG
1249
+ builtins->Verify();
1250
+ #endif
1251
+ return true;
1252
+ }
1253
+
1254
+
1255
+ bool Genesis::InstallSpecialObjects() {
1256
+ HandleScope scope;
1257
+ Handle<JSGlobalObject> js_global(
1258
+ JSGlobalObject::cast(global_context()->global()));
1259
+ // Expose the natives in global if a name for it is specified.
1260
+ if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) {
1261
+ Handle<String> natives_string =
1262
+ Factory::LookupAsciiSymbol(FLAG_expose_natives_as);
1263
+ SetProperty(js_global, natives_string,
1264
+ Handle<JSObject>(js_global->builtins()), DONT_ENUM);
1265
+ }
1266
+
1267
+ Handle<Object> Error = GetProperty(js_global, "Error");
1268
+ if (Error->IsJSObject()) {
1269
+ Handle<String> name = Factory::LookupAsciiSymbol("stackTraceLimit");
1270
+ SetProperty(Handle<JSObject>::cast(Error),
1271
+ name,
1272
+ Handle<Smi>(Smi::FromInt(FLAG_stack_trace_limit)),
1273
+ NONE);
1274
+ }
1275
+
1276
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1277
+ // Expose the debug global object in global if a name for it is specified.
1278
+ if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
1279
+ // If loading fails we just bail out without installing the
1280
+ // debugger but without tanking the whole context.
1281
+ if (!Debug::Load())
1282
+ return true;
1283
+ // Set the security token for the debugger context to the same as
1284
+ // the shell global context to allow calling between these (otherwise
1285
+ // exposing debug global object doesn't make much sense).
1286
+ Debug::debug_context()->set_security_token(
1287
+ global_context()->security_token());
1288
+
1289
+ Handle<String> debug_string =
1290
+ Factory::LookupAsciiSymbol(FLAG_expose_debug_as);
1291
+ SetProperty(js_global, debug_string,
1292
+ Handle<Object>(Debug::debug_context()->global_proxy()), DONT_ENUM);
1293
+ }
1294
+ #endif
1295
+
1296
+ return true;
1297
+ }
1298
+
1299
+
1300
+ bool Genesis::InstallExtensions(v8::ExtensionConfiguration* extensions) {
1301
+ // Clear coloring of extension list
1302
+ v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension();
1303
+ while (current != NULL) {
1304
+ current->set_state(v8::UNVISITED);
1305
+ current = current->next();
1306
+ }
1307
+ // Install auto extensions
1308
+ current = v8::RegisteredExtension::first_extension();
1309
+ while (current != NULL) {
1310
+ if (current->extension()->auto_enable())
1311
+ InstallExtension(current);
1312
+ current = current->next();
1313
+ }
1314
+
1315
+ if (FLAG_expose_gc) InstallExtension("v8/gc");
1316
+
1317
+ if (extensions == NULL) return true;
1318
+ // Install required extensions
1319
+ int count = v8::ImplementationUtilities::GetNameCount(extensions);
1320
+ const char** names = v8::ImplementationUtilities::GetNames(extensions);
1321
+ for (int i = 0; i < count; i++) {
1322
+ if (!InstallExtension(names[i]))
1323
+ return false;
1324
+ }
1325
+
1326
+ return true;
1327
+ }
1328
+
1329
+
1330
+ // Installs a named extension. This methods is unoptimized and does
1331
+ // not scale well if we want to support a large number of extensions.
1332
+ bool Genesis::InstallExtension(const char* name) {
1333
+ v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension();
1334
+ // Loop until we find the relevant extension
1335
+ while (current != NULL) {
1336
+ if (strcmp(name, current->extension()->name()) == 0) break;
1337
+ current = current->next();
1338
+ }
1339
+ // Didn't find the extension; fail.
1340
+ if (current == NULL) {
1341
+ v8::Utils::ReportApiFailure(
1342
+ "v8::Context::New()", "Cannot find required extension");
1343
+ return false;
1344
+ }
1345
+ return InstallExtension(current);
1346
+ }
1347
+
1348
+
1349
+ bool Genesis::InstallExtension(v8::RegisteredExtension* current) {
1350
+ HandleScope scope;
1351
+
1352
+ if (current->state() == v8::INSTALLED) return true;
1353
+ // The current node has already been visited so there must be a
1354
+ // cycle in the dependency graph; fail.
1355
+ if (current->state() == v8::VISITED) {
1356
+ v8::Utils::ReportApiFailure(
1357
+ "v8::Context::New()", "Circular extension dependency");
1358
+ return false;
1359
+ }
1360
+ ASSERT(current->state() == v8::UNVISITED);
1361
+ current->set_state(v8::VISITED);
1362
+ v8::Extension* extension = current->extension();
1363
+ // Install the extension's dependencies
1364
+ for (int i = 0; i < extension->dependency_count(); i++) {
1365
+ if (!InstallExtension(extension->dependencies()[i])) return false;
1366
+ }
1367
+ Vector<const char> source = CStrVector(extension->source());
1368
+ Handle<String> source_code = Factory::NewStringFromAscii(source);
1369
+ bool result = CompileScriptCached(CStrVector(extension->name()),
1370
+ source_code,
1371
+ &extensions_cache, extension,
1372
+ false);
1373
+ ASSERT(Top::has_pending_exception() != result);
1374
+ if (!result) {
1375
+ Top::clear_pending_exception();
1376
+ }
1377
+ current->set_state(v8::INSTALLED);
1378
+ return result;
1379
+ }
1380
+
1381
+
1382
+ bool Genesis::ConfigureGlobalObjects(
1383
+ v8::Handle<v8::ObjectTemplate> global_proxy_template) {
1384
+ Handle<JSObject> global_proxy(
1385
+ JSObject::cast(global_context()->global_proxy()));
1386
+ Handle<JSObject> js_global(JSObject::cast(global_context()->global()));
1387
+
1388
+ if (!global_proxy_template.IsEmpty()) {
1389
+ // Configure the global proxy object.
1390
+ Handle<ObjectTemplateInfo> proxy_data =
1391
+ v8::Utils::OpenHandle(*global_proxy_template);
1392
+ if (!ConfigureApiObject(global_proxy, proxy_data)) return false;
1393
+
1394
+ // Configure the inner global object.
1395
+ Handle<FunctionTemplateInfo> proxy_constructor(
1396
+ FunctionTemplateInfo::cast(proxy_data->constructor()));
1397
+ if (!proxy_constructor->prototype_template()->IsUndefined()) {
1398
+ Handle<ObjectTemplateInfo> inner_data(
1399
+ ObjectTemplateInfo::cast(proxy_constructor->prototype_template()));
1400
+ if (!ConfigureApiObject(js_global, inner_data)) return false;
1401
+ }
1402
+ }
1403
+
1404
+ SetObjectPrototype(global_proxy, js_global);
1405
+ return true;
1406
+ }
1407
+
1408
+
1409
+ bool Genesis::ConfigureApiObject(Handle<JSObject> object,
1410
+ Handle<ObjectTemplateInfo> object_template) {
1411
+ ASSERT(!object_template.is_null());
1412
+ ASSERT(object->IsInstanceOf(
1413
+ FunctionTemplateInfo::cast(object_template->constructor())));
1414
+
1415
+ bool pending_exception = false;
1416
+ Handle<JSObject> obj =
1417
+ Execution::InstantiateObject(object_template, &pending_exception);
1418
+ if (pending_exception) {
1419
+ ASSERT(Top::has_pending_exception());
1420
+ Top::clear_pending_exception();
1421
+ return false;
1422
+ }
1423
+ TransferObject(obj, object);
1424
+ return true;
1425
+ }
1426
+
1427
+
1428
+ void Genesis::TransferNamedProperties(Handle<JSObject> from,
1429
+ Handle<JSObject> to) {
1430
+ if (from->HasFastProperties()) {
1431
+ Handle<DescriptorArray> descs =
1432
+ Handle<DescriptorArray>(from->map()->instance_descriptors());
1433
+ for (int i = 0; i < descs->number_of_descriptors(); i++) {
1434
+ PropertyDetails details = PropertyDetails(descs->GetDetails(i));
1435
+ switch (details.type()) {
1436
+ case FIELD: {
1437
+ HandleScope inner;
1438
+ Handle<String> key = Handle<String>(descs->GetKey(i));
1439
+ int index = descs->GetFieldIndex(i);
1440
+ Handle<Object> value = Handle<Object>(from->FastPropertyAt(index));
1441
+ SetProperty(to, key, value, details.attributes());
1442
+ break;
1443
+ }
1444
+ case CONSTANT_FUNCTION: {
1445
+ HandleScope inner;
1446
+ Handle<String> key = Handle<String>(descs->GetKey(i));
1447
+ Handle<JSFunction> fun =
1448
+ Handle<JSFunction>(descs->GetConstantFunction(i));
1449
+ SetProperty(to, key, fun, details.attributes());
1450
+ break;
1451
+ }
1452
+ case CALLBACKS: {
1453
+ LookupResult result;
1454
+ to->LocalLookup(descs->GetKey(i), &result);
1455
+ // If the property is already there we skip it
1456
+ if (result.IsValid()) continue;
1457
+ HandleScope inner;
1458
+ Handle<DescriptorArray> inst_descs =
1459
+ Handle<DescriptorArray>(to->map()->instance_descriptors());
1460
+ Handle<String> key = Handle<String>(descs->GetKey(i));
1461
+ Handle<Object> entry = Handle<Object>(descs->GetCallbacksObject(i));
1462
+ inst_descs = Factory::CopyAppendProxyDescriptor(inst_descs,
1463
+ key,
1464
+ entry,
1465
+ details.attributes());
1466
+ to->map()->set_instance_descriptors(*inst_descs);
1467
+ break;
1468
+ }
1469
+ case MAP_TRANSITION:
1470
+ case CONSTANT_TRANSITION:
1471
+ case NULL_DESCRIPTOR:
1472
+ // Ignore non-properties.
1473
+ break;
1474
+ case NORMAL:
1475
+ // Do not occur since the from object has fast properties.
1476
+ case INTERCEPTOR:
1477
+ // No element in instance descriptors have interceptor type.
1478
+ UNREACHABLE();
1479
+ break;
1480
+ }
1481
+ }
1482
+ } else {
1483
+ Handle<StringDictionary> properties =
1484
+ Handle<StringDictionary>(from->property_dictionary());
1485
+ int capacity = properties->Capacity();
1486
+ for (int i = 0; i < capacity; i++) {
1487
+ Object* raw_key(properties->KeyAt(i));
1488
+ if (properties->IsKey(raw_key)) {
1489
+ ASSERT(raw_key->IsString());
1490
+ // If the property is already there we skip it.
1491
+ LookupResult result;
1492
+ to->LocalLookup(String::cast(raw_key), &result);
1493
+ if (result.IsValid()) continue;
1494
+ // Set the property.
1495
+ Handle<String> key = Handle<String>(String::cast(raw_key));
1496
+ Handle<Object> value = Handle<Object>(properties->ValueAt(i));
1497
+ if (value->IsJSGlobalPropertyCell()) {
1498
+ value = Handle<Object>(JSGlobalPropertyCell::cast(*value)->value());
1499
+ }
1500
+ PropertyDetails details = properties->DetailsAt(i);
1501
+ SetProperty(to, key, value, details.attributes());
1502
+ }
1503
+ }
1504
+ }
1505
+ }
1506
+
1507
+
1508
+ void Genesis::TransferIndexedProperties(Handle<JSObject> from,
1509
+ Handle<JSObject> to) {
1510
+ // Cloning the elements array is sufficient.
1511
+ Handle<FixedArray> from_elements =
1512
+ Handle<FixedArray>(FixedArray::cast(from->elements()));
1513
+ Handle<FixedArray> to_elements = Factory::CopyFixedArray(from_elements);
1514
+ to->set_elements(*to_elements);
1515
+ }
1516
+
1517
+
1518
+ void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) {
1519
+ HandleScope outer;
1520
+
1521
+ ASSERT(!from->IsJSArray());
1522
+ ASSERT(!to->IsJSArray());
1523
+
1524
+ TransferNamedProperties(from, to);
1525
+ TransferIndexedProperties(from, to);
1526
+
1527
+ // Transfer the prototype (new map is needed).
1528
+ Handle<Map> old_to_map = Handle<Map>(to->map());
1529
+ Handle<Map> new_to_map = Factory::CopyMapDropTransitions(old_to_map);
1530
+ new_to_map->set_prototype(from->map()->prototype());
1531
+ to->set_map(*new_to_map);
1532
+ }
1533
+
1534
+
1535
+ void Genesis::MakeFunctionInstancePrototypeWritable() {
1536
+ // Make a new function map so all future functions
1537
+ // will have settable and enumerable prototype properties.
1538
+ HandleScope scope;
1539
+
1540
+ Handle<DescriptorArray> function_map_descriptors =
1541
+ ComputeFunctionInstanceDescriptor(false);
1542
+ Handle<Map> fm = Factory::CopyMapDropDescriptors(Top::function_map());
1543
+ fm->set_instance_descriptors(*function_map_descriptors);
1544
+ Top::context()->global_context()->set_function_map(*fm);
1545
+ }
1546
+
1547
+
1548
+ void Genesis::AddSpecialFunction(Handle<JSObject> prototype,
1549
+ const char* name,
1550
+ Handle<Code> code) {
1551
+ Handle<String> key = Factory::LookupAsciiSymbol(name);
1552
+ Handle<Object> value = Handle<Object>(prototype->GetProperty(*key));
1553
+ if (value->IsJSFunction()) {
1554
+ Handle<JSFunction> optimized = Factory::NewFunction(key,
1555
+ JS_OBJECT_TYPE,
1556
+ JSObject::kHeaderSize,
1557
+ code,
1558
+ false);
1559
+ optimized->shared()->DontAdaptArguments();
1560
+ int len = global_context()->special_function_table()->length();
1561
+ Handle<FixedArray> new_array = Factory::NewFixedArray(len + 3);
1562
+ for (int index = 0; index < len; index++) {
1563
+ new_array->set(index,
1564
+ global_context()->special_function_table()->get(index));
1565
+ }
1566
+ new_array->set(len+0, *prototype);
1567
+ new_array->set(len+1, *value);
1568
+ new_array->set(len+2, *optimized);
1569
+ global_context()->set_special_function_table(*new_array);
1570
+ }
1571
+ }
1572
+
1573
+
1574
+ void Genesis::BuildSpecialFunctionTable() {
1575
+ HandleScope scope;
1576
+ Handle<JSObject> global = Handle<JSObject>(global_context()->global());
1577
+ // Add special versions for Array.prototype.pop and push.
1578
+ Handle<JSFunction> function =
1579
+ Handle<JSFunction>(
1580
+ JSFunction::cast(global->GetProperty(Heap::Array_symbol())));
1581
+ Handle<JSObject> visible_prototype =
1582
+ Handle<JSObject>(JSObject::cast(function->prototype()));
1583
+ // Remember to put push and pop on the hidden prototype if it's there.
1584
+ Handle<JSObject> push_and_pop_prototype;
1585
+ Handle<Object> superproto(visible_prototype->GetPrototype());
1586
+ if (superproto->IsJSObject() &&
1587
+ JSObject::cast(*superproto)->map()->is_hidden_prototype()) {
1588
+ push_and_pop_prototype = Handle<JSObject>::cast(superproto);
1589
+ } else {
1590
+ push_and_pop_prototype = visible_prototype;
1591
+ }
1592
+ AddSpecialFunction(push_and_pop_prototype, "pop",
1593
+ Handle<Code>(Builtins::builtin(Builtins::ArrayPop)));
1594
+ AddSpecialFunction(push_and_pop_prototype, "push",
1595
+ Handle<Code>(Builtins::builtin(Builtins::ArrayPush)));
1596
+ }
1597
+
1598
+
1599
+ Genesis::Genesis(Handle<Object> global_object,
1600
+ v8::Handle<v8::ObjectTemplate> global_template,
1601
+ v8::ExtensionConfiguration* extensions) {
1602
+ // Link this genesis object into the stacked genesis chain. This
1603
+ // must be done before any early exits because the destructor
1604
+ // will always do unlinking.
1605
+ previous_ = current_;
1606
+ current_ = this;
1607
+ result_ = Handle<Context>::null();
1608
+
1609
+ // If V8 isn't running and cannot be initialized, just return.
1610
+ if (!V8::IsRunning() && !V8::Initialize(NULL)) return;
1611
+
1612
+ // Before creating the roots we must save the context and restore it
1613
+ // on all function exits.
1614
+ HandleScope scope;
1615
+ SaveContext context;
1616
+
1617
+ CreateRoots(global_template, global_object);
1618
+
1619
+ if (!InstallNatives()) return;
1620
+
1621
+ MakeFunctionInstancePrototypeWritable();
1622
+ BuildSpecialFunctionTable();
1623
+
1624
+ if (!ConfigureGlobalObjects(global_template)) return;
1625
+
1626
+ if (!InstallExtensions(extensions)) return;
1627
+
1628
+ if (!InstallSpecialObjects()) return;
1629
+
1630
+ result_ = global_context_;
1631
+ }
1632
+
1633
+
1634
+ // Support for thread preemption.
1635
+
1636
+ // Reserve space for statics needing saving and restoring.
1637
+ int Bootstrapper::ArchiveSpacePerThread() {
1638
+ return Genesis::ArchiveSpacePerThread();
1639
+ }
1640
+
1641
+
1642
+ // Archive statics that are thread local.
1643
+ char* Bootstrapper::ArchiveState(char* to) {
1644
+ return Genesis::ArchiveState(to);
1645
+ }
1646
+
1647
+
1648
+ // Restore statics that are thread local.
1649
+ char* Bootstrapper::RestoreState(char* from) {
1650
+ return Genesis::RestoreState(from);
1651
+ }
1652
+
1653
+
1654
+ // Called when the top-level V8 mutex is destroyed.
1655
+ void Bootstrapper::FreeThreadResources() {
1656
+ ASSERT(Genesis::current() == NULL);
1657
+ }
1658
+
1659
+
1660
+ // Reserve space for statics needing saving and restoring.
1661
+ int Genesis::ArchiveSpacePerThread() {
1662
+ return sizeof(current_);
1663
+ }
1664
+
1665
+
1666
+ // Archive statics that are thread local.
1667
+ char* Genesis::ArchiveState(char* to) {
1668
+ *reinterpret_cast<Genesis**>(to) = current_;
1669
+ current_ = NULL;
1670
+ return to + sizeof(current_);
1671
+ }
1672
+
1673
+
1674
+ // Restore statics that are thread local.
1675
+ char* Genesis::RestoreState(char* from) {
1676
+ current_ = *reinterpret_cast<Genesis**>(from);
1677
+ return from + sizeof(current_);
1678
+ }
1679
+
1680
+ } } // namespace v8::internal