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
data/vendor/v8/src/elements.h
CHANGED
@@ -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(
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
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
|
-
|
84
|
-
|
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
|
-
|
89
|
-
|
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(
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
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(
|
121
|
-
|
122
|
-
|
123
|
-
|
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) {
|
data/vendor/v8/src/factory.cc
CHANGED
@@ -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
|
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
|
-
|
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
|
|
data/vendor/v8/src/factory.h
CHANGED
@@ -216,9 +216,10 @@ class Factory {
|
|
216
216
|
Handle<JSGlobalPropertyCell> NewJSGlobalPropertyCell(
|
217
217
|
Handle<Object> value);
|
218
218
|
|
219
|
-
Handle<Map> NewMap(
|
220
|
-
|
221
|
-
|
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(
|
273
|
-
|
274
|
-
|
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 =
|
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")
|
data/vendor/v8/src/frames.h
CHANGED
@@ -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);
|
data/vendor/v8/src/globals.h
CHANGED
@@ -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
|
data/vendor/v8/src/heap-inl.h
CHANGED
@@ -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
|
-
|
599
|
-
|
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
|
-
|
603
|
-
|
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
|
}
|
data/vendor/v8/src/heap.cc
CHANGED
@@ -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_ =
|
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->
|
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()->
|
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()->
|
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()->
|
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(
|
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)->
|
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->
|
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)->
|
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
|
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
|
-
|
4537
|
-
|
4538
|
-
|
4539
|
-
|
4540
|
-
|
4541
|
-
|
4542
|
-
|
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->
|
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()
|