libv8 3.10.8.0 → 3.11.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (215) hide show
  1. data/Rakefile +10 -3
  2. data/ext/libv8/compiler.rb +46 -0
  3. data/ext/libv8/extconf.rb +5 -1
  4. data/ext/libv8/make.rb +13 -0
  5. data/lib/libv8/version.rb +1 -1
  6. data/patches/add-freebsd9-and-freebsd10-to-gyp-GetFlavor.patch +11 -0
  7. data/patches/src_platform-freebsd.cc.patch +10 -0
  8. data/vendor/v8/ChangeLog +124 -0
  9. data/vendor/v8/DEPS +27 -0
  10. data/vendor/v8/Makefile +7 -0
  11. data/vendor/v8/SConstruct +15 -2
  12. data/vendor/v8/build/common.gypi +129 -157
  13. data/vendor/v8/build/gyp_v8 +11 -25
  14. data/vendor/v8/build/standalone.gypi +9 -3
  15. data/vendor/v8/include/v8.h +5 -3
  16. data/vendor/v8/src/SConscript +1 -0
  17. data/vendor/v8/src/api.cc +4 -33
  18. data/vendor/v8/src/api.h +2 -2
  19. data/vendor/v8/src/arm/builtins-arm.cc +5 -4
  20. data/vendor/v8/src/arm/code-stubs-arm.cc +21 -14
  21. data/vendor/v8/src/arm/codegen-arm.cc +2 -2
  22. data/vendor/v8/src/arm/debug-arm.cc +3 -1
  23. data/vendor/v8/src/arm/full-codegen-arm.cc +3 -102
  24. data/vendor/v8/src/arm/ic-arm.cc +30 -33
  25. data/vendor/v8/src/arm/lithium-arm.cc +20 -7
  26. data/vendor/v8/src/arm/lithium-arm.h +10 -4
  27. data/vendor/v8/src/arm/lithium-codegen-arm.cc +106 -60
  28. data/vendor/v8/src/arm/macro-assembler-arm.cc +49 -39
  29. data/vendor/v8/src/arm/macro-assembler-arm.h +5 -4
  30. data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +115 -55
  31. data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +7 -6
  32. data/vendor/v8/src/arm/simulator-arm.h +6 -6
  33. data/vendor/v8/src/arm/stub-cache-arm.cc +64 -19
  34. data/vendor/v8/src/array.js +7 -3
  35. data/vendor/v8/src/ast.cc +11 -6
  36. data/vendor/v8/src/bootstrapper.cc +9 -11
  37. data/vendor/v8/src/builtins.cc +61 -31
  38. data/vendor/v8/src/code-stubs.cc +23 -9
  39. data/vendor/v8/src/code-stubs.h +1 -0
  40. data/vendor/v8/src/codegen.h +3 -3
  41. data/vendor/v8/src/compiler.cc +1 -1
  42. data/vendor/v8/src/contexts.h +2 -18
  43. data/vendor/v8/src/d8.cc +94 -93
  44. data/vendor/v8/src/d8.h +1 -1
  45. data/vendor/v8/src/debug-agent.cc +3 -3
  46. data/vendor/v8/src/debug.cc +41 -1
  47. data/vendor/v8/src/debug.h +50 -0
  48. data/vendor/v8/src/elements-kind.cc +134 -0
  49. data/vendor/v8/src/elements-kind.h +210 -0
  50. data/vendor/v8/src/elements.cc +356 -190
  51. data/vendor/v8/src/elements.h +36 -28
  52. data/vendor/v8/src/factory.cc +44 -4
  53. data/vendor/v8/src/factory.h +11 -7
  54. data/vendor/v8/src/flag-definitions.h +3 -0
  55. data/vendor/v8/src/frames.h +3 -0
  56. data/vendor/v8/src/full-codegen.cc +2 -1
  57. data/vendor/v8/src/func-name-inferrer.h +2 -0
  58. data/vendor/v8/src/globals.h +3 -0
  59. data/vendor/v8/src/heap-inl.h +16 -4
  60. data/vendor/v8/src/heap.cc +38 -32
  61. data/vendor/v8/src/heap.h +3 -17
  62. data/vendor/v8/src/hydrogen-instructions.cc +28 -5
  63. data/vendor/v8/src/hydrogen-instructions.h +142 -44
  64. data/vendor/v8/src/hydrogen.cc +160 -55
  65. data/vendor/v8/src/hydrogen.h +2 -0
  66. data/vendor/v8/src/ia32/assembler-ia32.h +3 -0
  67. data/vendor/v8/src/ia32/builtins-ia32.cc +5 -4
  68. data/vendor/v8/src/ia32/code-stubs-ia32.cc +22 -16
  69. data/vendor/v8/src/ia32/codegen-ia32.cc +2 -2
  70. data/vendor/v8/src/ia32/debug-ia32.cc +29 -2
  71. data/vendor/v8/src/ia32/full-codegen-ia32.cc +8 -101
  72. data/vendor/v8/src/ia32/ic-ia32.cc +23 -19
  73. data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +126 -80
  74. data/vendor/v8/src/ia32/lithium-codegen-ia32.h +2 -1
  75. data/vendor/v8/src/ia32/lithium-ia32.cc +15 -9
  76. data/vendor/v8/src/ia32/lithium-ia32.h +14 -6
  77. data/vendor/v8/src/ia32/macro-assembler-ia32.cc +50 -40
  78. data/vendor/v8/src/ia32/macro-assembler-ia32.h +5 -4
  79. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +113 -43
  80. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +9 -4
  81. data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
  82. data/vendor/v8/src/ia32/stub-cache-ia32.cc +52 -14
  83. data/vendor/v8/src/ic.cc +77 -20
  84. data/vendor/v8/src/ic.h +18 -2
  85. data/vendor/v8/src/incremental-marking-inl.h +21 -5
  86. data/vendor/v8/src/incremental-marking.cc +35 -8
  87. data/vendor/v8/src/incremental-marking.h +12 -3
  88. data/vendor/v8/src/isolate.cc +12 -2
  89. data/vendor/v8/src/isolate.h +1 -1
  90. data/vendor/v8/src/jsregexp.cc +66 -26
  91. data/vendor/v8/src/jsregexp.h +60 -31
  92. data/vendor/v8/src/list-inl.h +8 -0
  93. data/vendor/v8/src/list.h +3 -0
  94. data/vendor/v8/src/lithium.cc +5 -2
  95. data/vendor/v8/src/liveedit.cc +57 -5
  96. data/vendor/v8/src/mark-compact-inl.h +17 -11
  97. data/vendor/v8/src/mark-compact.cc +100 -143
  98. data/vendor/v8/src/mark-compact.h +44 -20
  99. data/vendor/v8/src/messages.js +131 -99
  100. data/vendor/v8/src/mips/builtins-mips.cc +5 -4
  101. data/vendor/v8/src/mips/code-stubs-mips.cc +23 -15
  102. data/vendor/v8/src/mips/codegen-mips.cc +2 -2
  103. data/vendor/v8/src/mips/debug-mips.cc +3 -1
  104. data/vendor/v8/src/mips/full-codegen-mips.cc +4 -102
  105. data/vendor/v8/src/mips/ic-mips.cc +34 -36
  106. data/vendor/v8/src/mips/lithium-codegen-mips.cc +116 -68
  107. data/vendor/v8/src/mips/lithium-mips.cc +20 -7
  108. data/vendor/v8/src/mips/lithium-mips.h +11 -4
  109. data/vendor/v8/src/mips/macro-assembler-mips.cc +50 -39
  110. data/vendor/v8/src/mips/macro-assembler-mips.h +5 -4
  111. data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +110 -50
  112. data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +6 -5
  113. data/vendor/v8/src/mips/simulator-mips.h +5 -5
  114. data/vendor/v8/src/mips/stub-cache-mips.cc +66 -20
  115. data/vendor/v8/src/mksnapshot.cc +5 -1
  116. data/vendor/v8/src/objects-debug.cc +103 -6
  117. data/vendor/v8/src/objects-inl.h +215 -116
  118. data/vendor/v8/src/objects-printer.cc +13 -8
  119. data/vendor/v8/src/objects.cc +608 -331
  120. data/vendor/v8/src/objects.h +129 -94
  121. data/vendor/v8/src/parser.cc +16 -4
  122. data/vendor/v8/src/platform-freebsd.cc +1 -0
  123. data/vendor/v8/src/platform-linux.cc +9 -30
  124. data/vendor/v8/src/platform-posix.cc +28 -7
  125. data/vendor/v8/src/platform-win32.cc +15 -3
  126. data/vendor/v8/src/platform.h +2 -1
  127. data/vendor/v8/src/profile-generator-inl.h +25 -2
  128. data/vendor/v8/src/profile-generator.cc +300 -822
  129. data/vendor/v8/src/profile-generator.h +97 -214
  130. data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +2 -1
  131. data/vendor/v8/src/regexp-macro-assembler-irregexp.h +2 -2
  132. data/vendor/v8/src/regexp-macro-assembler-tracer.cc +6 -5
  133. data/vendor/v8/src/regexp-macro-assembler-tracer.h +1 -1
  134. data/vendor/v8/src/regexp-macro-assembler.cc +7 -3
  135. data/vendor/v8/src/regexp-macro-assembler.h +10 -2
  136. data/vendor/v8/src/regexp.js +6 -0
  137. data/vendor/v8/src/runtime.cc +265 -212
  138. data/vendor/v8/src/runtime.h +6 -5
  139. data/vendor/v8/src/scopes.cc +20 -0
  140. data/vendor/v8/src/scopes.h +6 -3
  141. data/vendor/v8/src/spaces.cc +0 -2
  142. data/vendor/v8/src/string-stream.cc +2 -2
  143. data/vendor/v8/src/v8-counters.h +0 -2
  144. data/vendor/v8/src/v8natives.js +2 -2
  145. data/vendor/v8/src/v8utils.h +6 -3
  146. data/vendor/v8/src/version.cc +1 -1
  147. data/vendor/v8/src/x64/assembler-x64.h +2 -1
  148. data/vendor/v8/src/x64/builtins-x64.cc +5 -4
  149. data/vendor/v8/src/x64/code-stubs-x64.cc +25 -16
  150. data/vendor/v8/src/x64/codegen-x64.cc +2 -2
  151. data/vendor/v8/src/x64/debug-x64.cc +14 -1
  152. data/vendor/v8/src/x64/disasm-x64.cc +1 -1
  153. data/vendor/v8/src/x64/full-codegen-x64.cc +10 -106
  154. data/vendor/v8/src/x64/ic-x64.cc +20 -16
  155. data/vendor/v8/src/x64/lithium-codegen-x64.cc +156 -79
  156. data/vendor/v8/src/x64/lithium-codegen-x64.h +2 -1
  157. data/vendor/v8/src/x64/lithium-x64.cc +18 -8
  158. data/vendor/v8/src/x64/lithium-x64.h +7 -2
  159. data/vendor/v8/src/x64/macro-assembler-x64.cc +50 -40
  160. data/vendor/v8/src/x64/macro-assembler-x64.h +5 -4
  161. data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +122 -51
  162. data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +17 -8
  163. data/vendor/v8/src/x64/simulator-x64.h +4 -4
  164. data/vendor/v8/src/x64/stub-cache-x64.cc +55 -17
  165. data/vendor/v8/test/cctest/cctest.status +1 -0
  166. data/vendor/v8/test/cctest/test-api.cc +24 -0
  167. data/vendor/v8/test/cctest/test-func-name-inference.cc +38 -0
  168. data/vendor/v8/test/cctest/test-heap-profiler.cc +21 -77
  169. data/vendor/v8/test/cctest/test-heap.cc +164 -3
  170. data/vendor/v8/test/cctest/test-list.cc +12 -0
  171. data/vendor/v8/test/cctest/test-mark-compact.cc +5 -5
  172. data/vendor/v8/test/cctest/test-regexp.cc +14 -8
  173. data/vendor/v8/test/cctest/testcfg.py +2 -0
  174. data/vendor/v8/test/mjsunit/accessor-map-sharing.js +176 -0
  175. data/vendor/v8/test/mjsunit/array-construct-transition.js +3 -3
  176. data/vendor/v8/test/mjsunit/array-literal-transitions.js +10 -10
  177. data/vendor/v8/test/mjsunit/big-array-literal.js +3 -0
  178. data/vendor/v8/test/mjsunit/compiler/inline-construct.js +4 -2
  179. data/vendor/v8/test/mjsunit/debug-liveedit-stack-padding.js +88 -0
  180. data/vendor/v8/test/mjsunit/elements-kind.js +4 -4
  181. data/vendor/v8/test/mjsunit/elements-transition-hoisting.js +2 -2
  182. data/vendor/v8/test/mjsunit/elements-transition.js +5 -5
  183. data/vendor/v8/test/mjsunit/error-constructors.js +68 -33
  184. data/vendor/v8/test/mjsunit/harmony/proxies.js +14 -6
  185. data/vendor/v8/test/mjsunit/mjsunit.status +1 -0
  186. data/vendor/v8/test/mjsunit/packed-elements.js +112 -0
  187. data/vendor/v8/test/mjsunit/regexp-capture-3.js +6 -0
  188. data/vendor/v8/test/mjsunit/regexp-global.js +132 -0
  189. data/vendor/v8/test/mjsunit/regexp.js +11 -0
  190. data/vendor/v8/test/mjsunit/regress/regress-117409.js +52 -0
  191. data/vendor/v8/test/mjsunit/regress/regress-126412.js +33 -0
  192. data/vendor/v8/test/mjsunit/regress/regress-128018.js +35 -0
  193. data/vendor/v8/test/mjsunit/regress/regress-128146.js +33 -0
  194. data/vendor/v8/test/mjsunit/regress/regress-1639-2.js +4 -1
  195. data/vendor/v8/test/mjsunit/regress/regress-1639.js +14 -8
  196. data/vendor/v8/test/mjsunit/regress/regress-1849.js +3 -3
  197. data/vendor/v8/test/mjsunit/regress/regress-1878.js +2 -2
  198. data/vendor/v8/test/mjsunit/regress/regress-2071.js +79 -0
  199. data/vendor/v8/test/mjsunit/regress/regress-2153.js +32 -0
  200. data/vendor/v8/test/mjsunit/regress/regress-crbug-122271.js +4 -4
  201. data/vendor/v8/test/mjsunit/regress/regress-crbug-126414.js +32 -0
  202. data/vendor/v8/test/mjsunit/regress/regress-smi-only-concat.js +2 -2
  203. data/vendor/v8/test/mjsunit/regress/regress-transcendental.js +49 -0
  204. data/vendor/v8/test/mjsunit/stack-traces.js +14 -0
  205. data/vendor/v8/test/mjsunit/unbox-double-arrays.js +4 -3
  206. data/vendor/v8/test/test262/testcfg.py +6 -1
  207. data/vendor/v8/tools/check-static-initializers.sh +11 -3
  208. data/vendor/v8/tools/fuzz-harness.sh +92 -0
  209. data/vendor/v8/tools/grokdump.py +658 -67
  210. data/vendor/v8/tools/gyp/v8.gyp +21 -39
  211. data/vendor/v8/tools/js2c.py +3 -3
  212. data/vendor/v8/tools/jsmin.py +2 -2
  213. data/vendor/v8/tools/presubmit.py +2 -1
  214. data/vendor/v8/tools/test-wrapper-gypbuild.py +25 -11
  215. metadata +624 -612
@@ -28,6 +28,7 @@
28
28
  #ifndef V8_ELEMENTS_H_
29
29
  #define V8_ELEMENTS_H_
30
30
 
31
+ #include "elements-kind.h"
31
32
  #include "objects.h"
32
33
  #include "heap.h"
33
34
  #include "isolate.h"
@@ -45,6 +46,10 @@ class ElementsAccessor {
45
46
  virtual ElementsKind kind() const = 0;
46
47
  const char* name() const { return name_; }
47
48
 
49
+ // Checks the elements of an object for consistency, asserting when a problem
50
+ // is found.
51
+ virtual void Validate(JSObject* obj) = 0;
52
+
48
53
  // Returns true if a holder contains an element with the specified key
49
54
  // without iterating up the prototype chain. The caller can optionally pass
50
55
  // in the backing store to use for the check, which must be compatible with
@@ -60,18 +65,19 @@ class ElementsAccessor {
60
65
  // can optionally pass in the backing store to use for the check, which must
61
66
  // be compatible with the ElementsKind of the ElementsAccessor. If
62
67
  // backing_store is NULL, the holder->elements() is used as the backing store.
63
- virtual MaybeObject* Get(Object* receiver,
64
- JSObject* holder,
65
- uint32_t key,
66
- FixedArrayBase* backing_store = NULL) = 0;
68
+ MUST_USE_RESULT virtual MaybeObject* Get(
69
+ Object* receiver,
70
+ JSObject* holder,
71
+ uint32_t key,
72
+ FixedArrayBase* backing_store = NULL) = 0;
67
73
 
68
74
  // Modifies the length data property as specified for JSArrays and resizes the
69
75
  // underlying backing store accordingly. The method honors the semantics of
70
76
  // changing array sizes as defined in EcmaScript 5.1 15.4.5.2, i.e. array that
71
77
  // have non-deletable elements can only be shrunk to the size of highest
72
78
  // element that is non-deletable.
73
- virtual MaybeObject* SetLength(JSArray* holder,
74
- Object* new_length) = 0;
79
+ MUST_USE_RESULT virtual MaybeObject* SetLength(JSArray* holder,
80
+ Object* new_length) = 0;
75
81
 
76
82
  // Modifies both the length and capacity of a JSArray, resizing the underlying
77
83
  // backing store as necessary. This method does NOT honor the semantics of
@@ -79,14 +85,14 @@ class ElementsAccessor {
79
85
  // elements. This method should only be called for array expansion OR by
80
86
  // runtime JavaScript code that use InternalArrays and don't care about
81
87
  // EcmaScript 5.1 semantics.
82
- virtual MaybeObject* SetCapacityAndLength(JSArray* array,
83
- int capacity,
84
- int length) = 0;
88
+ MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength(JSArray* array,
89
+ int capacity,
90
+ int length) = 0;
85
91
 
86
92
  // Deletes an element in an object, returning a new elements backing store.
87
- virtual MaybeObject* Delete(JSObject* holder,
88
- uint32_t key,
89
- JSReceiver::DeleteMode mode) = 0;
93
+ MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* holder,
94
+ uint32_t key,
95
+ JSReceiver::DeleteMode mode) = 0;
90
96
 
91
97
  // If kCopyToEnd is specified as the copy_size to CopyElements, it copies all
92
98
  // of elements from source after source_start to the destination array.
@@ -101,26 +107,28 @@ class ElementsAccessor {
101
107
  // the source JSObject or JSArray in source_holder. If the holder's backing
102
108
  // store is available, it can be passed in source and source_holder is
103
109
  // ignored.
104
- virtual MaybeObject* CopyElements(JSObject* source_holder,
105
- uint32_t source_start,
106
- FixedArrayBase* destination,
107
- ElementsKind destination_kind,
108
- uint32_t destination_start,
109
- int copy_size,
110
- FixedArrayBase* source = NULL) = 0;
111
-
112
- MaybeObject* CopyElements(JSObject* from_holder,
113
- FixedArrayBase* to,
114
- ElementsKind to_kind,
115
- FixedArrayBase* from = NULL) {
110
+ MUST_USE_RESULT virtual MaybeObject* CopyElements(
111
+ JSObject* source_holder,
112
+ uint32_t source_start,
113
+ FixedArrayBase* destination,
114
+ ElementsKind destination_kind,
115
+ uint32_t destination_start,
116
+ int copy_size,
117
+ FixedArrayBase* source = NULL) = 0;
118
+
119
+ MUST_USE_RESULT MaybeObject* CopyElements(JSObject* from_holder,
120
+ FixedArrayBase* to,
121
+ ElementsKind to_kind,
122
+ FixedArrayBase* from = NULL) {
116
123
  return CopyElements(from_holder, 0, to, to_kind, 0,
117
124
  kCopyToEndAndInitializeToHole, from);
118
125
  }
119
126
 
120
- virtual MaybeObject* AddElementsToFixedArray(Object* receiver,
121
- JSObject* holder,
122
- FixedArray* to,
123
- FixedArrayBase* from = NULL) = 0;
127
+ MUST_USE_RESULT virtual MaybeObject* AddElementsToFixedArray(
128
+ Object* receiver,
129
+ JSObject* holder,
130
+ FixedArray* to,
131
+ FixedArrayBase* from = NULL) = 0;
124
132
 
125
133
  // Returns a shared ElementsAccessor for the specified ElementsKind.
126
134
  static ElementsAccessor* ForKind(ElementsKind elements_kind) {
@@ -34,6 +34,7 @@
34
34
  #include "macro-assembler.h"
35
35
  #include "objects.h"
36
36
  #include "objects-visiting.h"
37
+ #include "platform.h"
37
38
  #include "scopeinfo.h"
38
39
 
39
40
  namespace v8 {
@@ -675,6 +676,43 @@ Handle<Object> Factory::NewError(const char* type,
675
676
  }
676
677
 
677
678
 
679
+ Handle<String> Factory::EmergencyNewError(const char* type,
680
+ Handle<JSArray> args) {
681
+ const int kBufferSize = 1000;
682
+ char buffer[kBufferSize];
683
+ size_t space = kBufferSize;
684
+ char* p = &buffer[0];
685
+
686
+ Vector<char> v(buffer, kBufferSize);
687
+ OS::StrNCpy(v, type, space);
688
+ space -= Min(space, strlen(type));
689
+ p = &buffer[kBufferSize] - space;
690
+
691
+ for (unsigned i = 0; i < ARRAY_SIZE(args); i++) {
692
+ if (space > 0) {
693
+ *p++ = ' ';
694
+ space--;
695
+ if (space > 0) {
696
+ MaybeObject* maybe_arg = args->GetElement(i);
697
+ Handle<String> arg_str(reinterpret_cast<String*>(maybe_arg));
698
+ const char* arg = *arg_str->ToCString();
699
+ Vector<char> v2(p, space);
700
+ OS::StrNCpy(v2, arg, space);
701
+ space -= Min(space, strlen(arg));
702
+ p = &buffer[kBufferSize] - space;
703
+ }
704
+ }
705
+ }
706
+ if (space > 0) {
707
+ *p = '\0';
708
+ } else {
709
+ buffer[kBufferSize - 1] = '\0';
710
+ }
711
+ Handle<String> error_string = NewStringFromUtf8(CStrVector(buffer), TENURED);
712
+ return error_string;
713
+ }
714
+
715
+
678
716
  Handle<Object> Factory::NewError(const char* maker,
679
717
  const char* type,
680
718
  Handle<JSArray> args) {
@@ -683,8 +721,9 @@ Handle<Object> Factory::NewError(const char* maker,
683
721
  isolate()->js_builtins_object()->GetPropertyNoExceptionThrown(*make_str));
684
722
  // If the builtins haven't been properly configured yet this error
685
723
  // constructor may not have been defined. Bail out.
686
- if (!fun_obj->IsJSFunction())
687
- return undefined_value();
724
+ if (!fun_obj->IsJSFunction()) {
725
+ return EmergencyNewError(type, args);
726
+ }
688
727
  Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj);
689
728
  Handle<Object> type_obj = LookupAsciiSymbol(type);
690
729
  Handle<Object> argv[] = { type_obj, args };
@@ -775,7 +814,7 @@ Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name,
775
814
  instance_size != JSObject::kHeaderSize) {
776
815
  Handle<Map> initial_map = NewMap(type,
777
816
  instance_size,
778
- FAST_SMI_ONLY_ELEMENTS);
817
+ GetInitialFastElementsKind());
779
818
  function->set_initial_map(*initial_map);
780
819
  initial_map->set_constructor(*function);
781
820
  }
@@ -1013,10 +1052,11 @@ void Factory::EnsureCanContainHeapObjectElements(Handle<JSArray> array) {
1013
1052
 
1014
1053
  void Factory::EnsureCanContainElements(Handle<JSArray> array,
1015
1054
  Handle<FixedArrayBase> elements,
1055
+ uint32_t length,
1016
1056
  EnsureElementsMode mode) {
1017
1057
  CALL_HEAP_FUNCTION_VOID(
1018
1058
  isolate(),
1019
- array->EnsureCanContainElements(*elements, mode));
1059
+ array->EnsureCanContainElements(*elements, length, mode));
1020
1060
  }
1021
1061
 
1022
1062
 
@@ -216,9 +216,10 @@ class Factory {
216
216
  Handle<JSGlobalPropertyCell> NewJSGlobalPropertyCell(
217
217
  Handle<Object> value);
218
218
 
219
- Handle<Map> NewMap(InstanceType type,
220
- int instance_size,
221
- ElementsKind elements_kind = FAST_ELEMENTS);
219
+ Handle<Map> NewMap(
220
+ InstanceType type,
221
+ int instance_size,
222
+ ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND);
222
223
 
223
224
  Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
224
225
 
@@ -269,13 +270,14 @@ class Factory {
269
270
  Handle<JSModule> NewJSModule();
270
271
 
271
272
  // JS arrays are pretenured when allocated by the parser.
272
- Handle<JSArray> NewJSArray(int capacity,
273
- ElementsKind elements_kind = FAST_ELEMENTS,
274
- PretenureFlag pretenure = NOT_TENURED);
273
+ Handle<JSArray> NewJSArray(
274
+ int capacity,
275
+ ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
276
+ PretenureFlag pretenure = NOT_TENURED);
275
277
 
276
278
  Handle<JSArray> NewJSArrayWithElements(
277
279
  Handle<FixedArrayBase> elements,
278
- ElementsKind elements_kind = FAST_ELEMENTS,
280
+ ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
279
281
  PretenureFlag pretenure = NOT_TENURED);
280
282
 
281
283
  void SetElementsCapacityAndLength(Handle<JSArray> array,
@@ -287,6 +289,7 @@ class Factory {
287
289
  void EnsureCanContainHeapObjectElements(Handle<JSArray> array);
288
290
  void EnsureCanContainElements(Handle<JSArray> array,
289
291
  Handle<FixedArrayBase> elements,
292
+ uint32_t length,
290
293
  EnsureElementsMode mode);
291
294
 
292
295
  Handle<JSProxy> NewJSProxy(Handle<Object> handler, Handle<Object> prototype);
@@ -335,6 +338,7 @@ class Factory {
335
338
 
336
339
  Handle<Object> NewError(const char* maker, const char* type,
337
340
  Handle<JSArray> args);
341
+ Handle<String> EmergencyNewError(const char* type, Handle<JSArray> args);
338
342
  Handle<Object> NewError(const char* maker, const char* type,
339
343
  Vector< Handle<Object> > args);
340
344
  Handle<Object> NewError(const char* type,
@@ -150,6 +150,7 @@ DEFINE_implication(harmony, harmony_collections)
150
150
  DEFINE_implication(harmony_modules, harmony_scoping)
151
151
 
152
152
  // Flags for experimental implementation features.
153
+ DEFINE_bool(packed_arrays, false, "optimizes arrays that have no holes")
153
154
  DEFINE_bool(smi_only_arrays, true, "tracks arrays with only smi values")
154
155
  DEFINE_bool(clever_optimizations,
155
156
  true,
@@ -197,6 +198,8 @@ DEFINE_bool(polymorphic_inlining, true, "polymorphic inlining")
197
198
  DEFINE_bool(use_osr, true, "use on-stack replacement")
198
199
  DEFINE_bool(array_bounds_checks_elimination, true,
199
200
  "perform array bounds checks elimination")
201
+ DEFINE_bool(array_index_dehoisting, false,
202
+ "perform array index dehoisting")
200
203
 
201
204
  DEFINE_bool(trace_osr, false, "trace on-stack replacement")
202
205
  DEFINE_int(stress_runs, 0, "number of stress runs")
@@ -211,6 +211,9 @@ class StackFrame BASE_EMBEDDED {
211
211
 
212
212
  virtual void SetCallerFp(Address caller_fp) = 0;
213
213
 
214
+ // Manually changes value of fp in this object.
215
+ void UpdateFp(Address fp) { state_.fp = fp; }
216
+
214
217
  Address* pc_address() const { return state_.pc_address; }
215
218
 
216
219
  // Get the id of this stack frame.
@@ -314,7 +314,8 @@ bool FullCodeGenerator::MakeCode(CompilationInfo* info) {
314
314
  Code::Flags flags = Code::ComputeFlags(Code::FUNCTION);
315
315
  Handle<Code> code = CodeGenerator::MakeCodeEpilogue(&masm, flags, info);
316
316
  code->set_optimizable(info->IsOptimizable() &&
317
- !info->function()->flags()->Contains(kDontOptimize));
317
+ !info->function()->flags()->Contains(kDontOptimize) &&
318
+ info->function()->scope()->AllowsLazyRecompilation());
318
319
  cgen.PopulateDeoptimizationData(code);
319
320
  cgen.PopulateTypeFeedbackInfo(code);
320
321
  cgen.PopulateTypeFeedbackCells(code);
@@ -88,6 +88,8 @@ class FuncNameInferrer : public ZoneObject {
88
88
  void Leave() {
89
89
  ASSERT(IsOpen());
90
90
  names_stack_.Rewind(entries_stack_.RemoveLast());
91
+ if (entries_stack_.is_empty())
92
+ funcs_to_infer_.Clear();
91
93
  }
92
94
 
93
95
  private:
@@ -345,6 +345,9 @@ F FUNCTION_CAST(Address addr) {
345
345
  #define INLINE(header) inline __attribute__((always_inline)) header
346
346
  #define NO_INLINE(header) __attribute__((noinline)) header
347
347
  #endif
348
+ #elif defined(_MSC_VER) && !defined(DEBUG)
349
+ #define INLINE(header) __forceinline header
350
+ #define NO_INLINE(header) header
348
351
  #else
349
352
  #define INLINE(header) inline header
350
353
  #define NO_INLINE(header) header
@@ -595,12 +595,24 @@ void ExternalStringTable::Iterate(ObjectVisitor* v) {
595
595
  void ExternalStringTable::Verify() {
596
596
  #ifdef DEBUG
597
597
  for (int i = 0; i < new_space_strings_.length(); ++i) {
598
- ASSERT(heap_->InNewSpace(new_space_strings_[i]));
599
- ASSERT(new_space_strings_[i] != HEAP->raw_unchecked_the_hole_value());
598
+ Object* obj = Object::cast(new_space_strings_[i]);
599
+ // TODO(yangguo): check that the object is indeed an external string.
600
+ ASSERT(heap_->InNewSpace(obj));
601
+ ASSERT(obj != HEAP->raw_unchecked_the_hole_value());
602
+ if (obj->IsExternalAsciiString()) {
603
+ ExternalAsciiString* string = ExternalAsciiString::cast(obj);
604
+ ASSERT(String::IsAscii(string->GetChars(), string->length()));
605
+ }
600
606
  }
601
607
  for (int i = 0; i < old_space_strings_.length(); ++i) {
602
- ASSERT(!heap_->InNewSpace(old_space_strings_[i]));
603
- ASSERT(old_space_strings_[i] != HEAP->raw_unchecked_the_hole_value());
608
+ Object* obj = Object::cast(old_space_strings_[i]);
609
+ // TODO(yangguo): check that the object is indeed an external string.
610
+ ASSERT(!heap_->InNewSpace(obj));
611
+ ASSERT(obj != HEAP->raw_unchecked_the_hole_value());
612
+ if (obj->IsExternalAsciiString()) {
613
+ ExternalAsciiString* string = ExternalAsciiString::cast(obj);
614
+ ASSERT(String::IsAscii(string->GetChars(), string->length()));
615
+ }
604
616
  }
605
617
  #endif
606
618
  }
@@ -171,6 +171,9 @@ Heap::Heap()
171
171
  global_contexts_list_ = NULL;
172
172
  mark_compact_collector_.heap_ = this;
173
173
  external_string_table_.heap_ = this;
174
+ // Put a dummy entry in the remembered pages so we can find the list the
175
+ // minidump even if there are no real unmapped pages.
176
+ RememberUnmappedPage(NULL, false);
174
177
  }
175
178
 
176
179
 
@@ -805,7 +808,7 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,
805
808
 
806
809
  UpdateSurvivalRateTrend(start_new_space_size);
807
810
 
808
- size_of_old_gen_at_last_old_space_gc_ = PromotedSpaceSize();
811
+ size_of_old_gen_at_last_old_space_gc_ = PromotedSpaceSizeOfObjects();
809
812
 
810
813
  if (high_survival_rate_during_scavenges &&
811
814
  IsStableOrIncreasingSurvivalTrend()) {
@@ -2020,7 +2023,7 @@ MaybeObject* Heap::AllocateMap(InstanceType instance_type,
2020
2023
  map->set_pre_allocated_property_fields(0);
2021
2024
  map->init_instance_descriptors();
2022
2025
  map->set_code_cache(empty_fixed_array(), SKIP_WRITE_BARRIER);
2023
- map->set_prototype_transitions(empty_fixed_array(), SKIP_WRITE_BARRIER);
2026
+ map->init_prototype_transitions(undefined_value());
2024
2027
  map->set_unused_property_fields(0);
2025
2028
  map->set_bit_field(0);
2026
2029
  map->set_bit_field2(1 << Map::kIsExtensible);
@@ -2159,15 +2162,15 @@ bool Heap::CreateInitialMaps() {
2159
2162
  // Fix the instance_descriptors for the existing maps.
2160
2163
  meta_map()->init_instance_descriptors();
2161
2164
  meta_map()->set_code_cache(empty_fixed_array());
2162
- meta_map()->set_prototype_transitions(empty_fixed_array());
2165
+ meta_map()->init_prototype_transitions(undefined_value());
2163
2166
 
2164
2167
  fixed_array_map()->init_instance_descriptors();
2165
2168
  fixed_array_map()->set_code_cache(empty_fixed_array());
2166
- fixed_array_map()->set_prototype_transitions(empty_fixed_array());
2169
+ fixed_array_map()->init_prototype_transitions(undefined_value());
2167
2170
 
2168
2171
  oddball_map()->init_instance_descriptors();
2169
2172
  oddball_map()->set_code_cache(empty_fixed_array());
2170
- oddball_map()->set_prototype_transitions(empty_fixed_array());
2173
+ oddball_map()->init_prototype_transitions(undefined_value());
2171
2174
 
2172
2175
  // Fix prototype object for existing maps.
2173
2176
  meta_map()->set_prototype(null_value());
@@ -2466,7 +2469,7 @@ bool Heap::CreateApiObjects() {
2466
2469
  // bottleneck to trap the Smi-only -> fast elements transition, and there
2467
2470
  // appears to be no benefit for optimize this case.
2468
2471
  Map* new_neander_map = Map::cast(obj);
2469
- new_neander_map->set_elements_kind(FAST_ELEMENTS);
2472
+ new_neander_map->set_elements_kind(TERMINAL_FAST_ELEMENTS_KIND);
2470
2473
  set_neander_map(new_neander_map);
2471
2474
 
2472
2475
  { MaybeObject* maybe_obj = AllocateJSObjectFromMap(neander_map());
@@ -3047,6 +3050,7 @@ MaybeObject* Heap::AllocateJSMessageObject(String* type,
3047
3050
  }
3048
3051
  JSMessageObject* message = JSMessageObject::cast(result);
3049
3052
  message->set_properties(Heap::empty_fixed_array(), SKIP_WRITE_BARRIER);
3053
+ message->initialize_elements();
3050
3054
  message->set_elements(Heap::empty_fixed_array(), SKIP_WRITE_BARRIER);
3051
3055
  message->set_type(type);
3052
3056
  message->set_arguments(arguments);
@@ -3323,6 +3327,8 @@ MaybeObject* Heap::AllocateExternalStringFromAscii(
3323
3327
  return Failure::OutOfMemoryException();
3324
3328
  }
3325
3329
 
3330
+ ASSERT(String::IsAscii(resource->data(), static_cast<int>(length)));
3331
+
3326
3332
  Map* map = external_ascii_string_map();
3327
3333
  Object* result;
3328
3334
  { MaybeObject* maybe_result = Allocate(map, NEW_SPACE);
@@ -3748,7 +3754,7 @@ MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) {
3748
3754
 
3749
3755
  // Check the state of the object
3750
3756
  ASSERT(JSObject::cast(result)->HasFastProperties());
3751
- ASSERT(JSObject::cast(result)->HasFastElements());
3757
+ ASSERT(JSObject::cast(result)->HasFastObjectElements());
3752
3758
 
3753
3759
  return result;
3754
3760
  }
@@ -3793,7 +3799,7 @@ MaybeObject* Heap::AllocateInitialMap(JSFunction* fun) {
3793
3799
  map->set_inobject_properties(in_object_properties);
3794
3800
  map->set_unused_property_fields(in_object_properties);
3795
3801
  map->set_prototype(prototype);
3796
- ASSERT(map->has_fast_elements());
3802
+ ASSERT(map->has_fast_object_elements());
3797
3803
 
3798
3804
  // If the function has only simple this property assignments add
3799
3805
  // field descriptors for these to the initial map as the object
@@ -3910,8 +3916,7 @@ MaybeObject* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) {
3910
3916
  InitializeJSObjectFromMap(JSObject::cast(obj),
3911
3917
  FixedArray::cast(properties),
3912
3918
  map);
3913
- ASSERT(JSObject::cast(obj)->HasFastSmiOnlyElements() ||
3914
- JSObject::cast(obj)->HasFastElements());
3919
+ ASSERT(JSObject::cast(obj)->HasFastSmiOrObjectElements());
3915
3920
  return obj;
3916
3921
  }
3917
3922
 
@@ -3956,6 +3961,9 @@ MaybeObject* Heap::AllocateJSArrayAndStorage(
3956
3961
  ArrayStorageAllocationMode mode,
3957
3962
  PretenureFlag pretenure) {
3958
3963
  ASSERT(capacity >= length);
3964
+ if (length != 0 && mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE) {
3965
+ elements_kind = GetHoleyElementsKind(elements_kind);
3966
+ }
3959
3967
  MaybeObject* maybe_array = AllocateJSArray(elements_kind, pretenure);
3960
3968
  JSArray* array;
3961
3969
  if (!maybe_array->To(&array)) return maybe_array;
@@ -3976,8 +3984,7 @@ MaybeObject* Heap::AllocateJSArrayAndStorage(
3976
3984
  maybe_elms = AllocateFixedDoubleArrayWithHoles(capacity);
3977
3985
  }
3978
3986
  } else {
3979
- ASSERT(elements_kind == FAST_ELEMENTS ||
3980
- elements_kind == FAST_SMI_ONLY_ELEMENTS);
3987
+ ASSERT(IsFastSmiOrObjectElementsKind(elements_kind));
3981
3988
  if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) {
3982
3989
  maybe_elms = AllocateUninitializedFixedArray(capacity);
3983
3990
  } else {
@@ -4003,6 +4010,7 @@ MaybeObject* Heap::AllocateJSArrayWithElements(
4003
4010
 
4004
4011
  array->set_elements(elements);
4005
4012
  array->set_length(Smi::FromInt(elements->length()));
4013
+ array->ValidateElements();
4006
4014
  return array;
4007
4015
  }
4008
4016
 
@@ -4487,6 +4495,16 @@ MaybeObject* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) {
4487
4495
  String::cast(result)->set_length(length);
4488
4496
  String::cast(result)->set_hash_field(String::kEmptyHashField);
4489
4497
  ASSERT_EQ(size, HeapObject::cast(result)->Size());
4498
+
4499
+ #ifdef DEBUG
4500
+ if (FLAG_verify_heap) {
4501
+ // Initialize string's content to ensure ASCII-ness (character range 0-127)
4502
+ // as required when verifying the heap.
4503
+ char* dest = SeqAsciiString::cast(result)->GetChars();
4504
+ memset(dest, 0x0F, length * kCharSize);
4505
+ }
4506
+ #endif // DEBUG
4507
+
4490
4508
  return result;
4491
4509
  }
4492
4510
 
@@ -4533,13 +4551,13 @@ MaybeObject* Heap::AllocateJSArray(
4533
4551
  Context* global_context = isolate()->context()->global_context();
4534
4552
  JSFunction* array_function = global_context->array_function();
4535
4553
  Map* map = array_function->initial_map();
4536
- if (elements_kind == FAST_DOUBLE_ELEMENTS) {
4537
- map = Map::cast(global_context->double_js_array_map());
4538
- } else if (elements_kind == FAST_ELEMENTS || !FLAG_smi_only_arrays) {
4539
- map = Map::cast(global_context->object_js_array_map());
4540
- } else {
4541
- ASSERT(elements_kind == FAST_SMI_ONLY_ELEMENTS);
4542
- ASSERT(map == global_context->smi_js_array_map());
4554
+ Object* maybe_map_array = global_context->js_array_maps();
4555
+ if (!maybe_map_array->IsUndefined()) {
4556
+ Object* maybe_transitioned_map =
4557
+ FixedArray::cast(maybe_map_array)->get(elements_kind);
4558
+ if (!maybe_transitioned_map->IsUndefined()) {
4559
+ map = Map::cast(maybe_transitioned_map);
4560
+ }
4543
4561
  }
4544
4562
 
4545
4563
  return AllocateJSObjectFromMap(map, pretenure);
@@ -4824,9 +4842,7 @@ MaybeObject* Heap::AllocateGlobalContext() {
4824
4842
  }
4825
4843
  Context* context = reinterpret_cast<Context*>(result);
4826
4844
  context->set_map_no_write_barrier(global_context_map());
4827
- context->set_smi_js_array_map(undefined_value());
4828
- context->set_double_js_array_map(undefined_value());
4829
- context->set_object_js_array_map(undefined_value());
4845
+ context->set_js_array_maps(undefined_value());
4830
4846
  ASSERT(context->IsGlobalContext());
4831
4847
  ASSERT(result->IsContext());
4832
4848
  return result;
@@ -5810,16 +5826,6 @@ void Heap::RecordStats(HeapStats* stats, bool take_snapshot) {
5810
5826
  }
5811
5827
 
5812
5828
 
5813
- intptr_t Heap::PromotedSpaceSize() {
5814
- return old_pointer_space_->Size()
5815
- + old_data_space_->Size()
5816
- + code_space_->Size()
5817
- + map_space_->Size()
5818
- + cell_space_->Size()
5819
- + lo_space_->Size();
5820
- }
5821
-
5822
-
5823
5829
  intptr_t Heap::PromotedSpaceSizeOfObjects() {
5824
5830
  return old_pointer_space_->SizeOfObjects()
5825
5831
  + old_data_space_->SizeOfObjects()