Skip to content

Commit 3abce01

Browse files
committed
Merge branch 'v8'
Conflicts: src/full-codegen.cc src/isolate.cc
2 parents a6f25f5 + dcfa7d8 commit 3abce01

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+993
-486
lines changed

Diff for: build/common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@
269269
}],
270270
['OS=="win"', {
271271
'msvs_configuration_attributes': {
272-
'OutputDirectory': '$(SolutionDir)$(ConfigurationName)',
272+
'OutputDirectory': '<(DEPTH)\\build\\$(ConfigurationName)',
273273
'IntermediateDirectory': '$(OutDir)\\obj\\$(ProjectName)',
274274
'CharacterSet': '1',
275275
},

Diff for: include/v8.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -2452,7 +2452,7 @@ class V8EXPORT TypeSwitch : public Data {
24522452

24532453
// --- Extensions ---
24542454

2455-
class ExternalAsciiStringResourceImpl
2455+
class V8EXPORT ExternalAsciiStringResourceImpl
24562456
: public String::ExternalAsciiStringResource {
24572457
public:
24582458
ExternalAsciiStringResourceImpl() : data_(0), length_(0) {}

Diff for: src/arm/assembler-arm-inl.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ bool RelocInfo::IsPatchedDebugBreakSlotSequence() {
215215
void RelocInfo::Visit(ObjectVisitor* visitor) {
216216
RelocInfo::Mode mode = rmode();
217217
if (mode == RelocInfo::EMBEDDED_OBJECT) {
218-
visitor->VisitPointer(target_object_address());
218+
visitor->VisitEmbeddedPointer(host(), target_object_address());
219219
} else if (RelocInfo::IsCodeTarget(mode)) {
220220
visitor->VisitCodeTarget(this);
221221
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
@@ -241,7 +241,7 @@ template<typename StaticVisitor>
241241
void RelocInfo::Visit(Heap* heap) {
242242
RelocInfo::Mode mode = rmode();
243243
if (mode == RelocInfo::EMBEDDED_OBJECT) {
244-
StaticVisitor::VisitPointer(heap, target_object_address());
244+
StaticVisitor::VisitEmbeddedPointer(heap, host(), target_object_address());
245245
} else if (RelocInfo::IsCodeTarget(mode)) {
246246
StaticVisitor::VisitCodeTarget(heap, this);
247247
} else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {

Diff for: src/arm/code-stubs-arm.cc

+45-9
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ void FloatingPointHelper::CallCCodeForDoubleOperation(
859859
}
860860

861861

862-
bool WriteInt32ToHeapNumberStub::CompilingCallsToThisStubIsGCSafe() {
862+
bool WriteInt32ToHeapNumberStub::IsPregenerated() {
863863
// These variants are compiled ahead of time. See next method.
864864
if (the_int_.is(r1) && the_heap_number_.is(r0) && scratch_.is(r2)) {
865865
return true;
@@ -877,8 +877,8 @@ bool WriteInt32ToHeapNumberStub::CompilingCallsToThisStubIsGCSafe() {
877877
void WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime() {
878878
WriteInt32ToHeapNumberStub stub1(r1, r0, r2);
879879
WriteInt32ToHeapNumberStub stub2(r2, r0, r3);
880-
Handle<Code> code1 = stub1.GetCode();
881-
Handle<Code> code2 = stub2.GetCode();
880+
stub1.GetCode()->set_is_pregenerated(true);
881+
stub2.GetCode()->set_is_pregenerated(true);
882882
}
883883

884884

@@ -2094,6 +2094,10 @@ void BinaryOpStub::GenerateTypeTransitionWithSavedArgs(
20942094

20952095

20962096
void BinaryOpStub::Generate(MacroAssembler* masm) {
2097+
// Explicitly allow generation of nested stubs. It is safe here because
2098+
// generation code does not use any raw pointers.
2099+
AllowStubCallsScope allow_stub_calls(masm, true);
2100+
20972101
switch (operands_type_) {
20982102
case BinaryOpIC::UNINITIALIZED:
20992103
GenerateTypeTransition(masm);
@@ -3394,24 +3398,37 @@ bool CEntryStub::NeedsImmovableCode() {
33943398
}
33953399

33963400

3397-
bool CEntryStub::CompilingCallsToThisStubIsGCSafe() {
3401+
bool CEntryStub::IsPregenerated() {
33983402
return (!save_doubles_ || ISOLATE->fp_stubs_generated()) &&
33993403
result_size_ == 1;
34003404
}
34013405

34023406

34033407
void CodeStub::GenerateStubsAheadOfTime() {
3408+
CEntryStub::GenerateAheadOfTime();
34043409
WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime();
3410+
StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime();
3411+
RecordWriteStub::GenerateFixedRegStubsAheadOfTime();
34053412
}
34063413

34073414

34083415
void CodeStub::GenerateFPStubs() {
34093416
CEntryStub save_doubles(1, kSaveFPRegs);
34103417
Handle<Code> code = save_doubles.GetCode();
3418+
code->set_is_pregenerated(true);
3419+
StoreBufferOverflowStub stub(kSaveFPRegs);
3420+
stub.GetCode()->set_is_pregenerated(true);
34113421
code->GetIsolate()->set_fp_stubs_generated(true);
34123422
}
34133423

34143424

3425+
void CEntryStub::GenerateAheadOfTime() {
3426+
CEntryStub stub(1, kDontSaveFPRegs);
3427+
Handle<Code> code = stub.GetCode();
3428+
code->set_is_pregenerated(true);
3429+
}
3430+
3431+
34153432
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
34163433
__ Throw(r0);
34173434
}
@@ -4815,6 +4832,22 @@ void RegExpConstructResultStub::Generate(MacroAssembler* masm) {
48154832
}
48164833

48174834

4835+
void CallFunctionStub::FinishCode(Code* code) {
4836+
code->set_has_function_cache(false);
4837+
}
4838+
4839+
4840+
void CallFunctionStub::Clear(Heap* heap, Address address) {
4841+
UNREACHABLE();
4842+
}
4843+
4844+
4845+
Object* CallFunctionStub::GetCachedValue(Address address) {
4846+
UNREACHABLE();
4847+
return NULL;
4848+
}
4849+
4850+
48184851
void CallFunctionStub::Generate(MacroAssembler* masm) {
48194852
Label slow, non_function;
48204853

@@ -6837,7 +6870,7 @@ struct AheadOfTimeWriteBarrierStubList kAheadOfTime[] = {
68376870
};
68386871

68396872

6840-
bool RecordWriteStub::CompilingCallsToThisStubIsGCSafe() {
6873+
bool RecordWriteStub::IsPregenerated() {
68416874
for (AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime;
68426875
!entry->object.is(no_reg);
68436876
entry++) {
@@ -6853,11 +6886,14 @@ bool RecordWriteStub::CompilingCallsToThisStubIsGCSafe() {
68536886
}
68546887

68556888

6889+
bool StoreBufferOverflowStub::IsPregenerated() {
6890+
return save_doubles_ == kDontSaveFPRegs || ISOLATE->fp_stubs_generated();
6891+
}
6892+
6893+
68566894
void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime() {
68576895
StoreBufferOverflowStub stub1(kDontSaveFPRegs);
6858-
stub1.GetCode();
6859-
StoreBufferOverflowStub stub2(kSaveFPRegs);
6860-
stub2.GetCode();
6896+
stub1.GetCode()->set_is_pregenerated(true);
68616897
}
68626898

68636899

@@ -6870,7 +6906,7 @@ void RecordWriteStub::GenerateFixedRegStubsAheadOfTime() {
68706906
entry->address,
68716907
entry->action,
68726908
kDontSaveFPRegs);
6873-
stub.GetCode();
6909+
stub.GetCode()->set_is_pregenerated(true);
68746910
}
68756911
}
68766912

Diff for: src/arm/code-stubs-arm.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class StoreBufferOverflowStub: public CodeStub {
6565

6666
void Generate(MacroAssembler* masm);
6767

68-
virtual bool CompilingCallsToThisStubIsGCSafe() { return true; }
68+
virtual bool IsPregenerated();
6969
static void GenerateFixedRegStubsAheadOfTime();
7070
virtual bool SometimesSetsUpAFrame() { return false; }
7171

@@ -342,7 +342,7 @@ class WriteInt32ToHeapNumberStub : public CodeStub {
342342
the_heap_number_(the_heap_number),
343343
scratch_(scratch) { }
344344

345-
bool CompilingCallsToThisStubIsGCSafe();
345+
bool IsPregenerated();
346346
static void GenerateFixedRegStubsAheadOfTime();
347347

348348
private:
@@ -416,7 +416,7 @@ class RecordWriteStub: public CodeStub {
416416
INCREMENTAL_COMPACTION
417417
};
418418

419-
virtual bool CompilingCallsToThisStubIsGCSafe();
419+
virtual bool IsPregenerated();
420420
static void GenerateFixedRegStubsAheadOfTime();
421421
virtual bool SometimesSetsUpAFrame() { return false; }
422422

Diff for: src/arm/lithium-arm.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -1739,7 +1739,7 @@ LInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
17391739

17401740
LInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
17411741
LLoadGlobalCell* result = new LLoadGlobalCell;
1742-
return instr->check_hole_value()
1742+
return instr->RequiresHoleCheck()
17431743
? AssignEnvironment(DefineAsRegister(result))
17441744
: DefineAsRegister(result);
17451745
}
@@ -1756,7 +1756,7 @@ LInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
17561756
LOperand* temp = TempRegister();
17571757
LOperand* value = UseTempRegister(instr->value());
17581758
LInstruction* result = new LStoreGlobalCell(value, temp);
1759-
if (instr->check_hole_value()) result = AssignEnvironment(result);
1759+
if (instr->RequiresHoleCheck()) result = AssignEnvironment(result);
17601760
return result;
17611761
}
17621762

Diff for: src/arm/lithium-codegen-arm.cc

+6-10
Original file line numberDiff line numberDiff line change
@@ -2207,7 +2207,7 @@ void LCodeGen::DoLoadGlobalCell(LLoadGlobalCell* instr) {
22072207
Register result = ToRegister(instr->result());
22082208
__ mov(ip, Operand(Handle<Object>(instr->hydrogen()->cell())));
22092209
__ ldr(result, FieldMemOperand(ip, JSGlobalPropertyCell::kValueOffset));
2210-
if (instr->hydrogen()->check_hole_value()) {
2210+
if (instr->hydrogen()->RequiresHoleCheck()) {
22112211
__ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
22122212
__ cmp(result, ip);
22132213
DeoptimizeIf(eq, instr->environment());
@@ -2239,7 +2239,7 @@ void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) {
22392239
// been deleted from the property dictionary. In that case, we need
22402240
// to update the property details in the property dictionary to mark
22412241
// it as no longer deleted.
2242-
if (instr->hydrogen()->check_hole_value()) {
2242+
if (instr->hydrogen()->RequiresHoleCheck()) {
22432243
__ ldr(scratch2,
22442244
FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset));
22452245
__ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
@@ -2541,13 +2541,9 @@ void LCodeGen::DoLoadKeyedFastDoubleElement(
25412541
Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag));
25422542
}
25432543

2544-
if (instr->hydrogen()->RequiresHoleCheck()) {
2545-
// TODO(danno): If no hole check is required, there is no need to allocate
2546-
// elements into a temporary register, instead scratch can be used.
2547-
__ ldr(scratch, MemOperand(elements, sizeof(kHoleNanLower32)));
2548-
__ cmp(scratch, Operand(kHoleNanUpper32));
2549-
DeoptimizeIf(eq, instr->environment());
2550-
}
2544+
__ ldr(scratch, MemOperand(elements, sizeof(kHoleNanLower32)));
2545+
__ cmp(scratch, Operand(kHoleNanUpper32));
2546+
DeoptimizeIf(eq, instr->environment());
25512547

25522548
__ vldr(result, elements, 0);
25532549
}
@@ -3245,7 +3241,7 @@ void LCodeGen::DoCallFunction(LCallFunction* instr) {
32453241
ASSERT(ToRegister(instr->result()).is(r0));
32463242

32473243
int arity = instr->arity();
3248-
CallFunctionStub stub(arity, RECEIVER_MIGHT_BE_IMPLICIT);
3244+
CallFunctionStub stub(arity, NO_CALL_FUNCTION_FLAGS);
32493245
CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
32503246
__ Drop(1);
32513247
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));

Diff for: src/arm/macro-assembler-arm.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -2003,7 +2003,7 @@ MaybeObject* MacroAssembler::TryCallStub(CodeStub* stub, Condition cond) {
20032003

20042004

20052005
void MacroAssembler::TailCallStub(CodeStub* stub, Condition cond) {
2006-
ASSERT(stub->CompilingCallsToThisStubIsGCSafe() || allow_stub_calls_);
2006+
ASSERT(allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe());
20072007
Jump(stub->GetCode(), RelocInfo::CODE_TARGET, cond);
20082008
}
20092009

@@ -2113,7 +2113,7 @@ MaybeObject* MacroAssembler::TryCallApiFunctionAndReturn(
21132113

21142114
bool MacroAssembler::AllowThisStubCall(CodeStub* stub) {
21152115
if (!has_frame_ && stub->SometimesSetsUpAFrame()) return false;
2116-
return stub->CompilingCallsToThisStubIsGCSafe() || allow_stub_calls_;
2116+
return allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe();
21172117
}
21182118

21192119

Diff for: src/ast.cc

+30-26
Original file line numberDiff line numberDiff line change
@@ -764,37 +764,41 @@ bool Call::ComputeGlobalTarget(Handle<GlobalObject> global,
764764

765765
void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle,
766766
CallKind call_kind) {
767+
is_monomorphic_ = oracle->CallIsMonomorphic(this);
767768
Property* property = expression()->AsProperty();
768-
ASSERT(property != NULL);
769-
// Specialize for the receiver types seen at runtime.
770-
Literal* key = property->key()->AsLiteral();
771-
ASSERT(key != NULL && key->handle()->IsString());
772-
Handle<String> name = Handle<String>::cast(key->handle());
773-
receiver_types_.Clear();
774-
oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_);
769+
if (property == NULL) {
770+
// Function call. Specialize for monomorphic calls.
771+
if (is_monomorphic_) target_ = oracle->GetCallTarget(this);
772+
} else {
773+
// Method call. Specialize for the receiver types seen at runtime.
774+
Literal* key = property->key()->AsLiteral();
775+
ASSERT(key != NULL && key->handle()->IsString());
776+
Handle<String> name = Handle<String>::cast(key->handle());
777+
receiver_types_.Clear();
778+
oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_);
775779
#ifdef DEBUG
776-
if (FLAG_enable_slow_asserts) {
777-
int length = receiver_types_.length();
778-
for (int i = 0; i < length; i++) {
779-
Handle<Map> map = receiver_types_.at(i);
780-
ASSERT(!map.is_null() && *map != NULL);
780+
if (FLAG_enable_slow_asserts) {
781+
int length = receiver_types_.length();
782+
for (int i = 0; i < length; i++) {
783+
Handle<Map> map = receiver_types_.at(i);
784+
ASSERT(!map.is_null() && *map != NULL);
785+
}
781786
}
782-
}
783787
#endif
784-
is_monomorphic_ = oracle->CallIsMonomorphic(this);
785-
check_type_ = oracle->GetCallCheckType(this);
786-
if (is_monomorphic_) {
787-
Handle<Map> map;
788-
if (receiver_types_.length() > 0) {
789-
ASSERT(check_type_ == RECEIVER_MAP_CHECK);
790-
map = receiver_types_.at(0);
791-
} else {
792-
ASSERT(check_type_ != RECEIVER_MAP_CHECK);
793-
holder_ = Handle<JSObject>(
794-
oracle->GetPrototypeForPrimitiveCheck(check_type_));
795-
map = Handle<Map>(holder_->map());
788+
check_type_ = oracle->GetCallCheckType(this);
789+
if (is_monomorphic_) {
790+
Handle<Map> map;
791+
if (receiver_types_.length() > 0) {
792+
ASSERT(check_type_ == RECEIVER_MAP_CHECK);
793+
map = receiver_types_.at(0);
794+
} else {
795+
ASSERT(check_type_ != RECEIVER_MAP_CHECK);
796+
holder_ = Handle<JSObject>(
797+
oracle->GetPrototypeForPrimitiveCheck(check_type_));
798+
map = Handle<Map>(holder_->map());
799+
}
800+
is_monomorphic_ = ComputeTarget(map, name);
796801
}
797-
is_monomorphic_ = ComputeTarget(map, name);
798802
}
799803
}
800804

Diff for: src/builtins.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ BUILTIN(ArraySlice) {
660660
int len = -1;
661661
if (receiver->IsJSArray()) {
662662
JSArray* array = JSArray::cast(receiver);
663-
if (!array->HasFastElements() ||
663+
if (!array->HasFastTypeElements() ||
664664
!IsJSArrayFastElementMovingAllowed(heap, array)) {
665665
return CallJsBuiltin(isolate, "ArraySlice", args);
666666
}
@@ -676,7 +676,7 @@ BUILTIN(ArraySlice) {
676676
bool is_arguments_object_with_fast_elements =
677677
receiver->IsJSObject()
678678
&& JSObject::cast(receiver)->map() == arguments_map
679-
&& JSObject::cast(receiver)->HasFastElements();
679+
&& JSObject::cast(receiver)->HasFastTypeElements();
680680
if (!is_arguments_object_with_fast_elements) {
681681
return CallJsBuiltin(isolate, "ArraySlice", args);
682682
}
@@ -963,7 +963,7 @@ BUILTIN(ArrayConcat) {
963963
int result_len = 0;
964964
for (int i = 0; i < n_arguments; i++) {
965965
Object* arg = args[i];
966-
if (!arg->IsJSArray() || !JSArray::cast(arg)->HasFastElements()
966+
if (!arg->IsJSArray() || !JSArray::cast(arg)->HasFastTypeElements()
967967
|| JSArray::cast(arg)->GetPrototype() != array_proto) {
968968
return CallJsBuiltin(isolate, "ArrayConcat", args);
969969
}

0 commit comments

Comments
 (0)