| 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 { | 
 |  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 |