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
@@ -1,4 +1,4 @@
1
- // Copyright 2008-2009 the V8 project authors. All rights reserved.
1
+ // Copyright 2012 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -111,7 +111,7 @@ class RegExpMacroAssemblerIA32: public NativeRegExpMacroAssembler {
111
111
  virtual void ReadStackPointerFromRegister(int reg);
112
112
  virtual void SetCurrentPositionFromEnd(int by);
113
113
  virtual void SetRegister(int register_index, int to);
114
- virtual void Succeed();
114
+ virtual bool Succeed();
115
115
  virtual void WriteCurrentPositionToRegister(int reg, int cp_offset);
116
116
  virtual void ClearRegisters(int reg_from, int reg_to);
117
117
  virtual void WriteStackPointerToRegister(int reg);
@@ -135,7 +135,11 @@ class RegExpMacroAssemblerIA32: public NativeRegExpMacroAssembler {
135
135
  static const int kInputStart = kStartIndex + kPointerSize;
136
136
  static const int kInputEnd = kInputStart + kPointerSize;
137
137
  static const int kRegisterOutput = kInputEnd + kPointerSize;
138
- static const int kStackHighEnd = kRegisterOutput + kPointerSize;
138
+ // For the case of global regular expression, we have room to store at least
139
+ // one set of capture results. For the case of non-global regexp, we ignore
140
+ // this value.
141
+ static const int kNumOutputRegisters = kRegisterOutput + kPointerSize;
142
+ static const int kStackHighEnd = kNumOutputRegisters + kPointerSize;
139
143
  static const int kDirectCall = kStackHighEnd + kPointerSize;
140
144
  static const int kIsolate = kDirectCall + kPointerSize;
141
145
  // Below the frame pointer - local stack variables.
@@ -144,7 +148,8 @@ class RegExpMacroAssemblerIA32: public NativeRegExpMacroAssembler {
144
148
  static const int kBackup_esi = kFramePointer - kPointerSize;
145
149
  static const int kBackup_edi = kBackup_esi - kPointerSize;
146
150
  static const int kBackup_ebx = kBackup_edi - kPointerSize;
147
- static const int kInputStartMinusOne = kBackup_ebx - kPointerSize;
151
+ static const int kSuccessfulCaptures = kBackup_ebx - kPointerSize;
152
+ static const int kInputStartMinusOne = kSuccessfulCaptures - kPointerSize;
148
153
  // First register address. Following registers are below it on the stack.
149
154
  static const int kRegisterZero = kInputStartMinusOne - kPointerSize;
150
155
 
@@ -1,4 +1,4 @@
1
- // Copyright 2008 the V8 project authors. All rights reserved.
1
+ // Copyright 2012 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -40,12 +40,12 @@ namespace internal {
40
40
 
41
41
 
42
42
  typedef int (*regexp_matcher)(String*, int, const byte*,
43
- const byte*, int*, Address, int, Isolate*);
43
+ const byte*, int*, int, Address, int, Isolate*);
44
44
 
45
45
  // Call the generated regexp code directly. The code at the entry address should
46
46
  // expect eight int/pointer sized arguments and return an int.
47
- #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6, p7) \
48
- (FUNCTION_CAST<regexp_matcher>(entry)(p0, p1, p2, p3, p4, p5, p6, p7))
47
+ #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6, p7, p8) \
48
+ (FUNCTION_CAST<regexp_matcher>(entry)(p0, p1, p2, p3, p4, p5, p6, p7, p8))
49
49
 
50
50
 
51
51
  #define TRY_CATCH_FROM_ADDRESS(try_catch_address) \
@@ -782,10 +782,19 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
782
782
  }
783
783
 
784
784
  if (!transition.is_null()) {
785
- // Update the map of the object; no write barrier updating is
786
- // needed because the map is never in new space.
787
- __ mov(FieldOperand(receiver_reg, HeapObject::kMapOffset),
788
- Immediate(transition));
785
+ // Update the map of the object.
786
+ __ mov(scratch, Immediate(transition));
787
+ __ mov(FieldOperand(receiver_reg, HeapObject::kMapOffset), scratch);
788
+
789
+ // Update the write barrier for the map field and pass the now unused
790
+ // name_reg as scratch register.
791
+ __ RecordWriteField(receiver_reg,
792
+ HeapObject::kMapOffset,
793
+ scratch,
794
+ name_reg,
795
+ kDontSaveFPRegs,
796
+ OMIT_REMEMBERED_SET,
797
+ OMIT_SMI_CHECK);
789
798
  }
790
799
 
791
800
  // Adjust for the number of properties stored in the object. Even in the
@@ -1129,13 +1138,20 @@ void StubCompiler::GenerateLoadInterceptor(Handle<JSObject> object,
1129
1138
  name, miss);
1130
1139
  ASSERT(holder_reg.is(receiver) || holder_reg.is(scratch1));
1131
1140
 
1141
+ // Preserve the receiver register explicitly whenever it is different from
1142
+ // the holder and it is needed should the interceptor return without any
1143
+ // result. The CALLBACKS case needs the receiver to be passed into C++ code,
1144
+ // the FIELD case might cause a miss during the prototype check.
1145
+ bool must_perfrom_prototype_check = *interceptor_holder != lookup->holder();
1146
+ bool must_preserve_receiver_reg = !receiver.is(holder_reg) &&
1147
+ (lookup->type() == CALLBACKS || must_perfrom_prototype_check);
1148
+
1132
1149
  // Save necessary data before invoking an interceptor.
1133
1150
  // Requires a frame to make GC aware of pushed pointers.
1134
1151
  {
1135
1152
  FrameScope frame_scope(masm(), StackFrame::INTERNAL);
1136
1153
 
1137
- if (lookup->type() == CALLBACKS && !receiver.is(holder_reg)) {
1138
- // CALLBACKS case needs a receiver to be passed into C++ callback.
1154
+ if (must_preserve_receiver_reg) {
1139
1155
  __ push(receiver);
1140
1156
  }
1141
1157
  __ push(holder_reg);
@@ -1158,10 +1174,17 @@ void StubCompiler::GenerateLoadInterceptor(Handle<JSObject> object,
1158
1174
  frame_scope.GenerateLeaveFrame();
1159
1175
  __ ret(0);
1160
1176
 
1177
+ // Clobber registers when generating debug-code to provoke errors.
1161
1178
  __ bind(&interceptor_failed);
1179
+ if (FLAG_debug_code) {
1180
+ __ mov(receiver, Immediate(BitCast<int32_t>(kZapValue)));
1181
+ __ mov(holder_reg, Immediate(BitCast<int32_t>(kZapValue)));
1182
+ __ mov(name_reg, Immediate(BitCast<int32_t>(kZapValue)));
1183
+ }
1184
+
1162
1185
  __ pop(name_reg);
1163
1186
  __ pop(holder_reg);
1164
- if (lookup->type() == CALLBACKS && !receiver.is(holder_reg)) {
1187
+ if (must_preserve_receiver_reg) {
1165
1188
  __ pop(receiver);
1166
1189
  }
1167
1190
 
@@ -1170,7 +1193,7 @@ void StubCompiler::GenerateLoadInterceptor(Handle<JSObject> object,
1170
1193
 
1171
1194
  // Check that the maps from interceptor's holder to lookup's holder
1172
1195
  // haven't changed. And load lookup's holder into holder_reg.
1173
- if (*interceptor_holder != lookup->holder()) {
1196
+ if (must_perfrom_prototype_check) {
1174
1197
  holder_reg = CheckPrototypes(interceptor_holder,
1175
1198
  holder_reg,
1176
1199
  Handle<JSObject>(lookup->holder()),
@@ -1448,16 +1471,31 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1448
1471
  __ jmp(&fast_object);
1449
1472
  // In case of fast smi-only, convert to fast object, otherwise bail out.
1450
1473
  __ bind(&not_fast_object);
1451
- __ CheckFastSmiOnlyElements(ebx, &call_builtin);
1474
+ __ CheckFastSmiElements(ebx, &call_builtin);
1452
1475
  // edi: elements array
1453
1476
  // edx: receiver
1454
1477
  // ebx: map
1455
- __ LoadTransitionedArrayMapConditional(FAST_SMI_ONLY_ELEMENTS,
1478
+ Label try_holey_map;
1479
+ __ LoadTransitionedArrayMapConditional(FAST_SMI_ELEMENTS,
1456
1480
  FAST_ELEMENTS,
1457
1481
  ebx,
1458
1482
  edi,
1483
+ &try_holey_map);
1484
+
1485
+ ElementsTransitionGenerator::
1486
+ GenerateMapChangeElementsTransition(masm());
1487
+ // Restore edi.
1488
+ __ mov(edi, FieldOperand(edx, JSArray::kElementsOffset));
1489
+ __ jmp(&fast_object);
1490
+
1491
+ __ bind(&try_holey_map);
1492
+ __ LoadTransitionedArrayMapConditional(FAST_HOLEY_SMI_ELEMENTS,
1493
+ FAST_HOLEY_ELEMENTS,
1494
+ ebx,
1495
+ edi,
1459
1496
  &call_builtin);
1460
- ElementsTransitionGenerator::GenerateSmiOnlyToObject(masm());
1497
+ ElementsTransitionGenerator::
1498
+ GenerateMapChangeElementsTransition(masm());
1461
1499
  // Restore edi.
1462
1500
  __ mov(edi, FieldOperand(edx, JSArray::kElementsOffset));
1463
1501
  __ bind(&fast_object);
@@ -3804,7 +3842,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(
3804
3842
  // Check that the key is a smi or a heap number convertible to a smi.
3805
3843
  GenerateSmiKeyCheck(masm, ecx, ebx, xmm0, xmm1, &miss_force_generic);
3806
3844
 
3807
- if (elements_kind == FAST_SMI_ONLY_ELEMENTS) {
3845
+ if (IsFastSmiElementsKind(elements_kind)) {
3808
3846
  __ JumpIfNotSmi(eax, &transition_elements_kind);
3809
3847
  }
3810
3848
 
@@ -3829,7 +3867,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(
3829
3867
  __ j(not_equal, &miss_force_generic);
3830
3868
 
3831
3869
  __ bind(&finish_store);
3832
- if (elements_kind == FAST_SMI_ONLY_ELEMENTS) {
3870
+ if (IsFastSmiElementsKind(elements_kind)) {
3833
3871
  // ecx is a smi, use times_half_pointer_size instead of
3834
3872
  // times_pointer_size
3835
3873
  __ mov(FieldOperand(edi,
@@ -3837,7 +3875,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(
3837
3875
  times_half_pointer_size,
3838
3876
  FixedArray::kHeaderSize), eax);
3839
3877
  } else {
3840
- ASSERT(elements_kind == FAST_ELEMENTS);
3878
+ ASSERT(IsFastObjectElementsKind(elements_kind));
3841
3879
  // Do the store and update the write barrier.
3842
3880
  // ecx is a smi, use times_half_pointer_size instead of
3843
3881
  // times_pointer_size
@@ -352,9 +352,9 @@ void IC::Clear(Address address) {
352
352
  return KeyedStoreIC::Clear(address, target);
353
353
  case Code::CALL_IC: return CallIC::Clear(address, target);
354
354
  case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target);
355
+ case Code::COMPARE_IC: return CompareIC::Clear(address, target);
355
356
  case Code::UNARY_OP_IC:
356
357
  case Code::BINARY_OP_IC:
357
- case Code::COMPARE_IC:
358
358
  case Code::TO_BOOLEAN_IC:
359
359
  // Clearing these is tricky and does not
360
360
  // make any performance difference.
@@ -365,9 +365,8 @@ void IC::Clear(Address address) {
365
365
 
366
366
 
367
367
  void CallICBase::Clear(Address address, Code* target) {
368
+ if (target->ic_state() == UNINITIALIZED) return;
368
369
  bool contextual = CallICBase::Contextual::decode(target->extra_ic_state());
369
- State state = target->ic_state();
370
- if (state == UNINITIALIZED) return;
371
370
  Code* code =
372
371
  Isolate::Current()->stub_cache()->FindCallInitialize(
373
372
  target->arguments_count(),
@@ -410,6 +409,17 @@ void KeyedStoreIC::Clear(Address address, Code* target) {
410
409
  }
411
410
 
412
411
 
412
+ void CompareIC::Clear(Address address, Code* target) {
413
+ // Only clear ICCompareStubs, we currently cannot clear generic CompareStubs.
414
+ if (target->major_key() != CodeStub::CompareIC) return;
415
+ // Only clear CompareICs that can retain objects.
416
+ if (target->compare_state() != KNOWN_OBJECTS) return;
417
+ Token::Value op = CompareIC::ComputeOperation(target);
418
+ SetTargetAtAddress(address, GetRawUninitialized(op));
419
+ PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK);
420
+ }
421
+
422
+
413
423
  static bool HasInterceptorGetter(JSObject* object) {
414
424
  return !object->GetNamedInterceptor()->getter()->IsUndefined();
415
425
  }
@@ -1634,8 +1644,7 @@ Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck(
1634
1644
  return string_stub();
1635
1645
  } else {
1636
1646
  ASSERT(receiver_map->has_dictionary_elements() ||
1637
- receiver_map->has_fast_elements() ||
1638
- receiver_map->has_fast_smi_only_elements() ||
1647
+ receiver_map->has_fast_smi_or_object_elements() ||
1639
1648
  receiver_map->has_fast_double_elements() ||
1640
1649
  receiver_map->has_external_array_elements());
1641
1650
  bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
@@ -1650,8 +1659,7 @@ Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver,
1650
1659
  StubKind stub_kind,
1651
1660
  StrictModeFlag strict_mode,
1652
1661
  Handle<Code> generic_stub) {
1653
- if (receiver->HasFastElements() ||
1654
- receiver->HasFastSmiOnlyElements() ||
1662
+ if (receiver->HasFastSmiOrObjectElements() ||
1655
1663
  receiver->HasExternalArrayElements() ||
1656
1664
  receiver->HasFastDoubleElements() ||
1657
1665
  receiver->HasDictionaryElements()) {
@@ -1671,15 +1679,26 @@ Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver,
1671
1679
  case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT:
1672
1680
  case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT:
1673
1681
  return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS);
1674
- break;
1675
1682
  case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE:
1676
1683
  case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE:
1677
1684
  return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS);
1678
- break;
1679
- default:
1685
+ case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_OBJECT:
1686
+ case KeyedIC::STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT:
1687
+ case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT:
1688
+ case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT:
1689
+ return JSObject::GetElementsTransitionMap(receiver,
1690
+ FAST_HOLEY_ELEMENTS);
1691
+ case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE:
1692
+ case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE:
1693
+ return JSObject::GetElementsTransitionMap(receiver,
1694
+ FAST_HOLEY_DOUBLE_ELEMENTS);
1695
+ case KeyedIC::LOAD:
1696
+ case KeyedIC::STORE_NO_TRANSITION:
1697
+ case KeyedIC::STORE_AND_GROW_NO_TRANSITION:
1680
1698
  UNREACHABLE();
1681
- return Handle<Map>::null();
1699
+ break;
1682
1700
  }
1701
+ return Handle<Map>::null();
1683
1702
  }
1684
1703
 
1685
1704
 
@@ -1739,30 +1758,54 @@ KeyedIC::StubKind KeyedStoreIC::GetStubKind(Handle<JSObject> receiver,
1739
1758
 
1740
1759
  if (allow_growth) {
1741
1760
  // Handle growing array in stub if necessary.
1742
- if (receiver->HasFastSmiOnlyElements()) {
1761
+ if (receiver->HasFastSmiElements()) {
1743
1762
  if (value->IsHeapNumber()) {
1744
- return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE;
1763
+ if (receiver->HasFastHoleyElements()) {
1764
+ return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE;
1765
+ } else {
1766
+ return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE;
1767
+ }
1745
1768
  }
1746
1769
  if (value->IsHeapObject()) {
1747
- return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT;
1770
+ if (receiver->HasFastHoleyElements()) {
1771
+ return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT;
1772
+ } else {
1773
+ return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT;
1774
+ }
1748
1775
  }
1749
1776
  } else if (receiver->HasFastDoubleElements()) {
1750
1777
  if (!value->IsSmi() && !value->IsHeapNumber()) {
1751
- return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT;
1778
+ if (receiver->HasFastHoleyElements()) {
1779
+ return STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT;
1780
+ } else {
1781
+ return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT;
1782
+ }
1752
1783
  }
1753
1784
  }
1754
1785
  return STORE_AND_GROW_NO_TRANSITION;
1755
1786
  } else {
1756
1787
  // Handle only in-bounds elements accesses.
1757
- if (receiver->HasFastSmiOnlyElements()) {
1788
+ if (receiver->HasFastSmiElements()) {
1758
1789
  if (value->IsHeapNumber()) {
1759
- return STORE_TRANSITION_SMI_TO_DOUBLE;
1790
+ if (receiver->HasFastHoleyElements()) {
1791
+ return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE;
1792
+ } else {
1793
+ return STORE_TRANSITION_SMI_TO_DOUBLE;
1794
+ }
1760
1795
  } else if (value->IsHeapObject()) {
1761
- return STORE_TRANSITION_SMI_TO_OBJECT;
1796
+ if (receiver->HasFastHoleyElements()) {
1797
+ return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT;
1798
+ } else {
1799
+ return STORE_TRANSITION_SMI_TO_OBJECT;
1800
+ }
1762
1801
  }
1763
1802
  } else if (receiver->HasFastDoubleElements()) {
1764
1803
  if (!value->IsSmi() && !value->IsHeapNumber()) {
1765
- return STORE_TRANSITION_DOUBLE_TO_OBJECT;
1804
+ if (receiver->HasFastHoleyElements()) {
1805
+ return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT;
1806
+ } else {
1807
+ return STORE_TRANSITION_DOUBLE_TO_OBJECT;
1808
+ }
1766
1809
  }
1767
1810
  }
1768
1811
  return STORE_NO_TRANSITION;
@@ -2396,7 +2439,7 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) {
2396
2439
 
2397
2440
  // Activate inlined smi code.
2398
2441
  if (previous_type == BinaryOpIC::UNINITIALIZED) {
2399
- PatchInlinedSmiCode(ic.address());
2442
+ PatchInlinedSmiCode(ic.address(), ENABLE_INLINED_SMI_CHECK);
2400
2443
  }
2401
2444
  }
2402
2445
 
@@ -2457,6 +2500,14 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) {
2457
2500
  }
2458
2501
 
2459
2502
 
2503
+ Code* CompareIC::GetRawUninitialized(Token::Value op) {
2504
+ ICCompareStub stub(op, UNINITIALIZED);
2505
+ Code* code = NULL;
2506
+ CHECK(stub.FindCodeInCache(&code));
2507
+ return code;
2508
+ }
2509
+
2510
+
2460
2511
  Handle<Code> CompareIC::GetUninitialized(Token::Value op) {
2461
2512
  ICCompareStub stub(op, UNINITIALIZED);
2462
2513
  return stub.GetCode();
@@ -2471,6 +2522,12 @@ CompareIC::State CompareIC::ComputeState(Code* target) {
2471
2522
  }
2472
2523
 
2473
2524
 
2525
+ Token::Value CompareIC::ComputeOperation(Code* target) {
2526
+ ASSERT(target->major_key() == CodeStub::CompareIC);
2527
+ return static_cast<Token::Value>(target->compare_operation());
2528
+ }
2529
+
2530
+
2474
2531
  const char* CompareIC::GetStateName(State state) {
2475
2532
  switch (state) {
2476
2533
  case UNINITIALIZED: return "UNINITIALIZED";
@@ -378,10 +378,16 @@ class KeyedIC: public IC {
378
378
  STORE_TRANSITION_SMI_TO_OBJECT,
379
379
  STORE_TRANSITION_SMI_TO_DOUBLE,
380
380
  STORE_TRANSITION_DOUBLE_TO_OBJECT,
381
+ STORE_TRANSITION_HOLEY_SMI_TO_OBJECT,
382
+ STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE,
383
+ STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT,
381
384
  STORE_AND_GROW_NO_TRANSITION,
382
385
  STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT,
383
386
  STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE,
384
- STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT
387
+ STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT,
388
+ STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT,
389
+ STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE,
390
+ STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT
385
391
  };
386
392
 
387
393
  static const int kGrowICDelta = STORE_AND_GROW_NO_TRANSITION -
@@ -794,6 +800,9 @@ class CompareIC: public IC {
794
800
  // Helper function for determining the state of a compare IC.
795
801
  static State ComputeState(Code* target);
796
802
 
803
+ // Helper function for determining the operation a compare IC is for.
804
+ static Token::Value ComputeOperation(Code* target);
805
+
797
806
  static const char* GetStateName(State state);
798
807
 
799
808
  private:
@@ -804,7 +813,13 @@ class CompareIC: public IC {
804
813
  Condition GetCondition() const { return ComputeCondition(op_); }
805
814
  State GetState() { return ComputeState(target()); }
806
815
 
816
+ static Code* GetRawUninitialized(Token::Value op);
817
+
818
+ static void Clear(Address address, Code* target);
819
+
807
820
  Token::Value op_;
821
+
822
+ friend class IC;
808
823
  };
809
824
 
810
825
 
@@ -817,7 +832,8 @@ class ToBooleanIC: public IC {
817
832
 
818
833
 
819
834
  // Helper for BinaryOpIC and CompareIC.
820
- void PatchInlinedSmiCode(Address address);
835
+ enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK };
836
+ void PatchInlinedSmiCode(Address address, InlinedSmiCheck check);
821
837
 
822
838
  } } // namespace v8::internal
823
839
 
@@ -1,4 +1,4 @@
1
- // Copyright 2011 the V8 project authors. All rights reserved.
1
+ // Copyright 2012 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -100,7 +100,7 @@ void IncrementalMarking::BlackToGreyAndUnshift(HeapObject* obj,
100
100
  int64_t old_bytes_rescanned = bytes_rescanned_;
101
101
  bytes_rescanned_ = old_bytes_rescanned + obj_size;
102
102
  if ((bytes_rescanned_ >> 20) != (old_bytes_rescanned >> 20)) {
103
- if (bytes_rescanned_ > 2 * heap_->PromotedSpaceSize()) {
103
+ if (bytes_rescanned_ > 2 * heap_->PromotedSpaceSizeOfObjects()) {
104
104
  // If we have queued twice the heap size for rescanning then we are
105
105
  // going around in circles, scanning the same objects again and again
106
106
  // as the program mutates the heap faster than we can incrementally
@@ -118,13 +118,29 @@ void IncrementalMarking::BlackToGreyAndUnshift(HeapObject* obj,
118
118
 
119
119
 
120
120
  void IncrementalMarking::WhiteToGreyAndPush(HeapObject* obj, MarkBit mark_bit) {
121
- WhiteToGrey(obj, mark_bit);
121
+ Marking::WhiteToGrey(mark_bit);
122
122
  marking_deque_.PushGrey(obj);
123
123
  }
124
124
 
125
125
 
126
- void IncrementalMarking::WhiteToGrey(HeapObject* obj, MarkBit mark_bit) {
127
- Marking::WhiteToGrey(mark_bit);
126
+ bool IncrementalMarking::MarkObjectAndPush(HeapObject* obj) {
127
+ MarkBit mark_bit = Marking::MarkBitFrom(obj);
128
+ if (!mark_bit.Get()) {
129
+ WhiteToGreyAndPush(obj, mark_bit);
130
+ return true;
131
+ }
132
+ return false;
133
+ }
134
+
135
+
136
+ bool IncrementalMarking::MarkObjectWithoutPush(HeapObject* obj) {
137
+ MarkBit mark_bit = Marking::MarkBitFrom(obj);
138
+ if (!mark_bit.Get()) {
139
+ mark_bit.Set();
140
+ MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
141
+ return true;
142
+ }
143
+ return false;
128
144
  }
129
145
 
130
146