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.
- data/Rakefile +10 -3
- data/ext/libv8/compiler.rb +46 -0
- data/ext/libv8/extconf.rb +5 -1
- data/ext/libv8/make.rb +13 -0
- data/lib/libv8/version.rb +1 -1
- data/patches/add-freebsd9-and-freebsd10-to-gyp-GetFlavor.patch +11 -0
- data/patches/src_platform-freebsd.cc.patch +10 -0
- data/vendor/v8/ChangeLog +124 -0
- data/vendor/v8/DEPS +27 -0
- data/vendor/v8/Makefile +7 -0
- data/vendor/v8/SConstruct +15 -2
- data/vendor/v8/build/common.gypi +129 -157
- data/vendor/v8/build/gyp_v8 +11 -25
- data/vendor/v8/build/standalone.gypi +9 -3
- data/vendor/v8/include/v8.h +5 -3
- data/vendor/v8/src/SConscript +1 -0
- data/vendor/v8/src/api.cc +4 -33
- data/vendor/v8/src/api.h +2 -2
- data/vendor/v8/src/arm/builtins-arm.cc +5 -4
- data/vendor/v8/src/arm/code-stubs-arm.cc +21 -14
- data/vendor/v8/src/arm/codegen-arm.cc +2 -2
- data/vendor/v8/src/arm/debug-arm.cc +3 -1
- data/vendor/v8/src/arm/full-codegen-arm.cc +3 -102
- data/vendor/v8/src/arm/ic-arm.cc +30 -33
- data/vendor/v8/src/arm/lithium-arm.cc +20 -7
- data/vendor/v8/src/arm/lithium-arm.h +10 -4
- data/vendor/v8/src/arm/lithium-codegen-arm.cc +106 -60
- data/vendor/v8/src/arm/macro-assembler-arm.cc +49 -39
- data/vendor/v8/src/arm/macro-assembler-arm.h +5 -4
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +115 -55
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +7 -6
- data/vendor/v8/src/arm/simulator-arm.h +6 -6
- data/vendor/v8/src/arm/stub-cache-arm.cc +64 -19
- data/vendor/v8/src/array.js +7 -3
- data/vendor/v8/src/ast.cc +11 -6
- data/vendor/v8/src/bootstrapper.cc +9 -11
- data/vendor/v8/src/builtins.cc +61 -31
- data/vendor/v8/src/code-stubs.cc +23 -9
- data/vendor/v8/src/code-stubs.h +1 -0
- data/vendor/v8/src/codegen.h +3 -3
- data/vendor/v8/src/compiler.cc +1 -1
- data/vendor/v8/src/contexts.h +2 -18
- data/vendor/v8/src/d8.cc +94 -93
- data/vendor/v8/src/d8.h +1 -1
- data/vendor/v8/src/debug-agent.cc +3 -3
- data/vendor/v8/src/debug.cc +41 -1
- data/vendor/v8/src/debug.h +50 -0
- data/vendor/v8/src/elements-kind.cc +134 -0
- data/vendor/v8/src/elements-kind.h +210 -0
- data/vendor/v8/src/elements.cc +356 -190
- data/vendor/v8/src/elements.h +36 -28
- data/vendor/v8/src/factory.cc +44 -4
- data/vendor/v8/src/factory.h +11 -7
- data/vendor/v8/src/flag-definitions.h +3 -0
- data/vendor/v8/src/frames.h +3 -0
- data/vendor/v8/src/full-codegen.cc +2 -1
- data/vendor/v8/src/func-name-inferrer.h +2 -0
- data/vendor/v8/src/globals.h +3 -0
- data/vendor/v8/src/heap-inl.h +16 -4
- data/vendor/v8/src/heap.cc +38 -32
- data/vendor/v8/src/heap.h +3 -17
- data/vendor/v8/src/hydrogen-instructions.cc +28 -5
- data/vendor/v8/src/hydrogen-instructions.h +142 -44
- data/vendor/v8/src/hydrogen.cc +160 -55
- data/vendor/v8/src/hydrogen.h +2 -0
- data/vendor/v8/src/ia32/assembler-ia32.h +3 -0
- data/vendor/v8/src/ia32/builtins-ia32.cc +5 -4
- data/vendor/v8/src/ia32/code-stubs-ia32.cc +22 -16
- data/vendor/v8/src/ia32/codegen-ia32.cc +2 -2
- data/vendor/v8/src/ia32/debug-ia32.cc +29 -2
- data/vendor/v8/src/ia32/full-codegen-ia32.cc +8 -101
- data/vendor/v8/src/ia32/ic-ia32.cc +23 -19
- data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +126 -80
- data/vendor/v8/src/ia32/lithium-codegen-ia32.h +2 -1
- data/vendor/v8/src/ia32/lithium-ia32.cc +15 -9
- data/vendor/v8/src/ia32/lithium-ia32.h +14 -6
- data/vendor/v8/src/ia32/macro-assembler-ia32.cc +50 -40
- data/vendor/v8/src/ia32/macro-assembler-ia32.h +5 -4
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +113 -43
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +9 -4
- data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
- data/vendor/v8/src/ia32/stub-cache-ia32.cc +52 -14
- data/vendor/v8/src/ic.cc +77 -20
- data/vendor/v8/src/ic.h +18 -2
- data/vendor/v8/src/incremental-marking-inl.h +21 -5
- data/vendor/v8/src/incremental-marking.cc +35 -8
- data/vendor/v8/src/incremental-marking.h +12 -3
- data/vendor/v8/src/isolate.cc +12 -2
- data/vendor/v8/src/isolate.h +1 -1
- data/vendor/v8/src/jsregexp.cc +66 -26
- data/vendor/v8/src/jsregexp.h +60 -31
- data/vendor/v8/src/list-inl.h +8 -0
- data/vendor/v8/src/list.h +3 -0
- data/vendor/v8/src/lithium.cc +5 -2
- data/vendor/v8/src/liveedit.cc +57 -5
- data/vendor/v8/src/mark-compact-inl.h +17 -11
- data/vendor/v8/src/mark-compact.cc +100 -143
- data/vendor/v8/src/mark-compact.h +44 -20
- data/vendor/v8/src/messages.js +131 -99
- data/vendor/v8/src/mips/builtins-mips.cc +5 -4
- data/vendor/v8/src/mips/code-stubs-mips.cc +23 -15
- data/vendor/v8/src/mips/codegen-mips.cc +2 -2
- data/vendor/v8/src/mips/debug-mips.cc +3 -1
- data/vendor/v8/src/mips/full-codegen-mips.cc +4 -102
- data/vendor/v8/src/mips/ic-mips.cc +34 -36
- data/vendor/v8/src/mips/lithium-codegen-mips.cc +116 -68
- data/vendor/v8/src/mips/lithium-mips.cc +20 -7
- data/vendor/v8/src/mips/lithium-mips.h +11 -4
- data/vendor/v8/src/mips/macro-assembler-mips.cc +50 -39
- data/vendor/v8/src/mips/macro-assembler-mips.h +5 -4
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +110 -50
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +6 -5
- data/vendor/v8/src/mips/simulator-mips.h +5 -5
- data/vendor/v8/src/mips/stub-cache-mips.cc +66 -20
- data/vendor/v8/src/mksnapshot.cc +5 -1
- data/vendor/v8/src/objects-debug.cc +103 -6
- data/vendor/v8/src/objects-inl.h +215 -116
- data/vendor/v8/src/objects-printer.cc +13 -8
- data/vendor/v8/src/objects.cc +608 -331
- data/vendor/v8/src/objects.h +129 -94
- data/vendor/v8/src/parser.cc +16 -4
- data/vendor/v8/src/platform-freebsd.cc +1 -0
- data/vendor/v8/src/platform-linux.cc +9 -30
- data/vendor/v8/src/platform-posix.cc +28 -7
- data/vendor/v8/src/platform-win32.cc +15 -3
- data/vendor/v8/src/platform.h +2 -1
- data/vendor/v8/src/profile-generator-inl.h +25 -2
- data/vendor/v8/src/profile-generator.cc +300 -822
- data/vendor/v8/src/profile-generator.h +97 -214
- data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +2 -1
- data/vendor/v8/src/regexp-macro-assembler-irregexp.h +2 -2
- data/vendor/v8/src/regexp-macro-assembler-tracer.cc +6 -5
- data/vendor/v8/src/regexp-macro-assembler-tracer.h +1 -1
- data/vendor/v8/src/regexp-macro-assembler.cc +7 -3
- data/vendor/v8/src/regexp-macro-assembler.h +10 -2
- data/vendor/v8/src/regexp.js +6 -0
- data/vendor/v8/src/runtime.cc +265 -212
- data/vendor/v8/src/runtime.h +6 -5
- data/vendor/v8/src/scopes.cc +20 -0
- data/vendor/v8/src/scopes.h +6 -3
- data/vendor/v8/src/spaces.cc +0 -2
- data/vendor/v8/src/string-stream.cc +2 -2
- data/vendor/v8/src/v8-counters.h +0 -2
- data/vendor/v8/src/v8natives.js +2 -2
- data/vendor/v8/src/v8utils.h +6 -3
- data/vendor/v8/src/version.cc +1 -1
- data/vendor/v8/src/x64/assembler-x64.h +2 -1
- data/vendor/v8/src/x64/builtins-x64.cc +5 -4
- data/vendor/v8/src/x64/code-stubs-x64.cc +25 -16
- data/vendor/v8/src/x64/codegen-x64.cc +2 -2
- data/vendor/v8/src/x64/debug-x64.cc +14 -1
- data/vendor/v8/src/x64/disasm-x64.cc +1 -1
- data/vendor/v8/src/x64/full-codegen-x64.cc +10 -106
- data/vendor/v8/src/x64/ic-x64.cc +20 -16
- data/vendor/v8/src/x64/lithium-codegen-x64.cc +156 -79
- data/vendor/v8/src/x64/lithium-codegen-x64.h +2 -1
- data/vendor/v8/src/x64/lithium-x64.cc +18 -8
- data/vendor/v8/src/x64/lithium-x64.h +7 -2
- data/vendor/v8/src/x64/macro-assembler-x64.cc +50 -40
- data/vendor/v8/src/x64/macro-assembler-x64.h +5 -4
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +122 -51
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +17 -8
- data/vendor/v8/src/x64/simulator-x64.h +4 -4
- data/vendor/v8/src/x64/stub-cache-x64.cc +55 -17
- data/vendor/v8/test/cctest/cctest.status +1 -0
- data/vendor/v8/test/cctest/test-api.cc +24 -0
- data/vendor/v8/test/cctest/test-func-name-inference.cc +38 -0
- data/vendor/v8/test/cctest/test-heap-profiler.cc +21 -77
- data/vendor/v8/test/cctest/test-heap.cc +164 -3
- data/vendor/v8/test/cctest/test-list.cc +12 -0
- data/vendor/v8/test/cctest/test-mark-compact.cc +5 -5
- data/vendor/v8/test/cctest/test-regexp.cc +14 -8
- data/vendor/v8/test/cctest/testcfg.py +2 -0
- data/vendor/v8/test/mjsunit/accessor-map-sharing.js +176 -0
- data/vendor/v8/test/mjsunit/array-construct-transition.js +3 -3
- data/vendor/v8/test/mjsunit/array-literal-transitions.js +10 -10
- data/vendor/v8/test/mjsunit/big-array-literal.js +3 -0
- data/vendor/v8/test/mjsunit/compiler/inline-construct.js +4 -2
- data/vendor/v8/test/mjsunit/debug-liveedit-stack-padding.js +88 -0
- data/vendor/v8/test/mjsunit/elements-kind.js +4 -4
- data/vendor/v8/test/mjsunit/elements-transition-hoisting.js +2 -2
- data/vendor/v8/test/mjsunit/elements-transition.js +5 -5
- data/vendor/v8/test/mjsunit/error-constructors.js +68 -33
- data/vendor/v8/test/mjsunit/harmony/proxies.js +14 -6
- data/vendor/v8/test/mjsunit/mjsunit.status +1 -0
- data/vendor/v8/test/mjsunit/packed-elements.js +112 -0
- data/vendor/v8/test/mjsunit/regexp-capture-3.js +6 -0
- data/vendor/v8/test/mjsunit/regexp-global.js +132 -0
- data/vendor/v8/test/mjsunit/regexp.js +11 -0
- data/vendor/v8/test/mjsunit/regress/regress-117409.js +52 -0
- data/vendor/v8/test/mjsunit/regress/regress-126412.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-128018.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-128146.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-1639-2.js +4 -1
- data/vendor/v8/test/mjsunit/regress/regress-1639.js +14 -8
- data/vendor/v8/test/mjsunit/regress/regress-1849.js +3 -3
- data/vendor/v8/test/mjsunit/regress/regress-1878.js +2 -2
- data/vendor/v8/test/mjsunit/regress/regress-2071.js +79 -0
- data/vendor/v8/test/mjsunit/regress/regress-2153.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-122271.js +4 -4
- data/vendor/v8/test/mjsunit/regress/regress-crbug-126414.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-smi-only-concat.js +2 -2
- data/vendor/v8/test/mjsunit/regress/regress-transcendental.js +49 -0
- data/vendor/v8/test/mjsunit/stack-traces.js +14 -0
- data/vendor/v8/test/mjsunit/unbox-double-arrays.js +4 -3
- data/vendor/v8/test/test262/testcfg.py +6 -1
- data/vendor/v8/tools/check-static-initializers.sh +11 -3
- data/vendor/v8/tools/fuzz-harness.sh +92 -0
- data/vendor/v8/tools/grokdump.py +658 -67
- data/vendor/v8/tools/gyp/v8.gyp +21 -39
- data/vendor/v8/tools/js2c.py +3 -3
- data/vendor/v8/tools/jsmin.py +2 -2
- data/vendor/v8/tools/presubmit.py +2 -1
- data/vendor/v8/tools/test-wrapper-gypbuild.py +25 -11
- metadata +624 -612
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright
|
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
|
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
|
-
|
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
|
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
|
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
|
786
|
-
|
787
|
-
__ mov(FieldOperand(receiver_reg, HeapObject::kMapOffset),
|
788
|
-
|
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 (
|
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 (
|
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 (
|
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(¬_fast_object);
|
1451
|
-
__
|
1474
|
+
__ CheckFastSmiElements(ebx, &call_builtin);
|
1452
1475
|
// edi: elements array
|
1453
1476
|
// edx: receiver
|
1454
1477
|
// ebx: map
|
1455
|
-
|
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::
|
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
|
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
|
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
|
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
|
data/vendor/v8/src/ic.cc
CHANGED
@@ -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->
|
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->
|
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
|
-
|
1679
|
-
|
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
|
-
|
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->
|
1761
|
+
if (receiver->HasFastSmiElements()) {
|
1743
1762
|
if (value->IsHeapNumber()) {
|
1744
|
-
|
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
|
-
|
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
|
-
|
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->
|
1788
|
+
if (receiver->HasFastSmiElements()) {
|
1758
1789
|
if (value->IsHeapNumber()) {
|
1759
|
-
|
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
|
-
|
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
|
-
|
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";
|
data/vendor/v8/src/ic.h
CHANGED
@@ -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
|
-
|
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
|
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_->
|
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(
|
121
|
+
Marking::WhiteToGrey(mark_bit);
|
122
122
|
marking_deque_.PushGrey(obj);
|
123
123
|
}
|
124
124
|
|
125
125
|
|
126
|
-
|
127
|
-
Marking::
|
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
|
|