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