therubyracer 0.7.4 → 0.7.5

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

Potentially problematic release.


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

Files changed (482) hide show
  1. data/History.txt +11 -0
  2. data/Rakefile +1 -1
  3. data/ext/v8/extconf.rb +0 -18
  4. data/ext/v8/rr.cpp +2 -2
  5. data/ext/v8/upstream/{2.1.10 → 2.3.3}/AUTHORS +1 -0
  6. data/ext/v8/upstream/{2.1.10 → 2.3.3}/ChangeLog +239 -0
  7. data/ext/v8/upstream/{2.1.10 → 2.3.3}/LICENSE +0 -0
  8. data/ext/v8/upstream/{2.1.10 → 2.3.3}/SConstruct +29 -17
  9. data/ext/v8/upstream/{2.1.10 → 2.3.3}/include/v8-debug.h +61 -3
  10. data/ext/v8/upstream/{2.1.10 → 2.3.3}/include/v8-profiler.h +182 -5
  11. data/ext/v8/upstream/{2.1.10 → 2.3.3}/include/v8.h +458 -257
  12. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/SConscript +2 -5
  13. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/accessors.cc +2 -2
  14. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/accessors.h +0 -0
  15. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/allocation.cc +0 -0
  16. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/allocation.h +0 -0
  17. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/api.cc +574 -30
  18. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/api.h +12 -10
  19. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/apinatives.js +0 -0
  20. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/apiutils.h +0 -0
  21. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arguments.h +0 -0
  22. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/assembler-arm-inl.h +38 -15
  23. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/assembler-arm.cc +646 -101
  24. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/assembler-arm.h +174 -15
  25. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/builtins-arm.cc +56 -47
  26. data/ext/v8/upstream/2.3.3/src/arm/codegen-arm-inl.h +48 -0
  27. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/codegen-arm.cc +2957 -1448
  28. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/codegen-arm.h +230 -74
  29. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/constants-arm.cc +25 -1
  30. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/constants-arm.h +16 -1
  31. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/cpu-arm.cc +4 -0
  32. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/debug-arm.cc +76 -6
  33. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/disasm-arm.cc +168 -20
  34. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/fast-codegen-arm.cc +5 -2
  35. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/frames-arm.cc +4 -4
  36. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/frames-arm.h +0 -0
  37. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/full-codegen-arm.cc +1558 -248
  38. data/ext/v8/upstream/2.3.3/src/arm/ic-arm.cc +2258 -0
  39. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/jump-target-arm.cc +55 -103
  40. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/macro-assembler-arm.cc +358 -185
  41. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/macro-assembler-arm.h +136 -41
  42. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/regexp-macro-assembler-arm.cc +26 -5
  43. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/regexp-macro-assembler-arm.h +0 -0
  44. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/register-allocator-arm-inl.h +0 -0
  45. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/register-allocator-arm.cc +4 -0
  46. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/register-allocator-arm.h +0 -0
  47. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/simulator-arm.cc +203 -22
  48. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/simulator-arm.h +7 -0
  49. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/stub-cache-arm.cc +531 -324
  50. data/ext/v8/upstream/2.3.3/src/arm/virtual-frame-arm-inl.h +59 -0
  51. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/virtual-frame-arm.cc +247 -81
  52. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/arm/virtual-frame-arm.h +99 -83
  53. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/array.js +2 -2
  54. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/assembler.cc +6 -13
  55. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/assembler.h +36 -10
  56. data/ext/v8/upstream/2.3.3/src/ast-inl.h +81 -0
  57. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ast.cc +14 -0
  58. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ast.h +20 -35
  59. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/bootstrapper.cc +32 -1
  60. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/bootstrapper.h +0 -4
  61. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/builtins.cc +50 -33
  62. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/builtins.h +2 -0
  63. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/bytecodes-irregexp.h +0 -0
  64. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cached-powers.h +0 -0
  65. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/char-predicates-inl.h +0 -0
  66. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/char-predicates.h +0 -0
  67. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/checks.cc +0 -0
  68. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/checks.h +8 -6
  69. data/ext/v8/upstream/2.3.3/src/circular-queue-inl.h +53 -0
  70. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/circular-queue.cc +0 -0
  71. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/circular-queue.h +0 -26
  72. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/code-stubs.cc +2 -4
  73. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/code-stubs.h +1 -0
  74. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/code.h +0 -0
  75. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/codegen-inl.h +0 -0
  76. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/codegen.cc +44 -13
  77. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/codegen.h +310 -31
  78. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compilation-cache.cc +28 -0
  79. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compilation-cache.h +3 -0
  80. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compiler.cc +45 -14
  81. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/compiler.h +0 -0
  82. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/contexts.cc +11 -11
  83. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/contexts.h +0 -0
  84. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/conversions-inl.h +0 -0
  85. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/conversions.cc +25 -11
  86. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/conversions.h +0 -0
  87. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/counters.cc +0 -0
  88. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/counters.h +0 -0
  89. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu-profiler-inl.h +2 -1
  90. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu-profiler.cc +68 -24
  91. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu-profiler.h +19 -11
  92. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/cpu.h +0 -0
  93. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-debug.cc +0 -0
  94. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-debug.h +0 -0
  95. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-posix.cc +0 -0
  96. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-readline.cc +0 -0
  97. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8-windows.cc +0 -0
  98. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8.cc +3 -0
  99. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8.h +0 -0
  100. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/d8.js +55 -2
  101. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/data-flow.cc +3 -0
  102. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/data-flow.h +0 -0
  103. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/date.js +68 -137
  104. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dateparser-inl.h +0 -0
  105. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dateparser.cc +2 -8
  106. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dateparser.h +0 -0
  107. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug-agent.cc +3 -3
  108. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug-agent.h +0 -0
  109. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug-debugger.js +81 -23
  110. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug.cc +275 -81
  111. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/debug.h +85 -6
  112. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/disasm.h +0 -0
  113. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/disassembler.cc +1 -1
  114. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/disassembler.h +0 -0
  115. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/diy-fp.cc +0 -0
  116. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/diy-fp.h +0 -0
  117. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/double.h +0 -0
  118. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/dtoa-config.c +0 -0
  119. data/ext/v8/upstream/2.3.3/src/dtoa.cc +77 -0
  120. data/ext/v8/upstream/2.3.3/src/dtoa.h +81 -0
  121. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/execution.cc +111 -3
  122. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/execution.h +12 -1
  123. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/factory.cc +25 -3
  124. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/factory.h +16 -9
  125. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-codegen.cc +0 -0
  126. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-codegen.h +0 -0
  127. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-dtoa.cc +2 -9
  128. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/fast-dtoa.h +1 -2
  129. data/ext/v8/upstream/2.3.3/src/fixed-dtoa.cc +405 -0
  130. data/ext/v8/upstream/{2.1.10/src/jump-target-light.cc → 2.3.3/src/fixed-dtoa.h} +22 -53
  131. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flag-definitions.h +14 -6
  132. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flags.cc +5 -9
  133. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flags.h +0 -0
  134. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flow-graph.cc +0 -0
  135. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/flow-graph.h +0 -0
  136. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frame-element.cc +0 -0
  137. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frame-element.h +0 -0
  138. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frames-inl.h +0 -0
  139. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frames.cc +5 -2
  140. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/frames.h +1 -0
  141. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/full-codegen.cc +387 -20
  142. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/full-codegen.h +102 -5
  143. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/func-name-inferrer.cc +0 -0
  144. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/func-name-inferrer.h +0 -0
  145. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/global-handles.cc +8 -4
  146. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/global-handles.h +0 -0
  147. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/globals.h +44 -7
  148. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/handles-inl.h +0 -0
  149. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/handles.cc +19 -0
  150. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/handles.h +8 -0
  151. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/hashmap.cc +0 -0
  152. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/hashmap.h +0 -0
  153. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap-inl.h +56 -14
  154. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap-profiler.cc +85 -1
  155. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap-profiler.h +45 -1
  156. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap.cc +994 -396
  157. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/heap.h +220 -65
  158. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/assembler-ia32-inl.h +41 -12
  159. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/assembler-ia32.cc +94 -24
  160. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/assembler-ia32.h +32 -4
  161. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/builtins-ia32.cc +42 -30
  162. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/codegen-ia32-inl.h +0 -0
  163. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/codegen-ia32.cc +1758 -916
  164. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/codegen-ia32.h +67 -74
  165. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/cpu-ia32.cc +4 -0
  166. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/debug-ia32.cc +46 -0
  167. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/disasm-ia32.cc +37 -6
  168. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/fast-codegen-ia32.cc +4 -0
  169. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/fast-codegen-ia32.h +0 -0
  170. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/frames-ia32.cc +4 -0
  171. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/frames-ia32.h +0 -0
  172. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/full-codegen-ia32.cc +1465 -198
  173. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/ic-ia32.cc +688 -367
  174. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/jump-target-ia32.cc +4 -0
  175. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/macro-assembler-ia32.cc +82 -180
  176. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/macro-assembler-ia32.h +41 -25
  177. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/regexp-macro-assembler-ia32.cc +68 -24
  178. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/regexp-macro-assembler-ia32.h +1 -2
  179. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/register-allocator-ia32-inl.h +0 -0
  180. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/register-allocator-ia32.cc +4 -0
  181. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/register-allocator-ia32.h +0 -0
  182. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/simulator-ia32.cc +0 -0
  183. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/simulator-ia32.h +0 -0
  184. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/stub-cache-ia32.cc +649 -302
  185. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/virtual-frame-ia32.cc +23 -1
  186. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ia32/virtual-frame-ia32.h +18 -27
  187. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ic-inl.h +30 -3
  188. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ic.cc +384 -66
  189. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/ic.h +65 -24
  190. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/interpreter-irregexp.cc +0 -0
  191. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/interpreter-irregexp.h +0 -0
  192. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/json.js +3 -3
  193. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jsregexp.cc +20 -4
  194. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jsregexp.h +0 -0
  195. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-heavy-inl.h +0 -0
  196. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-heavy.cc +79 -13
  197. data/ext/v8/upstream/{2.1.10/src/jump-target.h → 2.3.3/src/jump-target-heavy.h} +5 -47
  198. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-inl.h +0 -0
  199. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target-light-inl.h +16 -2
  200. data/ext/v8/upstream/2.3.3/src/jump-target-light.cc +110 -0
  201. data/ext/v8/upstream/2.3.3/src/jump-target-light.h +192 -0
  202. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/jump-target.cc +0 -64
  203. data/ext/v8/upstream/2.3.3/src/jump-target.h +90 -0
  204. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/list-inl.h +0 -0
  205. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/list.h +0 -0
  206. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/liveedit-debugger.js +141 -28
  207. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/liveedit.cc +19 -7
  208. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/liveedit.h +0 -0
  209. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log-inl.h +0 -0
  210. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log-utils.cc +0 -0
  211. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log-utils.h +0 -0
  212. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log.cc +12 -11
  213. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/log.h +12 -0
  214. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/macro-assembler.h +0 -16
  215. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/macros.py +21 -0
  216. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mark-compact.cc +120 -109
  217. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mark-compact.h +25 -37
  218. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/math.js +0 -0
  219. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/memory.h +0 -0
  220. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/messages.cc +8 -3
  221. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/messages.h +2 -1
  222. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/messages.js +15 -7
  223. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/assembler-mips-inl.h +0 -0
  224. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/assembler-mips.cc +12 -1
  225. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/assembler-mips.h +4 -1
  226. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/builtins-mips.cc +3 -0
  227. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/codegen-mips-inl.h +0 -0
  228. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/codegen-mips.cc +9 -0
  229. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/codegen-mips.h +1 -0
  230. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/constants-mips.cc +5 -0
  231. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/constants-mips.h +0 -0
  232. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/cpu-mips.cc +4 -0
  233. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/debug-mips.cc +3 -0
  234. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/disasm-mips.cc +3 -0
  235. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/fast-codegen-mips.cc +3 -0
  236. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/frames-mips.cc +3 -0
  237. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/frames-mips.h +0 -0
  238. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/full-codegen-mips.cc +5 -1
  239. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/ic-mips.cc +3 -0
  240. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/jump-target-mips.cc +3 -0
  241. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/macro-assembler-mips.cc +3 -0
  242. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/macro-assembler-mips.h +0 -0
  243. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/register-allocator-mips-inl.h +0 -0
  244. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/register-allocator-mips.cc +3 -0
  245. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/register-allocator-mips.h +0 -0
  246. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/simulator-mips.cc +3 -0
  247. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/simulator-mips.h +0 -0
  248. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/stub-cache-mips.cc +3 -0
  249. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/virtual-frame-mips.cc +3 -0
  250. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mips/virtual-frame-mips.h +0 -0
  251. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mirror-debugger.js +46 -4
  252. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/mksnapshot.cc +0 -0
  253. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/natives.h +0 -0
  254. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects-debug.cc +8 -1
  255. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects-inl.h +235 -62
  256. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects.cc +497 -231
  257. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/objects.h +355 -149
  258. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/oprofile-agent.cc +0 -0
  259. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/oprofile-agent.h +0 -0
  260. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/parser.cc +31 -6
  261. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/parser.h +1 -1
  262. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-freebsd.cc +9 -6
  263. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-linux.cc +26 -6
  264. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-macos.cc +11 -6
  265. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-nullos.cc +0 -0
  266. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-openbsd.cc +6 -0
  267. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-posix.cc +0 -0
  268. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-solaris.cc +69 -23
  269. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform-win32.cc +15 -11
  270. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/platform.h +10 -6
  271. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/powers-ten.h +0 -0
  272. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/prettyprinter.cc +0 -0
  273. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/prettyprinter.h +0 -0
  274. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/profile-generator-inl.h +26 -2
  275. data/ext/v8/upstream/2.3.3/src/profile-generator.cc +1830 -0
  276. data/ext/v8/upstream/2.3.3/src/profile-generator.h +853 -0
  277. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/property.cc +0 -0
  278. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/property.h +0 -0
  279. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-irregexp-inl.h +0 -0
  280. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-irregexp.cc +0 -0
  281. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-irregexp.h +0 -0
  282. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-tracer.cc +0 -0
  283. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler-tracer.h +0 -0
  284. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler.cc +1 -3
  285. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-macro-assembler.h +0 -0
  286. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-stack.cc +0 -0
  287. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp-stack.h +0 -0
  288. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/regexp.js +25 -4
  289. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/register-allocator-inl.h +0 -0
  290. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/register-allocator.cc +4 -3
  291. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/register-allocator.h +0 -0
  292. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/rewriter.cc +85 -8
  293. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/rewriter.h +0 -0
  294. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/runtime.cc +547 -221
  295. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/runtime.h +5 -1
  296. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/runtime.js +23 -31
  297. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scanner.cc +12 -6
  298. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scanner.h +60 -53
  299. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopeinfo.cc +156 -168
  300. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopeinfo.h +58 -62
  301. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopes.cc +0 -0
  302. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/scopes.h +0 -0
  303. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/serialize.cc +320 -242
  304. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/serialize.h +81 -48
  305. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/shell.h +0 -0
  306. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/simulator.h +0 -0
  307. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/smart-pointer.h +0 -0
  308. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/snapshot-common.cc +0 -0
  309. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/snapshot-empty.cc +0 -0
  310. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/snapshot.h +0 -0
  311. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/spaces-inl.h +177 -74
  312. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/spaces.cc +138 -315
  313. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/spaces.h +155 -124
  314. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/splay-tree-inl.h +0 -0
  315. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/splay-tree.h +0 -0
  316. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/string-stream.cc +0 -0
  317. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/string-stream.h +0 -0
  318. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/string.js +113 -119
  319. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/stub-cache.cc +242 -97
  320. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/stub-cache.h +118 -55
  321. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/third_party/dtoa/COPYING +0 -0
  322. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/third_party/dtoa/dtoa.c +4 -0
  323. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/third_party/valgrind/valgrind.h +0 -0
  324. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/token.cc +0 -0
  325. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/token.h +0 -0
  326. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/top.cc +107 -26
  327. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/top.h +9 -4
  328. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/type-info.cc +0 -0
  329. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/type-info.h +2 -2
  330. data/ext/v8/upstream/2.3.3/src/unbound-queue-inl.h +95 -0
  331. data/ext/v8/upstream/2.3.3/src/unbound-queue.h +67 -0
  332. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/unicode-inl.h +0 -0
  333. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/unicode.cc +0 -0
  334. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/unicode.h +0 -0
  335. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/uri.js +0 -0
  336. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/utils.cc +0 -0
  337. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/utils.h +83 -1
  338. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8-counters.cc +0 -0
  339. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8-counters.h +20 -0
  340. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8.cc +5 -1
  341. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8.h +0 -0
  342. data/ext/v8/upstream/2.3.3/src/v8dll-main.cc +39 -0
  343. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8natives.js +210 -33
  344. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8threads.cc +1 -1
  345. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/v8threads.h +1 -1
  346. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/variables.cc +0 -0
  347. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/variables.h +0 -0
  348. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/version.cc +3 -3
  349. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/version.h +0 -0
  350. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-heavy-inl.h +40 -0
  351. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-heavy.cc +0 -0
  352. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-inl.h +0 -0
  353. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-light-inl.h +106 -5
  354. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame-light.cc +4 -1
  355. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame.cc +0 -0
  356. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/virtual-frame.h +0 -0
  357. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/vm-state-inl.h +6 -3
  358. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/vm-state.cc +1 -1
  359. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/vm-state.h +6 -4
  360. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/assembler-x64-inl.h +42 -5
  361. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/assembler-x64.cc +285 -53
  362. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/assembler-x64.h +54 -18
  363. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/builtins-x64.cc +31 -33
  364. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/codegen-x64-inl.h +0 -0
  365. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/codegen-x64.cc +9787 -8722
  366. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/codegen-x64.h +82 -47
  367. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/cpu-x64.cc +4 -0
  368. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/debug-x64.cc +55 -6
  369. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/disasm-x64.cc +42 -19
  370. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/fast-codegen-x64.cc +4 -0
  371. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/frames-x64.cc +4 -0
  372. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/frames-x64.h +4 -0
  373. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/full-codegen-x64.cc +1487 -210
  374. data/ext/v8/upstream/2.3.3/src/x64/ic-x64.cc +1907 -0
  375. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/jump-target-x64.cc +4 -0
  376. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/macro-assembler-x64.cc +366 -338
  377. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/macro-assembler-x64.h +83 -38
  378. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/regexp-macro-assembler-x64.cc +82 -23
  379. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/regexp-macro-assembler-x64.h +1 -2
  380. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/register-allocator-x64-inl.h +6 -5
  381. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/register-allocator-x64.cc +4 -0
  382. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/register-allocator-x64.h +1 -1
  383. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/simulator-x64.cc +0 -0
  384. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/simulator-x64.h +0 -0
  385. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/stub-cache-x64.cc +556 -377
  386. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/virtual-frame-x64.cc +197 -98
  387. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/x64/virtual-frame-x64.h +37 -28
  388. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/zone-inl.h +0 -0
  389. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/zone.cc +0 -0
  390. data/ext/v8/upstream/{2.1.10 → 2.3.3}/src/zone.h +0 -0
  391. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/codemap.js +0 -0
  392. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/consarray.js +0 -0
  393. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/csvparser.js +0 -0
  394. data/ext/v8/upstream/2.3.3/tools/gc-nvp-trace-processor.py +317 -0
  395. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/generate-ten-powers.scm +0 -0
  396. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/gyp/v8.gyp +87 -20
  397. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/js2c.py +19 -15
  398. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/jsmin.py +0 -0
  399. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/linux-tick-processor +0 -0
  400. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/linux-tick-processor.py +0 -0
  401. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/logreader.js +0 -0
  402. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/mac-nm +0 -0
  403. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/mac-tick-processor +0 -0
  404. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/annotate +0 -0
  405. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/common +0 -0
  406. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/dump +0 -0
  407. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/report +0 -0
  408. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/reset +0 -0
  409. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/run +0 -0
  410. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/shutdown +0 -0
  411. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/oprofile/start +0 -0
  412. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/presubmit.py +0 -0
  413. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/process-heap-prof.py +0 -0
  414. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/profile.js +0 -0
  415. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/profile_view.js +0 -0
  416. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/run-valgrind.py +0 -0
  417. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/splaytree.js +0 -0
  418. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/splaytree.py +0 -0
  419. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/stats-viewer.py +25 -13
  420. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/test.py +0 -0
  421. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/tickprocessor-driver.js +0 -0
  422. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/tickprocessor.js +0 -0
  423. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/tickprocessor.py +0 -0
  424. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/utils.py +0 -0
  425. data/ext/v8/upstream/2.3.3/tools/v8.xcodeproj/project.pbxproj +1855 -0
  426. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/README.txt +0 -0
  427. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/arm.vsprops +0 -0
  428. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/common.vsprops +0 -0
  429. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8.vcproj +0 -0
  430. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8_arm.vcproj +0 -0
  431. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8_x64.vcproj +0 -0
  432. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/d8js2c.cmd +0 -0
  433. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/debug.vsprops +0 -0
  434. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/ia32.vsprops +0 -0
  435. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/js2c.cmd +0 -0
  436. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/release.vsprops +0 -0
  437. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8.sln +0 -0
  438. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8.vcproj +0 -0
  439. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_arm.sln +0 -0
  440. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_arm.vcproj +0 -0
  441. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_base.vcproj +40 -0
  442. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_base_arm.vcproj +20 -0
  443. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_base_x64.vcproj +16 -0
  444. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_cctest.vcproj +4 -0
  445. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_cctest_arm.vcproj +0 -0
  446. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_cctest_x64.vcproj +0 -0
  447. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_mksnapshot.vcproj +0 -0
  448. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -0
  449. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_process_sample.vcproj +0 -0
  450. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_process_sample_arm.vcproj +0 -0
  451. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_process_sample_x64.vcproj +0 -0
  452. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_shell_sample.vcproj +0 -0
  453. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_shell_sample_arm.vcproj +0 -0
  454. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_shell_sample_x64.vcproj +0 -0
  455. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot.vcproj +0 -0
  456. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot_cc.vcproj +0 -0
  457. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -0
  458. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_snapshot_x64.vcproj +0 -0
  459. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_x64.sln +0 -0
  460. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/v8_x64.vcproj +0 -0
  461. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/visual_studio/x64.vsprops +0 -0
  462. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/windows-tick-processor.bat +0 -0
  463. data/ext/v8/upstream/{2.1.10 → 2.3.3}/tools/windows-tick-processor.py +0 -0
  464. data/ext/v8/upstream/Makefile +1 -1
  465. data/ext/v8/v8_template.cpp +94 -2
  466. data/ext/v8/v8_try_catch.cpp +2 -2
  467. data/lib/v8.rb +1 -1
  468. data/lib/v8/access.rb +93 -40
  469. data/lib/v8/cli.rb +1 -1
  470. data/lib/v8/function.rb +14 -2
  471. data/spec/redjs/jsapi_spec.rb +231 -42
  472. data/therubyracer.gemspec +3 -3
  473. metadata +463 -453
  474. data/ext/v8/upstream/2.1.10/src/arm/assembler-thumb2-inl.h +0 -263
  475. data/ext/v8/upstream/2.1.10/src/arm/assembler-thumb2.cc +0 -1878
  476. data/ext/v8/upstream/2.1.10/src/arm/assembler-thumb2.h +0 -1036
  477. data/ext/v8/upstream/2.1.10/src/arm/codegen-arm-inl.h +0 -72
  478. data/ext/v8/upstream/2.1.10/src/arm/ic-arm.cc +0 -1833
  479. data/ext/v8/upstream/2.1.10/src/circular-queue-inl.h +0 -101
  480. data/ext/v8/upstream/2.1.10/src/profile-generator.cc +0 -583
  481. data/ext/v8/upstream/2.1.10/src/profile-generator.h +0 -364
  482. data/ext/v8/upstream/2.1.10/src/x64/ic-x64.cc +0 -1621
@@ -189,7 +189,7 @@ Object* Object::GetPropertyWithCallback(Object* receiver,
189
189
  }
190
190
 
191
191
  UNREACHABLE();
192
- return 0;
192
+ return NULL;
193
193
  }
194
194
 
195
195
 
@@ -631,7 +631,7 @@ Object* String::SlowTryFlatten(PretenureFlag pretenure) {
631
631
  case kConsStringTag: {
632
632
  ConsString* cs = ConsString::cast(this);
633
633
  if (cs->second()->length() == 0) {
634
- return this;
634
+ return cs->first();
635
635
  }
636
636
  // There's little point in putting the flat string in new space if the
637
637
  // cons string is in old space. It can never get GCed until there is
@@ -669,7 +669,7 @@ Object* String::SlowTryFlatten(PretenureFlag pretenure) {
669
669
  }
670
670
  cs->set_first(result);
671
671
  cs->set_second(Heap::empty_string());
672
- return this;
672
+ return result;
673
673
  }
674
674
  default:
675
675
  return this;
@@ -678,15 +678,18 @@ Object* String::SlowTryFlatten(PretenureFlag pretenure) {
678
678
 
679
679
 
680
680
  bool String::MakeExternal(v8::String::ExternalStringResource* resource) {
681
+ // Externalizing twice leaks the external resource, so it's
682
+ // prohibited by the API.
683
+ ASSERT(!this->IsExternalString());
681
684
  #ifdef DEBUG
682
685
  if (FLAG_enable_slow_asserts) {
683
686
  // Assert that the resource and the string are equivalent.
684
687
  ASSERT(static_cast<size_t>(this->length()) == resource->length());
685
- SmartPointer<uc16> smart_chars(NewArray<uc16>(this->length()));
686
- String::WriteToFlat(this, *smart_chars, 0, this->length());
687
- ASSERT(memcmp(*smart_chars,
688
+ ScopedVector<uc16> smart_chars(this->length());
689
+ String::WriteToFlat(this, smart_chars.start(), 0, this->length());
690
+ ASSERT(memcmp(smart_chars.start(),
688
691
  resource->data(),
689
- resource->length() * sizeof(**smart_chars)) == 0);
692
+ resource->length() * sizeof(smart_chars[0])) == 0);
690
693
  }
691
694
  #endif // DEBUG
692
695
 
@@ -697,13 +700,16 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) {
697
700
  return false;
698
701
  }
699
702
  ASSERT(size >= ExternalString::kSize);
703
+ bool is_ascii = this->IsAsciiRepresentation();
700
704
  bool is_symbol = this->IsSymbol();
701
705
  int length = this->length();
702
706
  int hash_field = this->hash_field();
703
707
 
704
708
  // Morph the object to an external string by adjusting the map and
705
709
  // reinitializing the fields.
706
- this->set_map(Heap::external_string_map());
710
+ this->set_map(is_ascii ?
711
+ Heap::external_string_with_ascii_data_map() :
712
+ Heap::external_string_map());
707
713
  ExternalTwoByteString* self = ExternalTwoByteString::cast(this);
708
714
  self->set_length(length);
709
715
  self->set_hash_field(hash_field);
@@ -713,7 +719,9 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) {
713
719
  if (is_symbol) {
714
720
  self->Hash(); // Force regeneration of the hash value.
715
721
  // Now morph this external string into a external symbol.
716
- this->set_map(Heap::external_symbol_map());
722
+ this->set_map(is_ascii ?
723
+ Heap::external_symbol_with_ascii_data_map() :
724
+ Heap::external_symbol_map());
717
725
  }
718
726
 
719
727
  // Fill the remainder of the string with dead wood.
@@ -728,11 +736,11 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) {
728
736
  if (FLAG_enable_slow_asserts) {
729
737
  // Assert that the resource and the string are equivalent.
730
738
  ASSERT(static_cast<size_t>(this->length()) == resource->length());
731
- SmartPointer<char> smart_chars(NewArray<char>(this->length()));
732
- String::WriteToFlat(this, *smart_chars, 0, this->length());
733
- ASSERT(memcmp(*smart_chars,
739
+ ScopedVector<char> smart_chars(this->length());
740
+ String::WriteToFlat(this, smart_chars.start(), 0, this->length());
741
+ ASSERT(memcmp(smart_chars.start(),
734
742
  resource->data(),
735
- resource->length()*sizeof(**smart_chars)) == 0);
743
+ resource->length() * sizeof(smart_chars[0])) == 0);
736
744
  }
737
745
  #endif // DEBUG
738
746
 
@@ -1268,7 +1276,7 @@ Object* JSObject::AddFastProperty(String* name,
1268
1276
  }
1269
1277
 
1270
1278
  if (map()->unused_property_fields() == 0) {
1271
- if (properties()->length() > kMaxFastProperties) {
1279
+ if (properties()->length() > MaxFastProperties()) {
1272
1280
  Object* obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
1273
1281
  if (obj->IsFailure()) return obj;
1274
1282
  return AddSlowProperty(name, value, attributes);
@@ -1378,6 +1386,11 @@ Object* JSObject::AddProperty(String* name,
1378
1386
  Object* value,
1379
1387
  PropertyAttributes attributes) {
1380
1388
  ASSERT(!IsJSGlobalProxy());
1389
+ if (!map()->is_extensible()) {
1390
+ Handle<Object> args[1] = {Handle<String>(name)};
1391
+ return Top::Throw(*Factory::NewTypeError("object_not_extensible",
1392
+ HandleVector(args, 1)));
1393
+ }
1381
1394
  if (HasFastProperties()) {
1382
1395
  // Ensure the descriptor array does not get too big.
1383
1396
  if (map()->instance_descriptors()->number_of_descriptors() <
@@ -1466,7 +1479,7 @@ Object* JSObject::ConvertDescriptorToField(String* name,
1466
1479
  Object* new_value,
1467
1480
  PropertyAttributes attributes) {
1468
1481
  if (map()->unused_property_fields() == 0 &&
1469
- properties()->length() > kMaxFastProperties) {
1482
+ properties()->length() > MaxFastProperties()) {
1470
1483
  Object* obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
1471
1484
  if (obj->IsFailure()) return obj;
1472
1485
  return ReplaceSlowProperty(name, new_value, attributes);
@@ -1613,7 +1626,7 @@ Object* JSObject::SetPropertyWithCallback(Object* structure,
1613
1626
  }
1614
1627
 
1615
1628
  UNREACHABLE();
1616
- return 0;
1629
+ return NULL;
1617
1630
  }
1618
1631
 
1619
1632
 
@@ -1657,7 +1670,8 @@ void JSObject::LookupCallbackSetterInPrototypes(String* name,
1657
1670
  }
1658
1671
 
1659
1672
 
1660
- Object* JSObject::LookupCallbackSetterInPrototypes(uint32_t index) {
1673
+ bool JSObject::SetElementWithCallbackSetterInPrototypes(uint32_t index,
1674
+ Object* value) {
1661
1675
  for (Object* pt = GetPrototype();
1662
1676
  pt != Heap::null_value();
1663
1677
  pt = pt->GetPrototype()) {
@@ -1670,12 +1684,12 @@ Object* JSObject::LookupCallbackSetterInPrototypes(uint32_t index) {
1670
1684
  Object* element = dictionary->ValueAt(entry);
1671
1685
  PropertyDetails details = dictionary->DetailsAt(entry);
1672
1686
  if (details.type() == CALLBACKS) {
1673
- // Only accessors allowed as elements.
1674
- return FixedArray::cast(element)->get(kSetterIndex);
1687
+ SetElementWithCallback(element, index, value, JSObject::cast(pt));
1688
+ return true;
1675
1689
  }
1676
1690
  }
1677
1691
  }
1678
- return Heap::undefined_value();
1692
+ return false;
1679
1693
  }
1680
1694
 
1681
1695
 
@@ -1737,8 +1751,6 @@ void JSObject::LocalLookupRealNamedProperty(String* name,
1737
1751
  result->DictionaryResult(this, entry);
1738
1752
  return;
1739
1753
  }
1740
- // Slow case object skipped during lookup. Do not use inline caching.
1741
- if (!IsGlobalObject()) result->DisallowCaching();
1742
1754
  }
1743
1755
  result->NotFound();
1744
1756
  }
@@ -2015,16 +2027,15 @@ PropertyAttributes JSObject::GetPropertyAttributeWithInterceptor(
2015
2027
  v8::NamedPropertyQuery query =
2016
2028
  v8::ToCData<v8::NamedPropertyQuery>(interceptor->query());
2017
2029
  LOG(ApiNamedPropertyAccess("interceptor-named-has", *holder_handle, name));
2018
- v8::Handle<v8::Boolean> result;
2030
+ v8::Handle<v8::Integer> result;
2019
2031
  {
2020
2032
  // Leaving JavaScript.
2021
2033
  VMState state(EXTERNAL);
2022
2034
  result = query(v8::Utils::ToLocal(name_handle), info);
2023
2035
  }
2024
2036
  if (!result.IsEmpty()) {
2025
- // Convert the boolean result to a property attribute
2026
- // specification.
2027
- return result->IsTrue() ? NONE : ABSENT;
2037
+ ASSERT(result->IsInt32());
2038
+ return static_cast<PropertyAttributes>(result->Int32Value());
2028
2039
  }
2029
2040
  } else if (!interceptor->getter()->IsUndefined()) {
2030
2041
  v8::NamedPropertyGetter getter =
@@ -2036,7 +2047,7 @@ PropertyAttributes JSObject::GetPropertyAttributeWithInterceptor(
2036
2047
  VMState state(EXTERNAL);
2037
2048
  result = getter(v8::Utils::ToLocal(name_handle), info);
2038
2049
  }
2039
- if (!result.IsEmpty()) return NONE;
2050
+ if (!result.IsEmpty()) return DONT_ENUM;
2040
2051
  }
2041
2052
  return holder_handle->GetPropertyAttributePostInterceptor(*receiver_handle,
2042
2053
  *name_handle,
@@ -2179,6 +2190,8 @@ Object* JSObject::NormalizeProperties(PropertyNormalizationMode mode,
2179
2190
  int new_instance_size = map()->instance_size() - instance_size_delta;
2180
2191
  new_map->set_inobject_properties(0);
2181
2192
  new_map->set_instance_size(new_instance_size);
2193
+ new_map->set_scavenger(Heap::GetScavenger(new_map->instance_type(),
2194
+ new_map->instance_size()));
2182
2195
  Heap::CreateFillerObjectAt(this->address() + new_instance_size,
2183
2196
  instance_size_delta);
2184
2197
  }
@@ -2214,6 +2227,11 @@ Object* JSObject::TransformToFastProperties(int unused_property_fields) {
2214
2227
  Object* JSObject::NormalizeElements() {
2215
2228
  ASSERT(!HasPixelElements() && !HasExternalArrayElements());
2216
2229
  if (HasDictionaryElements()) return this;
2230
+ ASSERT(map()->has_fast_elements());
2231
+
2232
+ Object* obj = map()->GetSlowElementsMap();
2233
+ if (obj->IsFailure()) return obj;
2234
+ Map* new_map = Map::cast(obj);
2217
2235
 
2218
2236
  // Get number of entries.
2219
2237
  FixedArray* array = FixedArray::cast(elements());
@@ -2222,7 +2240,7 @@ Object* JSObject::NormalizeElements() {
2222
2240
  int length = IsJSArray() ?
2223
2241
  Smi::cast(JSArray::cast(this)->length())->value() :
2224
2242
  array->length();
2225
- Object* obj = NumberDictionary::Allocate(length);
2243
+ obj = NumberDictionary::Allocate(length);
2226
2244
  if (obj->IsFailure()) return obj;
2227
2245
  NumberDictionary* dictionary = NumberDictionary::cast(obj);
2228
2246
  // Copy entries.
@@ -2235,7 +2253,10 @@ Object* JSObject::NormalizeElements() {
2235
2253
  dictionary = NumberDictionary::cast(result);
2236
2254
  }
2237
2255
  }
2238
- // Switch to using the dictionary as the backing storage for elements.
2256
+ // Switch to using the dictionary as the backing storage for
2257
+ // elements. Set the new map first to satify the elements type
2258
+ // assert in set_elements().
2259
+ set_map(new_map);
2239
2260
  set_elements(dictionary);
2240
2261
 
2241
2262
  Counters::elements_to_dictionary.Increment();
@@ -2560,6 +2581,25 @@ bool JSObject::ReferencesObject(Object* obj) {
2560
2581
  }
2561
2582
 
2562
2583
 
2584
+ Object* JSObject::PreventExtensions() {
2585
+ // If there are fast elements we normalize.
2586
+ if (HasFastElements()) {
2587
+ NormalizeElements();
2588
+ }
2589
+ // Make sure that we never go back to fast case.
2590
+ element_dictionary()->set_requires_slow_elements();
2591
+
2592
+ // Do a map transition, other objects with this map may still
2593
+ // be extensible.
2594
+ Object* new_map = map()->CopyDropTransitions();
2595
+ if (new_map->IsFailure()) return new_map;
2596
+ Map::cast(new_map)->set_is_extensible(false);
2597
+ set_map(Map::cast(new_map));
2598
+ ASSERT(!map()->is_extensible());
2599
+ return new_map;
2600
+ }
2601
+
2602
+
2563
2603
  // Tests for the fast common case for property enumeration:
2564
2604
  // - This object and all prototypes has an enum cache (which means that it has
2565
2605
  // no interceptors and needs no access checks).
@@ -2692,33 +2732,14 @@ Object* JSObject::DefineGetterSetter(String* name,
2692
2732
  // interceptor calls.
2693
2733
  AssertNoContextChange ncc;
2694
2734
 
2695
- // Check access rights if needed.
2696
- if (IsAccessCheckNeeded() &&
2697
- !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) {
2698
- Top::ReportFailedAccessCheck(this, v8::ACCESS_SET);
2699
- return Heap::undefined_value();
2700
- }
2701
-
2702
2735
  // Try to flatten before operating on the string.
2703
2736
  name->TryFlatten();
2704
2737
 
2705
- // Check if there is an API defined callback object which prohibits
2706
- // callback overwriting in this object or it's prototype chain.
2707
- // This mechanism is needed for instance in a browser setting, where
2708
- // certain accessors such as window.location should not be allowed
2709
- // to be overwritten because allowing overwriting could potentially
2710
- // cause security problems.
2711
- LookupResult callback_result;
2712
- LookupCallback(name, &callback_result);
2713
- if (callback_result.IsFound()) {
2714
- Object* obj = callback_result.GetCallbackObject();
2715
- if (obj->IsAccessorInfo() &&
2716
- AccessorInfo::cast(obj)->prohibits_overwriting()) {
2717
- return Heap::undefined_value();
2718
- }
2738
+ if (!CanSetCallback(name)) {
2739
+ return Heap::undefined_value();
2719
2740
  }
2720
2741
 
2721
- uint32_t index;
2742
+ uint32_t index = 0;
2722
2743
  bool is_element = name->AsArrayIndex(&index);
2723
2744
  if (is_element && IsJSArray()) return Heap::undefined_value();
2724
2745
 
@@ -2746,9 +2767,10 @@ Object* JSObject::DefineGetterSetter(String* name,
2746
2767
  PropertyDetails details = dictionary->DetailsAt(entry);
2747
2768
  if (details.IsReadOnly()) return Heap::undefined_value();
2748
2769
  if (details.type() == CALLBACKS) {
2749
- // Only accessors allowed as elements.
2750
- ASSERT(result->IsFixedArray());
2751
- return result;
2770
+ if (result->IsFixedArray()) {
2771
+ return result;
2772
+ }
2773
+ // Otherwise allow to override it.
2752
2774
  }
2753
2775
  }
2754
2776
  break;
@@ -2765,15 +2787,10 @@ Object* JSObject::DefineGetterSetter(String* name,
2765
2787
  if (result.IsReadOnly()) return Heap::undefined_value();
2766
2788
  if (result.type() == CALLBACKS) {
2767
2789
  Object* obj = result.GetCallbackObject();
2790
+ // Need to preserve old getters/setters.
2768
2791
  if (obj->IsFixedArray()) {
2769
- // The object might be in fast mode even though it has
2770
- // a getter/setter.
2771
- Object* ok = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
2772
- if (ok->IsFailure()) return ok;
2773
-
2774
- PropertyDetails details = PropertyDetails(attributes, CALLBACKS);
2775
- SetNormalizedProperty(name, obj, details);
2776
- return obj;
2792
+ // Use set to update attributes.
2793
+ return SetPropertyCallback(name, obj, attributes);
2777
2794
  }
2778
2795
  }
2779
2796
  }
@@ -2782,50 +2799,100 @@ Object* JSObject::DefineGetterSetter(String* name,
2782
2799
  // Allocate the fixed array to hold getter and setter.
2783
2800
  Object* structure = Heap::AllocateFixedArray(2, TENURED);
2784
2801
  if (structure->IsFailure()) return structure;
2785
- PropertyDetails details = PropertyDetails(attributes, CALLBACKS);
2786
2802
 
2787
2803
  if (is_element) {
2788
- // Normalize object to make this operation simple.
2789
- Object* ok = NormalizeElements();
2790
- if (ok->IsFailure()) return ok;
2804
+ return SetElementCallback(index, structure, attributes);
2805
+ } else {
2806
+ return SetPropertyCallback(name, structure, attributes);
2807
+ }
2808
+ }
2791
2809
 
2792
- // Update the dictionary with the new CALLBACKS property.
2793
- Object* dict =
2794
- element_dictionary()->Set(index, structure, details);
2795
- if (dict->IsFailure()) return dict;
2796
2810
 
2797
- // If name is an index we need to stay in slow case.
2798
- NumberDictionary* elements = NumberDictionary::cast(dict);
2799
- elements->set_requires_slow_elements();
2800
- // Set the potential new dictionary on the object.
2801
- set_elements(NumberDictionary::cast(dict));
2802
- } else {
2803
- // Normalize object to make this operation simple.
2804
- Object* ok = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
2805
- if (ok->IsFailure()) return ok;
2811
+ bool JSObject::CanSetCallback(String* name) {
2812
+ ASSERT(!IsAccessCheckNeeded()
2813
+ || Top::MayNamedAccess(this, name, v8::ACCESS_SET));
2806
2814
 
2807
- // For the global object allocate a new map to invalidate the global inline
2808
- // caches which have a global property cell reference directly in the code.
2809
- if (IsGlobalObject()) {
2810
- Object* new_map = map()->CopyDropDescriptors();
2811
- if (new_map->IsFailure()) return new_map;
2812
- set_map(Map::cast(new_map));
2815
+ // Check if there is an API defined callback object which prohibits
2816
+ // callback overwriting in this object or it's prototype chain.
2817
+ // This mechanism is needed for instance in a browser setting, where
2818
+ // certain accessors such as window.location should not be allowed
2819
+ // to be overwritten because allowing overwriting could potentially
2820
+ // cause security problems.
2821
+ LookupResult callback_result;
2822
+ LookupCallback(name, &callback_result);
2823
+ if (callback_result.IsProperty()) {
2824
+ Object* obj = callback_result.GetCallbackObject();
2825
+ if (obj->IsAccessorInfo() &&
2826
+ AccessorInfo::cast(obj)->prohibits_overwriting()) {
2827
+ return false;
2813
2828
  }
2814
-
2815
- // Update the dictionary with the new CALLBACKS property.
2816
- return SetNormalizedProperty(name, structure, details);
2817
2829
  }
2818
2830
 
2831
+ return true;
2832
+ }
2833
+
2834
+
2835
+ Object* JSObject::SetElementCallback(uint32_t index,
2836
+ Object* structure,
2837
+ PropertyAttributes attributes) {
2838
+ PropertyDetails details = PropertyDetails(attributes, CALLBACKS);
2839
+
2840
+ // Normalize elements to make this operation simple.
2841
+ Object* ok = NormalizeElements();
2842
+ if (ok->IsFailure()) return ok;
2843
+
2844
+ // Update the dictionary with the new CALLBACKS property.
2845
+ Object* dict =
2846
+ element_dictionary()->Set(index, structure, details);
2847
+ if (dict->IsFailure()) return dict;
2848
+
2849
+ NumberDictionary* elements = NumberDictionary::cast(dict);
2850
+ elements->set_requires_slow_elements();
2851
+ // Set the potential new dictionary on the object.
2852
+ set_elements(elements);
2853
+
2819
2854
  return structure;
2820
2855
  }
2821
2856
 
2822
2857
 
2858
+ Object* JSObject::SetPropertyCallback(String* name,
2859
+ Object* structure,
2860
+ PropertyAttributes attributes) {
2861
+ PropertyDetails details = PropertyDetails(attributes, CALLBACKS);
2862
+
2863
+ bool convert_back_to_fast = HasFastProperties() &&
2864
+ (map()->instance_descriptors()->number_of_descriptors()
2865
+ < DescriptorArray::kMaxNumberOfDescriptors);
2866
+
2867
+ // Normalize object to make this operation simple.
2868
+ Object* ok = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
2869
+ if (ok->IsFailure()) return ok;
2870
+
2871
+ // For the global object allocate a new map to invalidate the global inline
2872
+ // caches which have a global property cell reference directly in the code.
2873
+ if (IsGlobalObject()) {
2874
+ Object* new_map = map()->CopyDropDescriptors();
2875
+ if (new_map->IsFailure()) return new_map;
2876
+ set_map(Map::cast(new_map));
2877
+ }
2878
+
2879
+ // Update the dictionary with the new CALLBACKS property.
2880
+ Object* result = SetNormalizedProperty(name, structure, details);
2881
+ if (result->IsFailure()) return result;
2882
+
2883
+ if (convert_back_to_fast) {
2884
+ ok = TransformToFastProperties(0);
2885
+ if (ok->IsFailure()) return ok;
2886
+ }
2887
+ return result;
2888
+ }
2889
+
2823
2890
  Object* JSObject::DefineAccessor(String* name, bool is_getter, JSFunction* fun,
2824
2891
  PropertyAttributes attributes) {
2825
2892
  // Check access rights if needed.
2826
2893
  if (IsAccessCheckNeeded() &&
2827
- !Top::MayNamedAccess(this, name, v8::ACCESS_HAS)) {
2828
- Top::ReportFailedAccessCheck(this, v8::ACCESS_HAS);
2894
+ !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) {
2895
+ Top::ReportFailedAccessCheck(this, v8::ACCESS_SET);
2829
2896
  return Heap::undefined_value();
2830
2897
  }
2831
2898
 
@@ -2844,6 +2911,80 @@ Object* JSObject::DefineAccessor(String* name, bool is_getter, JSFunction* fun,
2844
2911
  }
2845
2912
 
2846
2913
 
2914
+ Object* JSObject::DefineAccessor(AccessorInfo* info) {
2915
+ String* name = String::cast(info->name());
2916
+ // Check access rights if needed.
2917
+ if (IsAccessCheckNeeded() &&
2918
+ !Top::MayNamedAccess(this, name, v8::ACCESS_SET)) {
2919
+ Top::ReportFailedAccessCheck(this, v8::ACCESS_SET);
2920
+ return Heap::undefined_value();
2921
+ }
2922
+
2923
+ if (IsJSGlobalProxy()) {
2924
+ Object* proto = GetPrototype();
2925
+ if (proto->IsNull()) return this;
2926
+ ASSERT(proto->IsJSGlobalObject());
2927
+ return JSObject::cast(proto)->DefineAccessor(info);
2928
+ }
2929
+
2930
+ // Make sure that the top context does not change when doing callbacks or
2931
+ // interceptor calls.
2932
+ AssertNoContextChange ncc;
2933
+
2934
+ // Try to flatten before operating on the string.
2935
+ name->TryFlatten();
2936
+
2937
+ if (!CanSetCallback(name)) {
2938
+ return Heap::undefined_value();
2939
+ }
2940
+
2941
+ uint32_t index = 0;
2942
+ bool is_element = name->AsArrayIndex(&index);
2943
+
2944
+ if (is_element) {
2945
+ if (IsJSArray()) return Heap::undefined_value();
2946
+
2947
+ // Accessors overwrite previous callbacks (cf. with getters/setters).
2948
+ switch (GetElementsKind()) {
2949
+ case FAST_ELEMENTS:
2950
+ break;
2951
+ case PIXEL_ELEMENTS:
2952
+ case EXTERNAL_BYTE_ELEMENTS:
2953
+ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
2954
+ case EXTERNAL_SHORT_ELEMENTS:
2955
+ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
2956
+ case EXTERNAL_INT_ELEMENTS:
2957
+ case EXTERNAL_UNSIGNED_INT_ELEMENTS:
2958
+ case EXTERNAL_FLOAT_ELEMENTS:
2959
+ // Ignore getters and setters on pixel and external array
2960
+ // elements.
2961
+ return Heap::undefined_value();
2962
+ case DICTIONARY_ELEMENTS:
2963
+ break;
2964
+ default:
2965
+ UNREACHABLE();
2966
+ break;
2967
+ }
2968
+
2969
+ Object* ok = SetElementCallback(index, info, info->property_attributes());
2970
+ if (ok->IsFailure()) return ok;
2971
+ } else {
2972
+ // Lookup the name.
2973
+ LookupResult result;
2974
+ LocalLookup(name, &result);
2975
+ // ES5 forbids turning a property into an accessor if it's not
2976
+ // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5).
2977
+ if (result.IsProperty() && (result.IsReadOnly() || result.IsDontDelete())) {
2978
+ return Heap::undefined_value();
2979
+ }
2980
+ Object* ok = SetPropertyCallback(name, info, info->property_attributes());
2981
+ if (ok->IsFailure()) return ok;
2982
+ }
2983
+
2984
+ return this;
2985
+ }
2986
+
2987
+
2847
2988
  Object* JSObject::LookupAccessor(String* name, bool is_getter) {
2848
2989
  // Make sure that the top context does not change when doing callbacks or
2849
2990
  // interceptor calls.
@@ -2858,7 +2999,7 @@ Object* JSObject::LookupAccessor(String* name, bool is_getter) {
2858
2999
 
2859
3000
  // Make the lookup and include prototypes.
2860
3001
  int accessor_index = is_getter ? kGetterIndex : kSetterIndex;
2861
- uint32_t index;
3002
+ uint32_t index = 0;
2862
3003
  if (name->AsArrayIndex(&index)) {
2863
3004
  for (Object* obj = this;
2864
3005
  obj != Heap::null_value();
@@ -2871,8 +3012,9 @@ Object* JSObject::LookupAccessor(String* name, bool is_getter) {
2871
3012
  Object* element = dictionary->ValueAt(entry);
2872
3013
  PropertyDetails details = dictionary->DetailsAt(entry);
2873
3014
  if (details.type() == CALLBACKS) {
2874
- // Only accessors allowed as elements.
2875
- return FixedArray::cast(element)->get(accessor_index);
3015
+ if (element->IsFixedArray()) {
3016
+ return FixedArray::cast(element)->get(accessor_index);
3017
+ }
2876
3018
  }
2877
3019
  }
2878
3020
  }
@@ -2960,7 +3102,7 @@ Object* Map::CopyDropTransitions() {
2960
3102
  Object* descriptors = instance_descriptors()->RemoveTransitions();
2961
3103
  if (descriptors->IsFailure()) return descriptors;
2962
3104
  cast(new_map)->set_instance_descriptors(DescriptorArray::cast(descriptors));
2963
- return cast(new_map);
3105
+ return new_map;
2964
3106
  }
2965
3107
 
2966
3108
 
@@ -4580,51 +4722,58 @@ bool String::SlowEquals(String* other) {
4580
4722
  if (Hash() != other->Hash()) return false;
4581
4723
  }
4582
4724
 
4583
- if (StringShape(this).IsSequentialAscii() &&
4584
- StringShape(other).IsSequentialAscii()) {
4585
- const char* str1 = SeqAsciiString::cast(this)->GetChars();
4586
- const char* str2 = SeqAsciiString::cast(other)->GetChars();
4725
+ // We know the strings are both non-empty. Compare the first chars
4726
+ // before we try to flatten the strings.
4727
+ if (this->Get(0) != other->Get(0)) return false;
4728
+
4729
+ String* lhs = this->TryFlattenGetString();
4730
+ String* rhs = other->TryFlattenGetString();
4731
+
4732
+ if (StringShape(lhs).IsSequentialAscii() &&
4733
+ StringShape(rhs).IsSequentialAscii()) {
4734
+ const char* str1 = SeqAsciiString::cast(lhs)->GetChars();
4735
+ const char* str2 = SeqAsciiString::cast(rhs)->GetChars();
4587
4736
  return CompareRawStringContents(Vector<const char>(str1, len),
4588
4737
  Vector<const char>(str2, len));
4589
4738
  }
4590
4739
 
4591
- if (this->IsFlat()) {
4740
+ if (lhs->IsFlat()) {
4592
4741
  if (IsAsciiRepresentation()) {
4593
- Vector<const char> vec1 = this->ToAsciiVector();
4594
- if (other->IsFlat()) {
4595
- if (other->IsAsciiRepresentation()) {
4596
- Vector<const char> vec2 = other->ToAsciiVector();
4742
+ Vector<const char> vec1 = lhs->ToAsciiVector();
4743
+ if (rhs->IsFlat()) {
4744
+ if (rhs->IsAsciiRepresentation()) {
4745
+ Vector<const char> vec2 = rhs->ToAsciiVector();
4597
4746
  return CompareRawStringContents(vec1, vec2);
4598
4747
  } else {
4599
4748
  VectorIterator<char> buf1(vec1);
4600
- VectorIterator<uc16> ib(other->ToUC16Vector());
4749
+ VectorIterator<uc16> ib(rhs->ToUC16Vector());
4601
4750
  return CompareStringContents(&buf1, &ib);
4602
4751
  }
4603
4752
  } else {
4604
4753
  VectorIterator<char> buf1(vec1);
4605
- string_compare_buffer_b.Reset(0, other);
4754
+ string_compare_buffer_b.Reset(0, rhs);
4606
4755
  return CompareStringContents(&buf1, &string_compare_buffer_b);
4607
4756
  }
4608
4757
  } else {
4609
- Vector<const uc16> vec1 = this->ToUC16Vector();
4610
- if (other->IsFlat()) {
4611
- if (other->IsAsciiRepresentation()) {
4758
+ Vector<const uc16> vec1 = lhs->ToUC16Vector();
4759
+ if (rhs->IsFlat()) {
4760
+ if (rhs->IsAsciiRepresentation()) {
4612
4761
  VectorIterator<uc16> buf1(vec1);
4613
- VectorIterator<char> ib(other->ToAsciiVector());
4762
+ VectorIterator<char> ib(rhs->ToAsciiVector());
4614
4763
  return CompareStringContents(&buf1, &ib);
4615
4764
  } else {
4616
- Vector<const uc16> vec2(other->ToUC16Vector());
4765
+ Vector<const uc16> vec2(rhs->ToUC16Vector());
4617
4766
  return CompareRawStringContents(vec1, vec2);
4618
4767
  }
4619
4768
  } else {
4620
4769
  VectorIterator<uc16> buf1(vec1);
4621
- string_compare_buffer_b.Reset(0, other);
4770
+ string_compare_buffer_b.Reset(0, rhs);
4622
4771
  return CompareStringContents(&buf1, &string_compare_buffer_b);
4623
4772
  }
4624
4773
  }
4625
4774
  } else {
4626
- string_compare_buffer_a.Reset(0, this);
4627
- return CompareStringContentsPartial(&string_compare_buffer_a, other);
4775
+ string_compare_buffer_a.Reset(0, lhs);
4776
+ return CompareStringContentsPartial(&string_compare_buffer_a, rhs);
4628
4777
  }
4629
4778
  }
4630
4779
 
@@ -4676,7 +4825,7 @@ static inline uint32_t HashSequentialString(const schar* chars, int length) {
4676
4825
 
4677
4826
  uint32_t String::ComputeAndSetHash() {
4678
4827
  // Should only be called if hash code has not yet been computed.
4679
- ASSERT(!(hash_field() & kHashComputedMask));
4828
+ ASSERT(!HasHashCode());
4680
4829
 
4681
4830
  const int len = length();
4682
4831
 
@@ -4695,7 +4844,7 @@ uint32_t String::ComputeAndSetHash() {
4695
4844
  set_hash_field(field);
4696
4845
 
4697
4846
  // Check the hash code is there.
4698
- ASSERT(hash_field() & kHashComputedMask);
4847
+ ASSERT(HasHashCode());
4699
4848
  uint32_t result = field >> kHashShift;
4700
4849
  ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
4701
4850
  return result;
@@ -4736,7 +4885,7 @@ bool String::SlowAsArrayIndex(uint32_t* index) {
4736
4885
  if (length() <= kMaxCachedArrayIndexLength) {
4737
4886
  Hash(); // force computation of hash code
4738
4887
  uint32_t field = hash_field();
4739
- if ((field & kIsArrayIndexMask) == 0) return false;
4888
+ if ((field & kIsNotArrayIndexMask) != 0) return false;
4740
4889
  // Isolate the array index form the full hash field.
4741
4890
  *index = (kArrayIndexHashMask & field) >> kHashShift;
4742
4891
  return true;
@@ -4750,16 +4899,19 @@ bool String::SlowAsArrayIndex(uint32_t* index) {
4750
4899
  static inline uint32_t HashField(uint32_t hash,
4751
4900
  bool is_array_index,
4752
4901
  int length = -1) {
4753
- uint32_t result =
4754
- (hash << String::kHashShift) | String::kHashComputedMask;
4902
+ uint32_t result = (hash << String::kHashShift);
4755
4903
  if (is_array_index) {
4756
4904
  // For array indexes mix the length into the hash as an array index could
4757
4905
  // be zero.
4758
4906
  ASSERT(length > 0);
4907
+ ASSERT(length <= String::kMaxArrayIndexSize);
4759
4908
  ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) <
4760
4909
  (1 << String::kArrayIndexValueBits));
4761
- result |= String::kIsArrayIndexMask;
4910
+ ASSERT(String::kMaxArrayIndexSize < (1 << String::kArrayIndexValueBits));
4911
+ result &= ~String::kIsNotArrayIndexMask;
4762
4912
  result |= length << String::kArrayIndexHashLengthShift;
4913
+ } else {
4914
+ result |= String::kIsNotArrayIndexMask;
4763
4915
  }
4764
4916
  return result;
4765
4917
  }
@@ -4885,7 +5037,7 @@ void Map::ClearNonLiveTransitions(Object* real_prototype) {
4885
5037
 
4886
5038
  void Map::MapIterateBody(ObjectVisitor* v) {
4887
5039
  // Assumes all Object* members are contiguously allocated!
4888
- IteratePointers(v, kPrototypeOffset, kCodeCacheOffset + kPointerSize);
5040
+ IteratePointers(v, kPointerFieldsBeginOffset, kPointerFieldsEndOffset);
4889
5041
  }
4890
5042
 
4891
5043
 
@@ -4900,6 +5052,7 @@ Object* JSFunction::SetInstancePrototype(Object* value) {
4900
5052
  // prototype is put into the initial map where it belongs.
4901
5053
  set_prototype_or_initial_map(value);
4902
5054
  }
5055
+ Heap::ClearInstanceofCache();
4903
5056
  return value;
4904
5057
  }
4905
5058
 
@@ -5146,8 +5299,10 @@ void ObjectVisitor::VisitCodeTarget(RelocInfo* rinfo) {
5146
5299
 
5147
5300
 
5148
5301
  void ObjectVisitor::VisitDebugTarget(RelocInfo* rinfo) {
5149
- ASSERT(RelocInfo::IsJSReturn(rinfo->rmode()) &&
5150
- rinfo->IsPatchedReturnSequence());
5302
+ ASSERT((RelocInfo::IsJSReturn(rinfo->rmode()) &&
5303
+ rinfo->IsPatchedReturnSequence()) ||
5304
+ (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) &&
5305
+ rinfo->IsPatchedDebugBreakSlotSequence()));
5151
5306
  Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address());
5152
5307
  Object* old_target = target;
5153
5308
  VisitPointer(&target);
@@ -5160,28 +5315,20 @@ void Code::CodeIterateBody(ObjectVisitor* v) {
5160
5315
  RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
5161
5316
  RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
5162
5317
  RelocInfo::ModeMask(RelocInfo::JS_RETURN) |
5318
+ RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) |
5163
5319
  RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
5164
5320
 
5165
- for (RelocIterator it(this, mode_mask); !it.done(); it.next()) {
5166
- RelocInfo::Mode rmode = it.rinfo()->rmode();
5167
- if (rmode == RelocInfo::EMBEDDED_OBJECT) {
5168
- v->VisitPointer(it.rinfo()->target_object_address());
5169
- } else if (RelocInfo::IsCodeTarget(rmode)) {
5170
- v->VisitCodeTarget(it.rinfo());
5171
- } else if (rmode == RelocInfo::EXTERNAL_REFERENCE) {
5172
- v->VisitExternalReference(it.rinfo()->target_reference_address());
5173
- #ifdef ENABLE_DEBUGGER_SUPPORT
5174
- } else if (Debug::has_break_points() &&
5175
- RelocInfo::IsJSReturn(rmode) &&
5176
- it.rinfo()->IsPatchedReturnSequence()) {
5177
- v->VisitDebugTarget(it.rinfo());
5178
- #endif
5179
- } else if (rmode == RelocInfo::RUNTIME_ENTRY) {
5180
- v->VisitRuntimeEntry(it.rinfo());
5181
- }
5182
- }
5321
+ // Use the relocation info pointer before it is visited by
5322
+ // the heap compaction in the next statement.
5323
+ RelocIterator it(this, mode_mask);
5324
+
5325
+ IteratePointers(v,
5326
+ kRelocationInfoOffset,
5327
+ kRelocationInfoOffset + kPointerSize);
5183
5328
 
5184
- ScopeInfo<>::IterateScopeInfo(this, v);
5329
+ for (; !it.done(); it.next()) {
5330
+ it.rinfo()->Visit(v);
5331
+ }
5185
5332
  }
5186
5333
 
5187
5334
 
@@ -5197,14 +5344,6 @@ void Code::CopyFrom(const CodeDesc& desc) {
5197
5344
  // copy code
5198
5345
  memmove(instruction_start(), desc.buffer, desc.instr_size);
5199
5346
 
5200
- // fill gap with zero bytes
5201
- { byte* p = instruction_start() + desc.instr_size;
5202
- byte* q = relocation_start();
5203
- while (p < q) {
5204
- *p++ = 0;
5205
- }
5206
- }
5207
-
5208
5347
  // copy reloc info
5209
5348
  memmove(relocation_start(),
5210
5349
  desc.buffer + desc.buffer_size - desc.reloc_size,
@@ -5303,6 +5442,7 @@ const char* Code::Kind2String(Kind kind) {
5303
5442
  case STORE_IC: return "STORE_IC";
5304
5443
  case KEYED_STORE_IC: return "KEYED_STORE_IC";
5305
5444
  case CALL_IC: return "CALL_IC";
5445
+ case KEYED_CALL_IC: return "KEYED_CALL_IC";
5306
5446
  case BINARY_OP_IC: return "BINARY_OP_IC";
5307
5447
  }
5308
5448
  UNREACHABLE();
@@ -5365,14 +5505,18 @@ void Code::Disassemble(const char* name) {
5365
5505
  #endif // ENABLE_DISASSEMBLER
5366
5506
 
5367
5507
 
5368
- void JSObject::SetFastElements(FixedArray* elems) {
5508
+ Object* JSObject::SetFastElementsCapacityAndLength(int capacity, int length) {
5369
5509
  // We should never end in here with a pixel or external array.
5370
5510
  ASSERT(!HasPixelElements() && !HasExternalArrayElements());
5371
- #ifdef DEBUG
5372
- // Check the provided array is filled with the_hole.
5373
- uint32_t len = static_cast<uint32_t>(elems->length());
5374
- for (uint32_t i = 0; i < len; i++) ASSERT(elems->get(i)->IsTheHole());
5375
- #endif
5511
+
5512
+ Object* obj = Heap::AllocateFixedArrayWithHoles(capacity);
5513
+ if (obj->IsFailure()) return obj;
5514
+ FixedArray* elems = FixedArray::cast(obj);
5515
+
5516
+ obj = map()->GetFastElementsMap();
5517
+ if (obj->IsFailure()) return obj;
5518
+ Map* new_map = Map::cast(obj);
5519
+
5376
5520
  AssertNoAllocation no_gc;
5377
5521
  WriteBarrierMode mode = elems->GetWriteBarrierMode(no_gc);
5378
5522
  switch (GetElementsKind()) {
@@ -5400,7 +5544,15 @@ void JSObject::SetFastElements(FixedArray* elems) {
5400
5544
  UNREACHABLE();
5401
5545
  break;
5402
5546
  }
5547
+
5548
+ set_map(new_map);
5403
5549
  set_elements(elems);
5550
+
5551
+ if (IsJSArray()) {
5552
+ JSArray::cast(this)->set_length(Smi::FromInt(length));
5553
+ }
5554
+
5555
+ return this;
5404
5556
  }
5405
5557
 
5406
5558
 
@@ -5487,7 +5639,7 @@ Object* JSObject::SetElementsLength(Object* len) {
5487
5639
 
5488
5640
  Object* smi_length = len->ToSmi();
5489
5641
  if (smi_length->IsSmi()) {
5490
- int value = Smi::cast(smi_length)->value();
5642
+ const int value = Smi::cast(smi_length)->value();
5491
5643
  if (value < 0) return ArrayLengthRangeError();
5492
5644
  switch (GetElementsKind()) {
5493
5645
  case FAST_ELEMENTS: {
@@ -5509,12 +5661,8 @@ Object* JSObject::SetElementsLength(Object* len) {
5509
5661
  int new_capacity = value > min ? value : min;
5510
5662
  if (new_capacity <= kMaxFastElementsLength ||
5511
5663
  !ShouldConvertToSlowElements(new_capacity)) {
5512
- Object* obj = Heap::AllocateFixedArrayWithHoles(new_capacity);
5664
+ Object* obj = SetFastElementsCapacityAndLength(new_capacity, value);
5513
5665
  if (obj->IsFailure()) return obj;
5514
- if (IsJSArray()) {
5515
- JSArray::cast(this)->set_length(Smi::cast(smi_length));
5516
- }
5517
- SetFastElements(FixedArray::cast(obj));
5518
5666
  return this;
5519
5667
  }
5520
5668
  break;
@@ -5525,7 +5673,8 @@ Object* JSObject::SetElementsLength(Object* len) {
5525
5673
  // If the length of a slow array is reset to zero, we clear
5526
5674
  // the array and flush backing storage. This has the added
5527
5675
  // benefit that the array returns to fast mode.
5528
- initialize_elements();
5676
+ Object* obj = ResetElements();
5677
+ if (obj->IsFailure()) return obj;
5529
5678
  } else {
5530
5679
  // Remove deleted elements.
5531
5680
  uint32_t old_length =
@@ -5545,7 +5694,7 @@ Object* JSObject::SetElementsLength(Object* len) {
5545
5694
  // General slow case.
5546
5695
  if (len->IsNumber()) {
5547
5696
  uint32_t length;
5548
- if (Array::IndexFromObject(len, &length)) {
5697
+ if (len->ToArrayIndex(&length)) {
5549
5698
  return SetSlowElements(len);
5550
5699
  } else {
5551
5700
  return ArrayLengthRangeError();
@@ -5601,6 +5750,8 @@ Object* JSObject::SetPrototype(Object* value,
5601
5750
  Map::cast(new_map)->set_prototype(value);
5602
5751
  real_receiver->set_map(Map::cast(new_map));
5603
5752
 
5753
+ Heap::ClearInstanceofCache();
5754
+
5604
5755
  return value;
5605
5756
  }
5606
5757
 
@@ -5844,6 +5995,108 @@ Object* JSObject::SetElementWithInterceptor(uint32_t index, Object* value) {
5844
5995
  }
5845
5996
 
5846
5997
 
5998
+ Object* JSObject::GetElementWithCallback(Object* receiver,
5999
+ Object* structure,
6000
+ uint32_t index,
6001
+ Object* holder) {
6002
+ ASSERT(!structure->IsProxy());
6003
+
6004
+ // api style callbacks.
6005
+ if (structure->IsAccessorInfo()) {
6006
+ AccessorInfo* data = AccessorInfo::cast(structure);
6007
+ Object* fun_obj = data->getter();
6008
+ v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
6009
+ HandleScope scope;
6010
+ Handle<JSObject> self(JSObject::cast(receiver));
6011
+ Handle<JSObject> holder_handle(JSObject::cast(holder));
6012
+ Handle<Object> number = Factory::NewNumberFromUint(index);
6013
+ Handle<String> key(Factory::NumberToString(number));
6014
+ LOG(ApiNamedPropertyAccess("load", *self, *key));
6015
+ CustomArguments args(data->data(), *self, *holder_handle);
6016
+ v8::AccessorInfo info(args.end());
6017
+ v8::Handle<v8::Value> result;
6018
+ {
6019
+ // Leaving JavaScript.
6020
+ VMState state(EXTERNAL);
6021
+ result = call_fun(v8::Utils::ToLocal(key), info);
6022
+ }
6023
+ RETURN_IF_SCHEDULED_EXCEPTION();
6024
+ if (result.IsEmpty()) return Heap::undefined_value();
6025
+ return *v8::Utils::OpenHandle(*result);
6026
+ }
6027
+
6028
+ // __defineGetter__ callback
6029
+ if (structure->IsFixedArray()) {
6030
+ Object* getter = FixedArray::cast(structure)->get(kGetterIndex);
6031
+ if (getter->IsJSFunction()) {
6032
+ return Object::GetPropertyWithDefinedGetter(receiver,
6033
+ JSFunction::cast(getter));
6034
+ }
6035
+ // Getter is not a function.
6036
+ return Heap::undefined_value();
6037
+ }
6038
+
6039
+ UNREACHABLE();
6040
+ return NULL;
6041
+ }
6042
+
6043
+
6044
+ Object* JSObject::SetElementWithCallback(Object* structure,
6045
+ uint32_t index,
6046
+ Object* value,
6047
+ JSObject* holder) {
6048
+ HandleScope scope;
6049
+
6050
+ // We should never get here to initialize a const with the hole
6051
+ // value since a const declaration would conflict with the setter.
6052
+ ASSERT(!value->IsTheHole());
6053
+ Handle<Object> value_handle(value);
6054
+
6055
+ // To accommodate both the old and the new api we switch on the
6056
+ // data structure used to store the callbacks. Eventually proxy
6057
+ // callbacks should be phased out.
6058
+ ASSERT(!structure->IsProxy());
6059
+
6060
+ if (structure->IsAccessorInfo()) {
6061
+ // api style callbacks
6062
+ AccessorInfo* data = AccessorInfo::cast(structure);
6063
+ Object* call_obj = data->setter();
6064
+ v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj);
6065
+ if (call_fun == NULL) return value;
6066
+ Handle<Object> number = Factory::NewNumberFromUint(index);
6067
+ Handle<String> key(Factory::NumberToString(number));
6068
+ LOG(ApiNamedPropertyAccess("store", this, *key));
6069
+ CustomArguments args(data->data(), this, JSObject::cast(holder));
6070
+ v8::AccessorInfo info(args.end());
6071
+ {
6072
+ // Leaving JavaScript.
6073
+ VMState state(EXTERNAL);
6074
+ call_fun(v8::Utils::ToLocal(key),
6075
+ v8::Utils::ToLocal(value_handle),
6076
+ info);
6077
+ }
6078
+ RETURN_IF_SCHEDULED_EXCEPTION();
6079
+ return *value_handle;
6080
+ }
6081
+
6082
+ if (structure->IsFixedArray()) {
6083
+ Object* setter = FixedArray::cast(structure)->get(kSetterIndex);
6084
+ if (setter->IsJSFunction()) {
6085
+ return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value);
6086
+ } else {
6087
+ Handle<Object> holder_handle(holder);
6088
+ Handle<Object> key(Factory::NewNumberFromUint(index));
6089
+ Handle<Object> args[2] = { key, holder_handle };
6090
+ return Top::Throw(*Factory::NewTypeError("no_setter_in_callback",
6091
+ HandleVector(args, 2)));
6092
+ }
6093
+ }
6094
+
6095
+ UNREACHABLE();
6096
+ return NULL;
6097
+ }
6098
+
6099
+
5847
6100
  // Adding n elements in fast case is O(n*n).
5848
6101
  // Note: revisit design to have dual undefined values to capture absent
5849
6102
  // elements.
@@ -5854,9 +6107,8 @@ Object* JSObject::SetFastElement(uint32_t index, Object* value) {
5854
6107
  uint32_t elms_length = static_cast<uint32_t>(elms->length());
5855
6108
 
5856
6109
  if (!IsJSArray() && (index >= elms_length || elms->get(index)->IsTheHole())) {
5857
- Object* setter = LookupCallbackSetterInPrototypes(index);
5858
- if (setter->IsJSFunction()) {
5859
- return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value);
6110
+ if (SetElementWithCallbackSetterInPrototypes(index, value)) {
6111
+ return value;
5860
6112
  }
5861
6113
  }
5862
6114
 
@@ -5866,8 +6118,7 @@ Object* JSObject::SetFastElement(uint32_t index, Object* value) {
5866
6118
  if (IsJSArray()) {
5867
6119
  // Update the length of the array if needed.
5868
6120
  uint32_t array_length = 0;
5869
- CHECK(Array::IndexFromObject(JSArray::cast(this)->length(),
5870
- &array_length));
6121
+ CHECK(JSArray::cast(this)->length()->ToArrayIndex(&array_length));
5871
6122
  if (index >= array_length) {
5872
6123
  JSArray::cast(this)->set_length(Smi::FromInt(index + 1));
5873
6124
  }
@@ -5882,12 +6133,8 @@ Object* JSObject::SetFastElement(uint32_t index, Object* value) {
5882
6133
  if (new_capacity <= kMaxFastElementsLength ||
5883
6134
  !ShouldConvertToSlowElements(new_capacity)) {
5884
6135
  ASSERT(static_cast<uint32_t>(new_capacity) > index);
5885
- Object* obj = Heap::AllocateFixedArrayWithHoles(new_capacity);
6136
+ Object* obj = SetFastElementsCapacityAndLength(new_capacity, index + 1);
5886
6137
  if (obj->IsFailure()) return obj;
5887
- SetFastElements(FixedArray::cast(obj));
5888
- if (IsJSArray()) {
5889
- JSArray::cast(this)->set_length(Smi::FromInt(index + 1));
5890
- }
5891
6138
  FixedArray::cast(elements())->set(index, value);
5892
6139
  return value;
5893
6140
  }
@@ -5974,18 +6221,7 @@ Object* JSObject::SetElementWithoutInterceptor(uint32_t index, Object* value) {
5974
6221
  Object* element = dictionary->ValueAt(entry);
5975
6222
  PropertyDetails details = dictionary->DetailsAt(entry);
5976
6223
  if (details.type() == CALLBACKS) {
5977
- // Only accessors allowed as elements.
5978
- FixedArray* structure = FixedArray::cast(element);
5979
- if (structure->get(kSetterIndex)->IsJSFunction()) {
5980
- JSFunction* setter = JSFunction::cast(structure->get(kSetterIndex));
5981
- return SetPropertyWithDefinedSetter(setter, value);
5982
- } else {
5983
- Handle<Object> self(this);
5984
- Handle<Object> key(Factory::NewNumberFromUint(index));
5985
- Handle<Object> args[2] = { key, self };
5986
- return Top::Throw(*Factory::NewTypeError("no_setter_in_callback",
5987
- HandleVector(args, 2)));
5988
- }
6224
+ return SetElementWithCallback(element, index, value, this);
5989
6225
  } else {
5990
6226
  dictionary->UpdateMaxNumberKey(index);
5991
6227
  dictionary->ValueAtPut(entry, value);
@@ -5993,12 +6229,19 @@ Object* JSObject::SetElementWithoutInterceptor(uint32_t index, Object* value) {
5993
6229
  } else {
5994
6230
  // Index not already used. Look for an accessor in the prototype chain.
5995
6231
  if (!IsJSArray()) {
5996
- Object* setter = LookupCallbackSetterInPrototypes(index);
5997
- if (setter->IsJSFunction()) {
5998
- return SetPropertyWithDefinedSetter(JSFunction::cast(setter),
5999
- value);
6232
+ if (SetElementWithCallbackSetterInPrototypes(index, value)) {
6233
+ return value;
6000
6234
  }
6001
6235
  }
6236
+ // When we set the is_extensible flag to false we always force
6237
+ // the element into dictionary mode (and force them to stay there).
6238
+ if (!map()->is_extensible()) {
6239
+ Handle<Object> number(Heap::NumberFromUint32(index));
6240
+ Handle<String> index_string(Factory::NumberToString(number));
6241
+ Handle<Object> args[1] = { index_string };
6242
+ return Top::Throw(*Factory::NewTypeError("object_not_extensible",
6243
+ HandleVector(args, 1)));
6244
+ }
6002
6245
  Object* result = dictionary->AtNumberPut(index, value);
6003
6246
  if (result->IsFailure()) return result;
6004
6247
  if (elms != FixedArray::cast(result)) {
@@ -6018,15 +6261,12 @@ Object* JSObject::SetElementWithoutInterceptor(uint32_t index, Object* value) {
6018
6261
  if (ShouldConvertToFastElements()) {
6019
6262
  uint32_t new_length = 0;
6020
6263
  if (IsJSArray()) {
6021
- CHECK(Array::IndexFromObject(JSArray::cast(this)->length(),
6022
- &new_length));
6023
- JSArray::cast(this)->set_length(Smi::FromInt(new_length));
6264
+ CHECK(JSArray::cast(this)->length()->ToArrayIndex(&new_length));
6024
6265
  } else {
6025
6266
  new_length = NumberDictionary::cast(elements())->max_number_key() + 1;
6026
6267
  }
6027
- Object* obj = Heap::AllocateFixedArrayWithHoles(new_length);
6268
+ Object* obj = SetFastElementsCapacityAndLength(new_length, new_length);
6028
6269
  if (obj->IsFailure()) return obj;
6029
- SetFastElements(FixedArray::cast(obj));
6030
6270
  #ifdef DEBUG
6031
6271
  if (FLAG_trace_normalization) {
6032
6272
  PrintF("Object elements are fast case again:\n");
@@ -6050,7 +6290,7 @@ Object* JSObject::SetElementWithoutInterceptor(uint32_t index, Object* value) {
6050
6290
 
6051
6291
  Object* JSArray::JSArrayUpdateLengthFromIndex(uint32_t index, Object* value) {
6052
6292
  uint32_t old_len = 0;
6053
- CHECK(Array::IndexFromObject(length(), &old_len));
6293
+ CHECK(length()->ToArrayIndex(&old_len));
6054
6294
  // Check to see if we need to update the length. For now, we make
6055
6295
  // sure that the length stays within 32-bits (unsigned).
6056
6296
  if (index >= old_len && index != 0xffffffff) {
@@ -6099,16 +6339,10 @@ Object* JSObject::GetElementPostInterceptor(JSObject* receiver,
6099
6339
  Object* element = dictionary->ValueAt(entry);
6100
6340
  PropertyDetails details = dictionary->DetailsAt(entry);
6101
6341
  if (details.type() == CALLBACKS) {
6102
- // Only accessors allowed as elements.
6103
- FixedArray* structure = FixedArray::cast(element);
6104
- Object* getter = structure->get(kGetterIndex);
6105
- if (getter->IsJSFunction()) {
6106
- return GetPropertyWithDefinedGetter(receiver,
6107
- JSFunction::cast(getter));
6108
- } else {
6109
- // Getter is not a function.
6110
- return Heap::undefined_value();
6111
- }
6342
+ return GetElementWithCallback(receiver,
6343
+ element,
6344
+ index,
6345
+ this);
6112
6346
  }
6113
6347
  return element;
6114
6348
  }
@@ -6256,16 +6490,10 @@ Object* JSObject::GetElementWithReceiver(JSObject* receiver, uint32_t index) {
6256
6490
  Object* element = dictionary->ValueAt(entry);
6257
6491
  PropertyDetails details = dictionary->DetailsAt(entry);
6258
6492
  if (details.type() == CALLBACKS) {
6259
- // Only accessors allowed as elements.
6260
- FixedArray* structure = FixedArray::cast(element);
6261
- Object* getter = structure->get(kGetterIndex);
6262
- if (getter->IsJSFunction()) {
6263
- return GetPropertyWithDefinedGetter(receiver,
6264
- JSFunction::cast(getter));
6265
- } else {
6266
- // Getter is not a function.
6267
- return Heap::undefined_value();
6268
- }
6493
+ return GetElementWithCallback(receiver,
6494
+ element,
6495
+ index,
6496
+ this);
6269
6497
  }
6270
6498
  return element;
6271
6499
  }
@@ -6344,7 +6572,7 @@ bool JSObject::ShouldConvertToFastElements() {
6344
6572
  // fast elements.
6345
6573
  uint32_t length = 0;
6346
6574
  if (IsJSArray()) {
6347
- CHECK(Array::IndexFromObject(JSArray::cast(this)->length(), &length));
6575
+ CHECK(JSArray::cast(this)->length()->ToArrayIndex(&length));
6348
6576
  } else {
6349
6577
  length = dictionary->max_number_key();
6350
6578
  }
@@ -7035,15 +7263,9 @@ class SymbolKey : public HashTableKey {
7035
7263
  }
7036
7264
 
7037
7265
  Object* AsObject() {
7038
- // If the string is a cons string, attempt to flatten it so that
7039
- // symbols will most often be flat strings.
7040
- if (StringShape(string_).IsCons()) {
7041
- ConsString* cons_string = ConsString::cast(string_);
7042
- cons_string->TryFlatten();
7043
- if (cons_string->second()->length() == 0) {
7044
- string_ = cons_string->first();
7045
- }
7046
- }
7266
+ // Attempt to flatten the string, so that symbols will most often
7267
+ // be flat strings.
7268
+ string_ = string_->TryFlattenGetString();
7047
7269
  // Transform string to symbol if possible.
7048
7270
  Map* map = Heap::SymbolMapForString(string_);
7049
7271
  if (map != NULL) {
@@ -7118,6 +7340,46 @@ int HashTable<Shape, Key>::FindEntry(Key key) {
7118
7340
  }
7119
7341
 
7120
7342
 
7343
+ // Find entry for key otherwise return kNotFound.
7344
+ int StringDictionary::FindEntry(String* key) {
7345
+ if (!key->IsSymbol()) {
7346
+ return HashTable<StringDictionaryShape, String*>::FindEntry(key);
7347
+ }
7348
+
7349
+ // Optimized for symbol key. Knowledge of the key type allows:
7350
+ // 1. Move the check if the key is a symbol out of the loop.
7351
+ // 2. Avoid comparing hash codes in symbol to symbol comparision.
7352
+ // 3. Detect a case when a dictionary key is not a symbol but the key is.
7353
+ // In case of positive result the dictionary key may be replaced by
7354
+ // the symbol with minimal performance penalty. It gives a chance to
7355
+ // perform further lookups in code stubs (and significant performance boost
7356
+ // a certain style of code).
7357
+
7358
+ // EnsureCapacity will guarantee the hash table is never full.
7359
+ uint32_t capacity = Capacity();
7360
+ uint32_t entry = FirstProbe(key->Hash(), capacity);
7361
+ uint32_t count = 1;
7362
+
7363
+ while (true) {
7364
+ int index = EntryToIndex(entry);
7365
+ Object* element = get(index);
7366
+ if (element->IsUndefined()) break; // Empty entry.
7367
+ if (key == element) return entry;
7368
+ if (!element->IsSymbol() &&
7369
+ !element->IsNull() &&
7370
+ String::cast(element)->Equals(key)) {
7371
+ // Replace a non-symbol key by the equivalent symbol for faster further
7372
+ // lookups.
7373
+ set(index, key);
7374
+ return entry;
7375
+ }
7376
+ ASSERT(element->IsNull() || !String::cast(element)->Equals(key));
7377
+ entry = NextProbe(entry, count++, capacity);
7378
+ }
7379
+ return kNotFound;
7380
+ }
7381
+
7382
+
7121
7383
  template<typename Shape, typename Key>
7122
7384
  Object* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) {
7123
7385
  int capacity = Capacity();
@@ -7348,14 +7610,18 @@ Object* JSObject::PrepareElementsForSort(uint32_t limit) {
7348
7610
  }
7349
7611
  // Convert to fast elements.
7350
7612
 
7613
+ Object* obj = map()->GetFastElementsMap();
7614
+ if (obj->IsFailure()) return obj;
7615
+ Map* new_map = Map::cast(obj);
7616
+
7351
7617
  PretenureFlag tenure = Heap::InNewSpace(this) ? NOT_TENURED: TENURED;
7352
7618
  Object* new_array =
7353
7619
  Heap::AllocateFixedArray(dict->NumberOfElements(), tenure);
7354
- if (new_array->IsFailure()) {
7355
- return new_array;
7356
- }
7620
+ if (new_array->IsFailure()) return new_array;
7357
7621
  FixedArray* fast_elements = FixedArray::cast(new_array);
7358
7622
  dict->CopyValuesTo(fast_elements);
7623
+
7624
+ set_map(new_map);
7359
7625
  set_elements(fast_elements);
7360
7626
  }
7361
7627
  ASSERT(HasFastElements());
@@ -7977,7 +8243,7 @@ Object* Dictionary<Shape, Key>::DeleteProperty(int entry,
7977
8243
 
7978
8244
  template<typename Shape, typename Key>
7979
8245
  Object* Dictionary<Shape, Key>::AtPut(Key key, Object* value) {
7980
- int entry = FindEntry(key);
8246
+ int entry = this->FindEntry(key);
7981
8247
 
7982
8248
  // If the entry is present set the value;
7983
8249
  if (entry != Dictionary<Shape, Key>::kNotFound) {
@@ -8002,7 +8268,7 @@ Object* Dictionary<Shape, Key>::Add(Key key,
8002
8268
  Object* value,
8003
8269
  PropertyDetails details) {
8004
8270
  // Valdate key is absent.
8005
- SLOW_ASSERT((FindEntry(key) == Dictionary<Shape, Key>::kNotFound));
8271
+ SLOW_ASSERT((this->FindEntry(key) == Dictionary<Shape, Key>::kNotFound));
8006
8272
  // Check whether the dictionary should be extended.
8007
8273
  Object* obj = EnsureCapacity(1, key);
8008
8274
  if (obj->IsFailure()) return obj;
@@ -8061,7 +8327,7 @@ Object* NumberDictionary::AddNumberEntry(uint32_t key,
8061
8327
  Object* value,
8062
8328
  PropertyDetails details) {
8063
8329
  UpdateMaxNumberKey(key);
8064
- SLOW_ASSERT(FindEntry(key) == kNotFound);
8330
+ SLOW_ASSERT(this->FindEntry(key) == kNotFound);
8065
8331
  return Add(key, value, details);
8066
8332
  }
8067
8333