Allow embedding of ConsString objects into code.

R=yangguo@chromium.org
BUG=v8:2803
LOG=N

Review URL: https://codereview.chromium.org/395713002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22406 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 1ca4454a
...@@ -166,7 +166,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -166,7 +166,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Assembler::set_target_address_at(pc_, host_, Assembler::set_target_address_at(pc_, host_,
reinterpret_cast<Address>(target), reinterpret_cast<Address>(target),
icache_flush_mode); icache_flush_mode);
......
...@@ -716,7 +716,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -716,7 +716,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Assembler::set_target_address_at(pc_, host_, Assembler::set_target_address_at(pc_, host_,
reinterpret_cast<Address>(target), reinterpret_cast<Address>(target),
icache_flush_mode); icache_flush_mode);
......
...@@ -543,19 +543,6 @@ MaybeHandle<String> Factory::NewConsString(Handle<String> left, ...@@ -543,19 +543,6 @@ MaybeHandle<String> Factory::NewConsString(Handle<String> left,
} }
Handle<String> Factory::NewFlatConcatString(Handle<String> first,
Handle<String> second) {
int total_length = first->length() + second->length();
if (first->IsOneByteRepresentation() && second->IsOneByteRepresentation()) {
return ConcatStringContent<uint8_t>(
NewRawOneByteString(total_length).ToHandleChecked(), first, second);
} else {
return ConcatStringContent<uc16>(
NewRawTwoByteString(total_length).ToHandleChecked(), first, second);
}
}
Handle<String> Factory::NewProperSubString(Handle<String> str, Handle<String> Factory::NewProperSubString(Handle<String> str,
int begin, int begin,
int end) { int end) {
......
...@@ -197,10 +197,6 @@ class Factory V8_FINAL { ...@@ -197,10 +197,6 @@ class Factory V8_FINAL {
MUST_USE_RESULT MaybeHandle<String> NewConsString(Handle<String> left, MUST_USE_RESULT MaybeHandle<String> NewConsString(Handle<String> left,
Handle<String> right); Handle<String> right);
// Create a new sequential string containing the concatenation of the inputs.
Handle<String> NewFlatConcatString(Handle<String> first,
Handle<String> second);
// Create a new string object which holds a proper substring of a string. // Create a new string object which holds a proper substring of a string.
Handle<String> NewProperSubString(Handle<String> str, Handle<String> NewProperSubString(Handle<String> str,
int begin, int begin,
......
...@@ -4067,10 +4067,9 @@ HInstruction* HStringAdd::New(Zone* zone, ...@@ -4067,10 +4067,9 @@ HInstruction* HStringAdd::New(Zone* zone,
Handle<String> right_string = c_right->StringValue(); Handle<String> right_string = c_right->StringValue();
// Prevent possible exception by invalid string length. // Prevent possible exception by invalid string length.
if (left_string->length() + right_string->length() < String::kMaxLength) { if (left_string->length() + right_string->length() < String::kMaxLength) {
Handle<String> concat = zone->isolate()->factory()->NewFlatConcatString( MaybeHandle<String> concat = zone->isolate()->factory()->NewConsString(
c_left->StringValue(), c_right->StringValue()); c_left->StringValue(), c_right->StringValue());
ASSERT(!concat.is_null()); return HConstant::New(zone, context, concat.ToHandleChecked());
return HConstant::New(zone, context, concat);
} }
} }
} }
......
...@@ -141,7 +141,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -141,7 +141,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Memory::Object_at(pc_) = target; Memory::Object_at(pc_) = target;
if (icache_flush_mode != SKIP_ICACHE_FLUSH) { if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
CpuFeatures::FlushICache(pc_, sizeof(Address)); CpuFeatures::FlushICache(pc_, sizeof(Address));
......
...@@ -992,9 +992,6 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup, ...@@ -992,9 +992,6 @@ Handle<Code> LoadIC::CompileHandler(LookupResult* lookup,
} }
case CONSTANT: { case CONSTANT: {
Handle<Object> constant(lookup->GetConstant(), isolate()); Handle<Object> constant(lookup->GetConstant(), isolate());
// TODO(2803): Don't compute a stub for cons strings because they cannot
// be embedded into code.
if (constant->IsConsString()) break;
return compiler.CompileLoadConstant(type, holder, name, constant); return compiler.CompileLoadConstant(type, holder, name, constant);
} }
case NORMAL: case NORMAL:
......
...@@ -207,7 +207,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -207,7 +207,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Assembler::set_target_address_at(pc_, host_, Assembler::set_target_address_at(pc_, host_,
reinterpret_cast<Address>(target), reinterpret_cast<Address>(target),
icache_flush_mode); icache_flush_mode);
......
...@@ -201,7 +201,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -201,7 +201,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Assembler::set_target_address_at(pc_, host_, Assembler::set_target_address_at(pc_, host_,
reinterpret_cast<Address>(target), reinterpret_cast<Address>(target),
icache_flush_mode); icache_flush_mode);
......
...@@ -237,7 +237,6 @@ template<typename StaticVisitor> ...@@ -237,7 +237,6 @@ template<typename StaticVisitor>
void StaticMarkingVisitor<StaticVisitor>::VisitEmbeddedPointer( void StaticMarkingVisitor<StaticVisitor>::VisitEmbeddedPointer(
Heap* heap, RelocInfo* rinfo) { Heap* heap, RelocInfo* rinfo) {
ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT);
ASSERT(!rinfo->target_object()->IsConsString());
HeapObject* object = HeapObject::cast(rinfo->target_object()); HeapObject* object = HeapObject::cast(rinfo->target_object());
heap->mark_compact_collector()->RecordRelocSlot(rinfo, object); heap->mark_compact_collector()->RecordRelocSlot(rinfo, object);
// TODO(ulan): It could be better to record slots only for strongly embedded // TODO(ulan): It could be better to record slots only for strongly embedded
......
...@@ -16900,10 +16900,9 @@ Handle<HeapType> PropertyCell::UpdatedType(Handle<PropertyCell> cell, ...@@ -16900,10 +16900,9 @@ Handle<HeapType> PropertyCell::UpdatedType(Handle<PropertyCell> cell,
Handle<Object> value) { Handle<Object> value) {
Isolate* isolate = cell->GetIsolate(); Isolate* isolate = cell->GetIsolate();
Handle<HeapType> old_type(cell->type(), isolate); Handle<HeapType> old_type(cell->type(), isolate);
// TODO(2803): Do not track ConsString as constant because they cannot be Handle<HeapType> new_type = value->IsTheHole()
// embedded into code. ? HeapType::Any(isolate)
Handle<HeapType> new_type = value->IsConsString() || value->IsTheHole() : HeapType::Constant(value, isolate);
? HeapType::Any(isolate) : HeapType::Constant(value, isolate);
if (new_type->Is(old_type)) { if (new_type->Is(old_type)) {
return old_type; return old_type;
......
...@@ -307,7 +307,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -307,7 +307,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Memory::Object_at(pc_) = target; Memory::Object_at(pc_) = target;
if (icache_flush_mode != SKIP_ICACHE_FLUSH) { if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
CpuFeatures::FlushICache(pc_, sizeof(Address)); CpuFeatures::FlushICache(pc_, sizeof(Address));
......
...@@ -142,7 +142,6 @@ void RelocInfo::set_target_object(Object* target, ...@@ -142,7 +142,6 @@ void RelocInfo::set_target_object(Object* target,
WriteBarrierMode write_barrier_mode, WriteBarrierMode write_barrier_mode,
ICacheFlushMode icache_flush_mode) { ICacheFlushMode icache_flush_mode) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
ASSERT(!target->IsConsString());
Memory::Object_at(pc_) = target; Memory::Object_at(pc_) = target;
if (icache_flush_mode != SKIP_ICACHE_FLUSH) { if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
CpuFeatures::FlushICache(pc_, sizeof(Address)); CpuFeatures::FlushICache(pc_, sizeof(Address));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment