Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 236 if (h2->IsSmi()) return false; | 236 if (h2->IsSmi()) return false; |
| 237 Handle<HeapNumber> n1 = Handle<HeapNumber>::cast(h1); | 237 Handle<HeapNumber> n1 = Handle<HeapNumber>::cast(h1); |
| 238 Handle<HeapNumber> n2 = Handle<HeapNumber>::cast(h2); | 238 Handle<HeapNumber> n2 = Handle<HeapNumber>::cast(h2); |
| 239 ASSERT(isfinite(n1->value())); | 239 ASSERT(isfinite(n1->value())); |
| 240 ASSERT(isfinite(n2->value())); | 240 ASSERT(isfinite(n2->value())); |
| 241 return n1->value() == n2->value(); | 241 return n1->value() == n2->value(); |
| 242 } | 242 } |
| 243 | 243 |
| 244 | 244 |
| 245 void ObjectLiteral::CalculateEmitStore() { | 245 void ObjectLiteral::CalculateEmitStore() { |
| 246 ZoneHashMap properties(&IsEqualString); | 246 ZoneHashMap table(Literal::Match); |
| 247 ZoneHashMap elements(&IsEqualNumber); | 247 for (int i = properties()->length() - 1; i >= 0; i--) { |
| 248 for (int i = this->properties()->length() - 1; i >= 0; i--) { | 248 ObjectLiteral::Property* property = properties()->at(i); |
| 249 ObjectLiteral::Property* property = this->properties()->at(i); | |
| 250 Literal* literal = property->key(); | 249 Literal* literal = property->key(); |
| 251 Handle<Object> handle = literal->handle(); | 250 if (literal->handle()->IsNull()) continue; |
| 252 | 251 uint32_t hash = literal->Hash(); |
| 253 if (handle->IsNull()) { | |
| 254 continue; | |
| 255 } | |
| 256 | |
| 257 uint32_t hash; | |
| 258 ZoneHashMap* table; | |
| 259 void* key; | |
| 260 Factory* factory = Isolate::Current()->factory(); | |
| 261 if (handle->IsSymbol()) { | |
| 262 Handle<String> name(String::cast(*handle)); | |
| 263 if (name->AsArrayIndex(&hash)) { | |
| 264 Handle<Object> key_handle = factory->NewNumberFromUint(hash); | |
| 265 key = key_handle.location(); | |
| 266 table = &elements; | |
| 267 } else { | |
| 268 key = name.location(); | |
| 269 hash = name->Hash(); | |
| 270 table = &properties; | |
| 271 } | |
| 272 } else if (handle->ToArrayIndex(&hash)) { | |
| 273 key = handle.location(); | |
| 274 table = &elements; | |
| 275 } else { | |
| 276 ASSERT(handle->IsNumber()); | |
| 277 double num = handle->Number(); | |
| 278 char arr[100]; | |
| 279 Vector<char> buffer(arr, ARRAY_SIZE(arr)); | |
| 280 const char* str = DoubleToCString(num, buffer); | |
| 281 Handle<String> name = factory->NewStringFromAscii(CStrVector(str)); | |
| 282 key = name.location(); | |
| 283 hash = name->Hash(); | |
| 284 table = &properties; | |
| 285 } | |
| 286 // If the key of a computed property is in the table, do not emit | 252 // If the key of a computed property is in the table, do not emit |
| 287 // a store for the property later. | 253 // a store for the property later. |
| 288 if (property->kind() == ObjectLiteral::Property::COMPUTED) { | 254 if (property->kind() == ObjectLiteral::Property::COMPUTED && |
| 289 if (table->Lookup(key, hash, false) != NULL) { | 255 table.Lookup(literal, hash, false) != NULL) { |
| 290 property->set_emit_store(false); | 256 property->set_emit_store(false); |
| 291 } | 257 } else { |
| 258 // Add key to the table. | |
| 259 table.Lookup(literal, hash, true); | |
| 292 } | 260 } |
| 293 // Add key to the table. | |
| 294 table->Lookup(key, hash, true); | |
| 295 } | 261 } |
| 296 } | 262 } |
| 297 | 263 |
| 298 | 264 |
| 299 void TargetCollector::AddTarget(Label* target) { | 265 void TargetCollector::AddTarget(Label* target) { |
| 300 // Add the label to the collector, but discard duplicates. | 266 // Add the label to the collector, but discard duplicates. |
| 301 int length = targets_.length(); | 267 int length = targets_.length(); |
| 302 for (int i = 0; i < length; i++) { | 268 for (int i = 0; i < length; i++) { |
| 303 if (targets_[i] == target) return; | 269 if (targets_[i] == target) return; |
| 304 } | 270 } |
| (...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1161 } else if (node->function()->intrinsic_type == Runtime::INLINE && | 1127 } else if (node->function()->intrinsic_type == Runtime::INLINE && |
| 1162 (node->name()->IsEqualTo(CStrVector("_ArgumentsLength")) || | 1128 (node->name()->IsEqualTo(CStrVector("_ArgumentsLength")) || |
| 1163 node->name()->IsEqualTo(CStrVector("_Arguments")))) { | 1129 node->name()->IsEqualTo(CStrVector("_Arguments")))) { |
| 1164 // Don't inline the %_ArgumentsLength or %_Arguments because their | 1130 // Don't inline the %_ArgumentsLength or %_Arguments because their |
| 1165 // implementation will not work. There is no stack frame to get them | 1131 // implementation will not work. There is no stack frame to get them |
| 1166 // from. | 1132 // from. |
| 1167 add_flag(kDontInline); | 1133 add_flag(kDontInline); |
| 1168 } | 1134 } |
| 1169 } | 1135 } |
| 1170 | 1136 |
| 1137 | |
| 1138 Handle<String> Literal::ToString() { | |
| 1139 if (handle_->IsString()) return Handle<String>::cast(handle_); | |
| 1140 ASSERT(handle_->IsNumber()); | |
| 1141 char arr[100]; | |
| 1142 Vector<char> buffer(arr, ARRAY_SIZE(arr)); | |
| 1143 const char* str; | |
| 1144 if (handle_->IsSmi()) { | |
| 1145 // Optimization only, the heap number case would subsume this. | |
| 1146 OS::SNPrintF(buffer, "%d", Smi::cast(*handle_)->value()); | |
| 1147 str = arr; | |
| 1148 } else { | |
|
rossberg
2012/03/08 16:51:39
Nit: indentation.
Sven Panne
2012/03/09 08:24:46
Done.
| |
| 1149 str = DoubleToCString(handle_->Number(), buffer); | |
| 1150 } | |
| 1151 return FACTORY->NewStringFromAscii(CStrVector(str)); | |
| 1152 } | |
| 1153 | |
| 1154 | |
| 1171 } } // namespace v8::internal | 1155 } } // namespace v8::internal |
| OLD | NEW |