| OLD | NEW | 
|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 425 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 436       is_cow ? elements : isolate->factory()->CopyFixedArray(elements); | 436       is_cow ? elements : isolate->factory()->CopyFixedArray(elements); | 
| 437 | 437 | 
| 438   Handle<FixedArray> content = Handle<FixedArray>::cast(copied_elements); | 438   Handle<FixedArray> content = Handle<FixedArray>::cast(copied_elements); | 
| 439   bool has_non_smi = false; | 439   bool has_non_smi = false; | 
| 440   if (is_cow) { | 440   if (is_cow) { | 
| 441     // Copy-on-write arrays must be shallow (and simple). | 441     // Copy-on-write arrays must be shallow (and simple). | 
| 442     if (FLAG_smi_only_arrays) { | 442     if (FLAG_smi_only_arrays) { | 
| 443       for (int i = 0; i < content->length(); i++) { | 443       for (int i = 0; i < content->length(); i++) { | 
| 444         Object* current = content->get(i); | 444         Object* current = content->get(i); | 
| 445         ASSERT(!current->IsFixedArray()); | 445         ASSERT(!current->IsFixedArray()); | 
| 446         if (!current->IsSmi()) { | 446         if (!current->IsSmi() && !current->IsTheHole()) { | 
| 447           has_non_smi = true; | 447           has_non_smi = true; | 
| 448         } | 448         } | 
| 449       } | 449       } | 
| 450     } else { | 450     } else { | 
| 451 #if DEBUG | 451 #if DEBUG | 
| 452       for (int i = 0; i < content->length(); i++) { | 452       for (int i = 0; i < content->length(); i++) { | 
| 453         ASSERT(!content->get(i)->IsFixedArray()); | 453         ASSERT(!content->get(i)->IsFixedArray()); | 
| 454       } | 454       } | 
| 455 #endif | 455 #endif | 
| 456     } | 456     } | 
| 457   } else { | 457   } else { | 
| 458     for (int i = 0; i < content->length(); i++) { | 458     for (int i = 0; i < content->length(); i++) { | 
| 459       Object* current = content->get(i); | 459       Object* current = content->get(i); | 
| 460       if (current->IsFixedArray()) { | 460       if (current->IsFixedArray()) { | 
| 461         // The value contains the constant_properties of a | 461         // The value contains the constant_properties of a | 
| 462         // simple object or array literal. | 462         // simple object or array literal. | 
| 463         Handle<FixedArray> fa(FixedArray::cast(content->get(i))); | 463         Handle<FixedArray> fa(FixedArray::cast(content->get(i))); | 
| 464         Handle<Object> result = | 464         Handle<Object> result = | 
| 465             CreateLiteralBoilerplate(isolate, literals, fa); | 465             CreateLiteralBoilerplate(isolate, literals, fa); | 
| 466         if (result.is_null()) return result; | 466         if (result.is_null()) return result; | 
| 467         content->set(i, *result); | 467         content->set(i, *result); | 
| 468         has_non_smi = true; | 468         has_non_smi = true; | 
| 469       } else { | 469       } else { | 
| 470         if (!current->IsSmi()) { | 470         if (!current->IsSmi() && !current->IsTheHole()) { | 
| 471           has_non_smi = true; | 471           has_non_smi = true; | 
| 472         } | 472         } | 
| 473       } | 473       } | 
| 474     } | 474     } | 
| 475   } | 475   } | 
| 476 | 476 | 
| 477   // Set the elements. | 477   // Set the elements. | 
| 478   Handle<JSArray> js_object(Handle<JSArray>::cast(object)); | 478   Handle<JSArray> js_object(Handle<JSArray>::cast(object)); | 
| 479   isolate->factory()->SetContent(js_object, content); | 479   isolate->factory()->SetContent(js_object, content); | 
| 480 | 480 | 
| (...skipping 7762 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8243   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8243   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 
| 8244   if (!function->IsOptimizable()) return isolate->heap()->undefined_value(); | 8244   if (!function->IsOptimizable()) return isolate->heap()->undefined_value(); | 
| 8245   function->MarkForLazyRecompilation(); | 8245   function->MarkForLazyRecompilation(); | 
| 8246   return isolate->heap()->undefined_value(); | 8246   return isolate->heap()->undefined_value(); | 
| 8247 } | 8247 } | 
| 8248 | 8248 | 
| 8249 | 8249 | 
| 8250 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) { | 8250 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) { | 
| 8251   HandleScope scope(isolate); | 8251   HandleScope scope(isolate); | 
| 8252   ASSERT(args.length() == 1); | 8252   ASSERT(args.length() == 1); | 
|  | 8253   // The least significant bit (after untagging) indicates whether the | 
|  | 8254   // function is currently optimized, regardless of reason. | 
| 8253   if (!V8::UseCrankshaft()) { | 8255   if (!V8::UseCrankshaft()) { | 
| 8254     return Smi::FromInt(4);  // 4 == "never". | 8256     return Smi::FromInt(4);  // 4 == "never". | 
| 8255   } | 8257   } | 
| 8256   if (FLAG_always_opt) { | 8258   if (FLAG_always_opt) { | 
| 8257     return Smi::FromInt(3);  // 3 == "always". | 8259     return Smi::FromInt(3);  // 3 == "always". | 
| 8258   } | 8260   } | 
| 8259   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8261   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 
| 8260   return function->IsOptimized() ? Smi::FromInt(1)   // 1 == "yes". | 8262   return function->IsOptimized() ? Smi::FromInt(1)   // 1 == "yes". | 
| 8261                                  : Smi::FromInt(2);  // 2 == "no". | 8263                                  : Smi::FromInt(2);  // 2 == "no". | 
| 8262 } | 8264 } | 
| (...skipping 4943 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 13206   } else { | 13208   } else { | 
| 13207     // Handle last resort GC and make sure to allow future allocations | 13209     // Handle last resort GC and make sure to allow future allocations | 
| 13208     // to grow the heap without causing GCs (if possible). | 13210     // to grow the heap without causing GCs (if possible). | 
| 13209     isolate->counters()->gc_last_resort_from_js()->Increment(); | 13211     isolate->counters()->gc_last_resort_from_js()->Increment(); | 
| 13210     isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13212     isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 
| 13211   } | 13213   } | 
| 13212 } | 13214 } | 
| 13213 | 13215 | 
| 13214 | 13216 | 
| 13215 } }  // namespace v8::internal | 13217 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|