| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 | 125 |
| 126 | 126 |
| 127 Address HandleScope::current_limit_address() { | 127 Address HandleScope::current_limit_address() { |
| 128 return reinterpret_cast<Address>( | 128 return reinterpret_cast<Address>( |
| 129 &Isolate::Current()->handle_scope_data()->limit); | 129 &Isolate::Current()->handle_scope_data()->limit); |
| 130 } | 130 } |
| 131 | 131 |
| 132 | 132 |
| 133 Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content, | 133 Handle<FixedArray> AddKeysFromJSArray(Handle<FixedArray> content, |
| 134 Handle<JSArray> array) { | 134 Handle<JSArray> array) { |
| 135 CALL_HEAP_FUNCTION(content->GetHeap()->isolate(), | 135 CALL_HEAP_FUNCTION(content->GetIsolate(), |
| 136 content->AddKeysFromJSArray(*array), FixedArray); | 136 content->AddKeysFromJSArray(*array), FixedArray); |
| 137 } | 137 } |
| 138 | 138 |
| 139 | 139 |
| 140 Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first, | 140 Handle<FixedArray> UnionOfKeys(Handle<FixedArray> first, |
| 141 Handle<FixedArray> second) { | 141 Handle<FixedArray> second) { |
| 142 CALL_HEAP_FUNCTION(first->GetHeap()->isolate(), | 142 CALL_HEAP_FUNCTION(first->GetIsolate(), |
| 143 first->UnionOfKeys(*second), FixedArray); | 143 first->UnionOfKeys(*second), FixedArray); |
| 144 } | 144 } |
| 145 | 145 |
| 146 | 146 |
| 147 Handle<JSGlobalProxy> ReinitializeJSGlobalProxy( | 147 Handle<JSGlobalProxy> ReinitializeJSGlobalProxy( |
| 148 Handle<JSFunction> constructor, | 148 Handle<JSFunction> constructor, |
| 149 Handle<JSGlobalProxy> global) { | 149 Handle<JSGlobalProxy> global) { |
| 150 CALL_HEAP_FUNCTION( | 150 CALL_HEAP_FUNCTION( |
| 151 constructor->GetHeap()->isolate(), | 151 constructor->GetIsolate(), |
| 152 constructor->GetHeap()->ReinitializeJSGlobalProxy(*constructor, *global), | 152 constructor->GetHeap()->ReinitializeJSGlobalProxy(*constructor, *global), |
| 153 JSGlobalProxy); | 153 JSGlobalProxy); |
| 154 } | 154 } |
| 155 | 155 |
| 156 | 156 |
| 157 void SetExpectedNofProperties(Handle<JSFunction> func, int nof) { | 157 void SetExpectedNofProperties(Handle<JSFunction> func, int nof) { |
| 158 // If objects constructed from this function exist then changing | 158 // If objects constructed from this function exist then changing |
| 159 // 'estimated_nof_properties' is dangerous since the previous value might | 159 // 'estimated_nof_properties' is dangerous since the previous value might |
| 160 // have been compiled into the fast construct stub. More over, the inobject | 160 // have been compiled into the fast construct stub. More over, the inobject |
| 161 // slack tracking logic might have adjusted the previous value, so even | 161 // slack tracking logic might have adjusted the previous value, so even |
| 162 // passing the same value is risky. | 162 // passing the same value is risky. |
| 163 if (func->shared()->live_objects_may_exist()) return; | 163 if (func->shared()->live_objects_may_exist()) return; |
| 164 | 164 |
| 165 func->shared()->set_expected_nof_properties(nof); | 165 func->shared()->set_expected_nof_properties(nof); |
| 166 if (func->has_initial_map()) { | 166 if (func->has_initial_map()) { |
| 167 Handle<Map> new_initial_map = | 167 Handle<Map> new_initial_map = |
| 168 func->GetIsolate()->factory()->CopyMapDropTransitions( | 168 func->GetIsolate()->factory()->CopyMapDropTransitions( |
| 169 Handle<Map>(func->initial_map())); | 169 Handle<Map>(func->initial_map())); |
| 170 new_initial_map->set_unused_property_fields(nof); | 170 new_initial_map->set_unused_property_fields(nof); |
| 171 func->set_initial_map(*new_initial_map); | 171 func->set_initial_map(*new_initial_map); |
| 172 } | 172 } |
| 173 } | 173 } |
| 174 | 174 |
| 175 | 175 |
| 176 void SetPrototypeProperty(Handle<JSFunction> func, Handle<JSObject> value) { | 176 void SetPrototypeProperty(Handle<JSFunction> func, Handle<JSObject> value) { |
| 177 CALL_HEAP_FUNCTION_VOID(func->GetHeap()->isolate(), | 177 CALL_HEAP_FUNCTION_VOID(func->GetIsolate(), |
| 178 func->SetPrototype(*value)); | 178 func->SetPrototype(*value)); |
| 179 } | 179 } |
| 180 | 180 |
| 181 | 181 |
| 182 static int ExpectedNofPropertiesFromEstimate(int estimate) { | 182 static int ExpectedNofPropertiesFromEstimate(int estimate) { |
| 183 // If no properties are added in the constructor, they are more likely | 183 // If no properties are added in the constructor, they are more likely |
| 184 // to be added later. | 184 // to be added later. |
| 185 if (estimate == 0) estimate = 2; | 185 if (estimate == 0) estimate = 2; |
| 186 | 186 |
| 187 // We do not shrink objects that go into a snapshot (yet), so we adjust | 187 // We do not shrink objects that go into a snapshot (yet), so we adjust |
| (...skipping 12 matching lines...) Expand all Loading... |
| 200 if (shared->live_objects_may_exist()) return; | 200 if (shared->live_objects_may_exist()) return; |
| 201 | 201 |
| 202 shared->set_expected_nof_properties( | 202 shared->set_expected_nof_properties( |
| 203 ExpectedNofPropertiesFromEstimate(estimate)); | 203 ExpectedNofPropertiesFromEstimate(estimate)); |
| 204 } | 204 } |
| 205 | 205 |
| 206 | 206 |
| 207 void NormalizeProperties(Handle<JSObject> object, | 207 void NormalizeProperties(Handle<JSObject> object, |
| 208 PropertyNormalizationMode mode, | 208 PropertyNormalizationMode mode, |
| 209 int expected_additional_properties) { | 209 int expected_additional_properties) { |
| 210 CALL_HEAP_FUNCTION_VOID(object->GetHeap()->isolate(), | 210 CALL_HEAP_FUNCTION_VOID(object->GetIsolate(), |
| 211 object->NormalizeProperties( | 211 object->NormalizeProperties( |
| 212 mode, | 212 mode, |
| 213 expected_additional_properties)); | 213 expected_additional_properties)); |
| 214 } | 214 } |
| 215 | 215 |
| 216 | 216 |
| 217 void NormalizeElements(Handle<JSObject> object) { | 217 void NormalizeElements(Handle<JSObject> object) { |
| 218 CALL_HEAP_FUNCTION_VOID(object->GetHeap()->isolate(), | 218 CALL_HEAP_FUNCTION_VOID(object->GetIsolate(), |
| 219 object->NormalizeElements()); | 219 object->NormalizeElements()); |
| 220 } | 220 } |
| 221 | 221 |
| 222 | 222 |
| 223 void TransformToFastProperties(Handle<JSObject> object, | 223 void TransformToFastProperties(Handle<JSObject> object, |
| 224 int unused_property_fields) { | 224 int unused_property_fields) { |
| 225 CALL_HEAP_FUNCTION_VOID( | 225 CALL_HEAP_FUNCTION_VOID( |
| 226 object->GetHeap()->isolate(), | 226 object->GetIsolate(), |
| 227 object->TransformToFastProperties(unused_property_fields)); | 227 object->TransformToFastProperties(unused_property_fields)); |
| 228 } | 228 } |
| 229 | 229 |
| 230 | 230 |
| 231 void NumberDictionarySet(Handle<NumberDictionary> dictionary, | 231 void NumberDictionarySet(Handle<NumberDictionary> dictionary, |
| 232 uint32_t index, | 232 uint32_t index, |
| 233 Handle<Object> value, | 233 Handle<Object> value, |
| 234 PropertyDetails details) { | 234 PropertyDetails details) { |
| 235 CALL_HEAP_FUNCTION_VOID(dictionary->GetIsolate(), | 235 CALL_HEAP_FUNCTION_VOID(dictionary->GetIsolate(), |
| 236 dictionary->Set(index, *value, details)); | 236 dictionary->Set(index, *value, details)); |
| 237 } | 237 } |
| 238 | 238 |
| 239 | 239 |
| 240 void FlattenString(Handle<String> string) { | 240 void FlattenString(Handle<String> string) { |
| 241 CALL_HEAP_FUNCTION_VOID(string->GetIsolate(), string->TryFlatten()); | 241 CALL_HEAP_FUNCTION_VOID(string->GetIsolate(), string->TryFlatten()); |
| 242 } | 242 } |
| 243 | 243 |
| 244 | 244 |
| 245 Handle<String> FlattenGetString(Handle<String> string) { | 245 Handle<String> FlattenGetString(Handle<String> string) { |
| 246 CALL_HEAP_FUNCTION(string->GetIsolate(), string->TryFlatten(), String); | 246 CALL_HEAP_FUNCTION(string->GetIsolate(), string->TryFlatten(), String); |
| 247 } | 247 } |
| 248 | 248 |
| 249 | 249 |
| 250 Handle<Object> SetPrototype(Handle<JSFunction> function, | 250 Handle<Object> SetPrototype(Handle<JSFunction> function, |
| 251 Handle<Object> prototype) { | 251 Handle<Object> prototype) { |
| 252 ASSERT(function->should_have_prototype()); | 252 ASSERT(function->should_have_prototype()); |
| 253 CALL_HEAP_FUNCTION(function->GetHeap()->isolate(), | 253 CALL_HEAP_FUNCTION(function->GetIsolate(), |
| 254 Accessors::FunctionSetPrototype(*function, | 254 Accessors::FunctionSetPrototype(*function, |
| 255 *prototype, | 255 *prototype, |
| 256 NULL), | 256 NULL), |
| 257 Object); | 257 Object); |
| 258 } | 258 } |
| 259 | 259 |
| 260 | 260 |
| 261 Handle<Object> SetProperty(Handle<JSObject> object, | 261 Handle<Object> SetProperty(Handle<JSObject> object, |
| 262 Handle<String> key, | 262 Handle<String> key, |
| 263 Handle<Object> value, | 263 Handle<Object> value, |
| 264 PropertyAttributes attributes, | 264 PropertyAttributes attributes, |
| 265 StrictModeFlag strict_mode) { | 265 StrictModeFlag strict_mode) { |
| 266 CALL_HEAP_FUNCTION(object->GetHeap()->isolate(), | 266 CALL_HEAP_FUNCTION(object->GetIsolate(), |
| 267 object->SetProperty(*key, *value, attributes, strict_mode), | 267 object->SetProperty(*key, *value, attributes, strict_mode), |
| 268 Object); | 268 Object); |
| 269 } | 269 } |
| 270 | 270 |
| 271 | 271 |
| 272 Handle<Object> SetProperty(Handle<Object> object, | 272 Handle<Object> SetProperty(Handle<Object> object, |
| 273 Handle<Object> key, | 273 Handle<Object> key, |
| 274 Handle<Object> value, | 274 Handle<Object> value, |
| 275 PropertyAttributes attributes, | 275 PropertyAttributes attributes, |
| 276 StrictModeFlag strict_mode) { | 276 StrictModeFlag strict_mode) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 object->GetIsolate(), | 324 object->GetIsolate(), |
| 325 object->SetLocalPropertyIgnoreAttributes(*key, *value, attributes), | 325 object->SetLocalPropertyIgnoreAttributes(*key, *value, attributes), |
| 326 Object); | 326 Object); |
| 327 } | 327 } |
| 328 | 328 |
| 329 | 329 |
| 330 void SetLocalPropertyNoThrow(Handle<JSObject> object, | 330 void SetLocalPropertyNoThrow(Handle<JSObject> object, |
| 331 Handle<String> key, | 331 Handle<String> key, |
| 332 Handle<Object> value, | 332 Handle<Object> value, |
| 333 PropertyAttributes attributes) { | 333 PropertyAttributes attributes) { |
| 334 ASSERT(!object->GetIsolate()->has_pending_exception()); | 334 Isolate* isolate = object->GetIsolate(); |
| 335 ASSERT(!isolate->has_pending_exception()); |
| 335 CHECK(!SetLocalPropertyIgnoreAttributes( | 336 CHECK(!SetLocalPropertyIgnoreAttributes( |
| 336 object, key, value, attributes).is_null()); | 337 object, key, value, attributes).is_null()); |
| 337 CHECK(!object->GetIsolate()->has_pending_exception()); | 338 CHECK(!isolate->has_pending_exception()); |
| 338 } | 339 } |
| 339 | 340 |
| 340 | 341 |
| 341 Handle<Object> SetPropertyWithInterceptor(Handle<JSObject> object, | 342 Handle<Object> SetPropertyWithInterceptor(Handle<JSObject> object, |
| 342 Handle<String> key, | 343 Handle<String> key, |
| 343 Handle<Object> value, | 344 Handle<Object> value, |
| 344 PropertyAttributes attributes, | 345 PropertyAttributes attributes, |
| 345 StrictModeFlag strict_mode) { | 346 StrictModeFlag strict_mode) { |
| 346 CALL_HEAP_FUNCTION(object->GetIsolate(), | 347 CALL_HEAP_FUNCTION(object->GetIsolate(), |
| 347 object->SetPropertyWithInterceptor(*key, | 348 object->SetPropertyWithInterceptor(*key, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 Handle<Object> PreventExtensions(Handle<JSObject> object) { | 405 Handle<Object> PreventExtensions(Handle<JSObject> object) { |
| 405 CALL_HEAP_FUNCTION(object->GetIsolate(), object->PreventExtensions(), Object); | 406 CALL_HEAP_FUNCTION(object->GetIsolate(), object->PreventExtensions(), Object); |
| 406 } | 407 } |
| 407 | 408 |
| 408 | 409 |
| 409 Handle<Object> GetHiddenProperties(Handle<JSObject> obj, | 410 Handle<Object> GetHiddenProperties(Handle<JSObject> obj, |
| 410 bool create_if_needed) { | 411 bool create_if_needed) { |
| 411 Isolate* isolate = obj->GetIsolate(); | 412 Isolate* isolate = obj->GetIsolate(); |
| 412 Object* holder = obj->BypassGlobalProxy(); | 413 Object* holder = obj->BypassGlobalProxy(); |
| 413 if (holder->IsUndefined()) return isolate->factory()->undefined_value(); | 414 if (holder->IsUndefined()) return isolate->factory()->undefined_value(); |
| 414 obj = Handle<JSObject>(JSObject::cast(holder)); | 415 obj = Handle<JSObject>(JSObject::cast(holder), isolate); |
| 415 | 416 |
| 416 if (obj->HasFastProperties()) { | 417 if (obj->HasFastProperties()) { |
| 417 // If the object has fast properties, check whether the first slot | 418 // If the object has fast properties, check whether the first slot |
| 418 // in the descriptor array matches the hidden symbol. Since the | 419 // in the descriptor array matches the hidden symbol. Since the |
| 419 // hidden symbols hash code is zero (and no other string has hash | 420 // hidden symbols hash code is zero (and no other string has hash |
| 420 // code zero) it will always occupy the first entry if present. | 421 // code zero) it will always occupy the first entry if present. |
| 421 DescriptorArray* descriptors = obj->map()->instance_descriptors(); | 422 DescriptorArray* descriptors = obj->map()->instance_descriptors(); |
| 422 if ((descriptors->number_of_descriptors() > 0) && | 423 if ((descriptors->number_of_descriptors() > 0) && |
| 423 (descriptors->GetKey(0) == isolate->heap()->hidden_symbol()) && | 424 (descriptors->GetKey(0) == isolate->heap()->hidden_symbol()) && |
| 424 descriptors->IsProperty(0)) { | 425 descriptors->IsProperty(0)) { |
| 425 ASSERT(descriptors->GetType(0) == FIELD); | 426 ASSERT(descriptors->GetType(0) == FIELD); |
| 426 return Handle<Object>(obj->FastPropertyAt(descriptors->GetFieldIndex(0))); | 427 return Handle<Object>(obj->FastPropertyAt(descriptors->GetFieldIndex(0)), |
| 428 isolate); |
| 427 } | 429 } |
| 428 } | 430 } |
| 429 | 431 |
| 430 // Only attempt to find the hidden properties in the local object and not | 432 // Only attempt to find the hidden properties in the local object and not |
| 431 // in the prototype chain. Note that HasLocalProperty() can cause a GC in | 433 // in the prototype chain. Note that HasLocalProperty() can cause a GC in |
| 432 // the general case in the presence of interceptors. | 434 // the general case in the presence of interceptors. |
| 433 if (!obj->HasHiddenPropertiesObject()) { | 435 if (!obj->HasHiddenPropertiesObject()) { |
| 434 // Hidden properties object not found. Allocate a new hidden properties | 436 // Hidden properties object not found. Allocate a new hidden properties |
| 435 // object if requested. Otherwise return the undefined value. | 437 // object if requested. Otherwise return the undefined value. |
| 436 if (create_if_needed) { | 438 if (create_if_needed) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 #ifdef ENABLE_HEAP_PROTECTION | 531 #ifdef ENABLE_HEAP_PROTECTION |
| 530 // Weak reference callbacks are called as if from outside V8. We | 532 // Weak reference callbacks are called as if from outside V8. We |
| 531 // need to reeenter to unprotect the heap. | 533 // need to reeenter to unprotect the heap. |
| 532 VMState state(OTHER); | 534 VMState state(OTHER); |
| 533 #endif | 535 #endif |
| 534 Handle<Object> cache = Utils::OpenHandle(*handle); | 536 Handle<Object> cache = Utils::OpenHandle(*handle); |
| 535 JSValue* wrapper = JSValue::cast(*cache); | 537 JSValue* wrapper = JSValue::cast(*cache); |
| 536 Proxy* proxy = Script::cast(wrapper->value())->wrapper(); | 538 Proxy* proxy = Script::cast(wrapper->value())->wrapper(); |
| 537 ASSERT(proxy->proxy() == reinterpret_cast<Address>(cache.location())); | 539 ASSERT(proxy->proxy() == reinterpret_cast<Address>(cache.location())); |
| 538 proxy->set_proxy(0); | 540 proxy->set_proxy(0); |
| 539 Isolate::Current()->global_handles()->Destroy(cache.location()); | 541 Isolate* isolate = Isolate::Current(); |
| 540 COUNTERS->script_wrappers()->Decrement(); | 542 isolate->global_handles()->Destroy(cache.location()); |
| 543 isolate->counters()->script_wrappers()->Decrement(); |
| 541 } | 544 } |
| 542 | 545 |
| 543 | 546 |
| 544 Handle<JSValue> GetScriptWrapper(Handle<Script> script) { | 547 Handle<JSValue> GetScriptWrapper(Handle<Script> script) { |
| 545 Isolate* isolate = Isolate::Current(); | |
| 546 if (script->wrapper()->proxy() != NULL) { | 548 if (script->wrapper()->proxy() != NULL) { |
| 547 // Return the script wrapper directly from the cache. | 549 // Return the script wrapper directly from the cache. |
| 548 return Handle<JSValue>( | 550 return Handle<JSValue>( |
| 549 reinterpret_cast<JSValue**>(script->wrapper()->proxy())); | 551 reinterpret_cast<JSValue**>(script->wrapper()->proxy())); |
| 550 } | 552 } |
| 551 | 553 Isolate* isolate = Isolate::Current(); |
| 552 // Construct a new script wrapper. | 554 // Construct a new script wrapper. |
| 553 isolate->counters()->script_wrappers()->Increment(); | 555 isolate->counters()->script_wrappers()->Increment(); |
| 554 Handle<JSFunction> constructor = isolate->script_function(); | 556 Handle<JSFunction> constructor = isolate->script_function(); |
| 555 Handle<JSValue> result = | 557 Handle<JSValue> result = |
| 556 Handle<JSValue>::cast(isolate->factory()->NewJSObject(constructor)); | 558 Handle<JSValue>::cast(isolate->factory()->NewJSObject(constructor)); |
| 557 result->set_value(*script); | 559 result->set_value(*script); |
| 558 | 560 |
| 559 // Create a new weak global handle and use it to cache the wrapper | 561 // Create a new weak global handle and use it to cache the wrapper |
| 560 // for future use. The cache will automatically be cleared by the | 562 // for future use. The cache will automatically be cleared by the |
| 561 // garbage collector when it is not used anymore. | 563 // garbage collector when it is not used anymore. |
| 562 Handle<Object> handle = isolate->global_handles()->Create(*result); | 564 Handle<Object> handle = isolate->global_handles()->Create(*result); |
| 563 isolate->global_handles()->MakeWeak(handle.location(), NULL, | 565 isolate->global_handles()->MakeWeak(handle.location(), NULL, |
| 564 &ClearWrapperCache); | 566 &ClearWrapperCache); |
| 565 script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location())); | 567 script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location())); |
| 566 return result; | 568 return result; |
| 567 } | 569 } |
| 568 | 570 |
| 569 | 571 |
| 570 // Init line_ends array with code positions of line ends inside script | 572 // Init line_ends array with code positions of line ends inside script |
| 571 // source. | 573 // source. |
| 572 void InitScriptLineEnds(Handle<Script> script) { | 574 void InitScriptLineEnds(Handle<Script> script) { |
| 573 if (!script->line_ends()->IsUndefined()) return; | 575 if (!script->line_ends()->IsUndefined()) return; |
| 574 | 576 |
| 577 Isolate* isolate = script->GetIsolate(); |
| 578 |
| 575 if (!script->source()->IsString()) { | 579 if (!script->source()->IsString()) { |
| 576 ASSERT(script->source()->IsUndefined()); | 580 ASSERT(script->source()->IsUndefined()); |
| 577 Handle<FixedArray> empty = | 581 Handle<FixedArray> empty = isolate->factory()->NewFixedArray(0); |
| 578 script->GetIsolate()->factory()->NewFixedArray(0); | |
| 579 script->set_line_ends(*empty); | 582 script->set_line_ends(*empty); |
| 580 ASSERT(script->line_ends()->IsFixedArray()); | 583 ASSERT(script->line_ends()->IsFixedArray()); |
| 581 return; | 584 return; |
| 582 } | 585 } |
| 583 | 586 |
| 584 Handle<String> src(String::cast(script->source())); | 587 Handle<String> src(String::cast(script->source()), isolate); |
| 585 | 588 |
| 586 Handle<FixedArray> array = CalculateLineEnds(src, true); | 589 Handle<FixedArray> array = CalculateLineEnds(src, true); |
| 587 | 590 |
| 588 if (*array != HEAP->empty_fixed_array()) { | 591 if (*array != isolate->heap()->empty_fixed_array()) { |
| 589 array->set_map(HEAP->fixed_cow_array_map()); | 592 array->set_map(isolate->heap()->fixed_cow_array_map()); |
| 590 } | 593 } |
| 591 | 594 |
| 592 script->set_line_ends(*array); | 595 script->set_line_ends(*array); |
| 593 ASSERT(script->line_ends()->IsFixedArray()); | 596 ASSERT(script->line_ends()->IsFixedArray()); |
| 594 } | 597 } |
| 595 | 598 |
| 596 | 599 |
| 597 template <typename SourceChar> | 600 template <typename SourceChar> |
| 598 static void CalculateLineEnds(Isolate* isolate, | 601 static void CalculateLineEnds(Isolate* isolate, |
| 599 List<int>* line_ends, | 602 List<int>* line_ends, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 618 } | 621 } |
| 619 | 622 |
| 620 | 623 |
| 621 Handle<FixedArray> CalculateLineEnds(Handle<String> src, | 624 Handle<FixedArray> CalculateLineEnds(Handle<String> src, |
| 622 bool with_last_line) { | 625 bool with_last_line) { |
| 623 src = FlattenGetString(src); | 626 src = FlattenGetString(src); |
| 624 // Rough estimate of line count based on a roughly estimated average | 627 // Rough estimate of line count based on a roughly estimated average |
| 625 // length of (unpacked) code. | 628 // length of (unpacked) code. |
| 626 int line_count_estimate = src->length() >> 4; | 629 int line_count_estimate = src->length() >> 4; |
| 627 List<int> line_ends(line_count_estimate); | 630 List<int> line_ends(line_count_estimate); |
| 631 Isolate* isolate = src->GetIsolate(); |
| 628 { | 632 { |
| 629 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid. | 633 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid. |
| 630 Isolate* isolate = src->GetIsolate(); | |
| 631 // Dispatch on type of strings. | 634 // Dispatch on type of strings. |
| 632 if (src->IsAsciiRepresentation()) { | 635 if (src->IsAsciiRepresentation()) { |
| 633 CalculateLineEnds(isolate, | 636 CalculateLineEnds(isolate, |
| 634 &line_ends, | 637 &line_ends, |
| 635 src->ToAsciiVector(), | 638 src->ToAsciiVector(), |
| 636 with_last_line); | 639 with_last_line); |
| 637 } else { | 640 } else { |
| 638 CalculateLineEnds(isolate, | 641 CalculateLineEnds(isolate, |
| 639 &line_ends, | 642 &line_ends, |
| 640 src->ToUC16Vector(), | 643 src->ToUC16Vector(), |
| 641 with_last_line); | 644 with_last_line); |
| 642 } | 645 } |
| 643 } | 646 } |
| 644 int line_count = line_ends.length(); | 647 int line_count = line_ends.length(); |
| 645 Handle<FixedArray> array = FACTORY->NewFixedArray(line_count); | 648 Handle<FixedArray> array = isolate->factory()->NewFixedArray(line_count); |
| 646 for (int i = 0; i < line_count; i++) { | 649 for (int i = 0; i < line_count; i++) { |
| 647 array->set(i, Smi::FromInt(line_ends[i])); | 650 array->set(i, Smi::FromInt(line_ends[i])); |
| 648 } | 651 } |
| 649 return array; | 652 return array; |
| 650 } | 653 } |
| 651 | 654 |
| 652 | 655 |
| 653 // Convert code position into line number. | 656 // Convert code position into line number. |
| 654 int GetScriptLineNumber(Handle<Script> script, int code_pos) { | 657 int GetScriptLineNumber(Handle<Script> script, int code_pos) { |
| 655 InitScriptLineEnds(script); | 658 InitScriptLineEnds(script); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 } | 760 } |
| 758 return true; | 761 return true; |
| 759 } | 762 } |
| 760 | 763 |
| 761 | 764 |
| 762 Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, | 765 Handle<FixedArray> GetKeysInFixedArrayFor(Handle<JSObject> object, |
| 763 KeyCollectionType type) { | 766 KeyCollectionType type) { |
| 764 USE(ContainsOnlyValidKeys); | 767 USE(ContainsOnlyValidKeys); |
| 765 Isolate* isolate = object->GetIsolate(); | 768 Isolate* isolate = object->GetIsolate(); |
| 766 Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); | 769 Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); |
| 767 Handle<JSObject> arguments_boilerplate = | 770 Handle<JSObject> arguments_boilerplate = Handle<JSObject>( |
| 768 Handle<JSObject>( | 771 isolate->context()->global_context()->arguments_boilerplate(), |
| 769 isolate->context()->global_context()->arguments_boilerplate()); | 772 isolate); |
| 770 Handle<JSFunction> arguments_function = | 773 Handle<JSFunction> arguments_function = Handle<JSFunction>( |
| 771 Handle<JSFunction>( | 774 JSFunction::cast(arguments_boilerplate->map()->constructor()), |
| 772 JSFunction::cast(arguments_boilerplate->map()->constructor())); | 775 isolate); |
| 773 | 776 |
| 774 // Only collect keys if access is permitted. | 777 // Only collect keys if access is permitted. |
| 775 for (Handle<Object> p = object; | 778 for (Handle<Object> p = object; |
| 776 *p != isolate->heap()->null_value(); | 779 *p != isolate->heap()->null_value(); |
| 777 p = Handle<Object>(p->GetPrototype())) { | 780 p = Handle<Object>(p->GetPrototype(), isolate)) { |
| 778 Handle<JSObject> current(JSObject::cast(*p)); | 781 Handle<JSObject> current(JSObject::cast(*p), isolate); |
| 779 | 782 |
| 780 // Check access rights if required. | 783 // Check access rights if required. |
| 781 if (current->IsAccessCheckNeeded() && | 784 if (current->IsAccessCheckNeeded() && |
| 782 !isolate->MayNamedAccess(*current, | 785 !isolate->MayNamedAccess(*current, |
| 783 isolate->heap()->undefined_value(), | 786 isolate->heap()->undefined_value(), |
| 784 v8::ACCESS_KEYS)) { | 787 v8::ACCESS_KEYS)) { |
| 785 isolate->ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); | 788 isolate->ReportFailedAccessCheck(*current, v8::ACCESS_KEYS); |
| 786 break; | 789 break; |
| 787 } | 790 } |
| 788 | 791 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 | 854 |
| 852 | 855 |
| 853 Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, | 856 Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
| 854 bool cache_result) { | 857 bool cache_result) { |
| 855 int index = 0; | 858 int index = 0; |
| 856 Isolate* isolate = object->GetIsolate(); | 859 Isolate* isolate = object->GetIsolate(); |
| 857 if (object->HasFastProperties()) { | 860 if (object->HasFastProperties()) { |
| 858 if (object->map()->instance_descriptors()->HasEnumCache()) { | 861 if (object->map()->instance_descriptors()->HasEnumCache()) { |
| 859 isolate->counters()->enum_cache_hits()->Increment(); | 862 isolate->counters()->enum_cache_hits()->Increment(); |
| 860 DescriptorArray* desc = object->map()->instance_descriptors(); | 863 DescriptorArray* desc = object->map()->instance_descriptors(); |
| 861 return Handle<FixedArray>(FixedArray::cast(desc->GetEnumCache())); | 864 return Handle<FixedArray>(FixedArray::cast(desc->GetEnumCache()), |
| 865 isolate); |
| 862 } | 866 } |
| 863 isolate->counters()->enum_cache_misses()->Increment(); | 867 isolate->counters()->enum_cache_misses()->Increment(); |
| 864 int num_enum = object->NumberOfEnumProperties(); | 868 int num_enum = object->NumberOfEnumProperties(); |
| 865 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); | 869 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); |
| 866 Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); | 870 Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); |
| 867 Handle<DescriptorArray> descs = | 871 Handle<DescriptorArray> descs = |
| 868 Handle<DescriptorArray>(object->map()->instance_descriptors()); | 872 Handle<DescriptorArray>(object->map()->instance_descriptors(), isolate); |
| 869 for (int i = 0; i < descs->number_of_descriptors(); i++) { | 873 for (int i = 0; i < descs->number_of_descriptors(); i++) { |
| 870 if (descs->IsProperty(i) && !descs->IsDontEnum(i)) { | 874 if (descs->IsProperty(i) && !descs->IsDontEnum(i)) { |
| 871 (*storage)->set(index, descs->GetKey(i)); | 875 (*storage)->set(index, descs->GetKey(i)); |
| 872 PropertyDetails details(descs->GetDetails(i)); | 876 PropertyDetails details(descs->GetDetails(i)); |
| 873 (*sort_array)->set(index, Smi::FromInt(details.index())); | 877 (*sort_array)->set(index, Smi::FromInt(details.index())); |
| 874 index++; | 878 index++; |
| 875 } | 879 } |
| 876 } | 880 } |
| 877 (*storage)->SortPairs(*sort_array, sort_array->length()); | 881 (*storage)->SortPairs(*sort_array, sort_array->length()); |
| 878 if (cache_result) { | 882 if (cache_result) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 | 956 |
| 953 bool CompileOptimized(Handle<JSFunction> function, | 957 bool CompileOptimized(Handle<JSFunction> function, |
| 954 int osr_ast_id, | 958 int osr_ast_id, |
| 955 ClearExceptionFlag flag) { | 959 ClearExceptionFlag flag) { |
| 956 CompilationInfo info(function); | 960 CompilationInfo info(function); |
| 957 info.SetOptimizing(osr_ast_id); | 961 info.SetOptimizing(osr_ast_id); |
| 958 return CompileLazyHelper(&info, flag); | 962 return CompileLazyHelper(&info, flag); |
| 959 } | 963 } |
| 960 | 964 |
| 961 } } // namespace v8::internal | 965 } } // namespace v8::internal |
| OLD | NEW |