Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 | 179 |
| 180 | 180 |
| 181 void TransformToFastProperties(Handle<JSObject> object, | 181 void TransformToFastProperties(Handle<JSObject> object, |
| 182 int unused_property_fields) { | 182 int unused_property_fields) { |
| 183 CALL_HEAP_FUNCTION_VOID( | 183 CALL_HEAP_FUNCTION_VOID( |
| 184 object->TransformToFastProperties(unused_property_fields)); | 184 object->TransformToFastProperties(unused_property_fields)); |
| 185 } | 185 } |
| 186 | 186 |
| 187 | 187 |
| 188 void FlattenString(Handle<String> string) { | 188 void FlattenString(Handle<String> string) { |
| 189 StringShape shape(*string); | 189 CALL_HEAP_FUNCTION_VOID(string->TryFlattenIfNotFlat(StringShape(*string))); |
|
Mads Ager (chromium)
2009/03/10 19:26:58
I think this change makes the code much clearer (a
| |
| 190 if (string->IsFlat(shape)) return; | |
| 191 CALL_HEAP_FUNCTION_VOID(string->TryFlatten(shape)); | |
| 192 ASSERT(string->IsFlat(StringShape(*string))); | 190 ASSERT(string->IsFlat(StringShape(*string))); |
| 193 } | 191 } |
| 194 | 192 |
| 195 | 193 |
| 196 Handle<Object> SetPrototype(Handle<JSFunction> function, | 194 Handle<Object> SetPrototype(Handle<JSFunction> function, |
| 197 Handle<Object> prototype) { | 195 Handle<Object> prototype) { |
| 198 CALL_HEAP_FUNCTION(Accessors::FunctionSetPrototype(*function, | 196 CALL_HEAP_FUNCTION(Accessors::FunctionSetPrototype(*function, |
| 199 *prototype, | 197 *prototype, |
| 200 NULL), | 198 NULL), |
| 201 Object); | 199 Object); |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 // Create a new weak global handle and use it to cache the wrapper | 334 // Create a new weak global handle and use it to cache the wrapper |
| 337 // for future use. The cache will automatically be cleared by the | 335 // for future use. The cache will automatically be cleared by the |
| 338 // garbage collector when it is not used anymore. | 336 // garbage collector when it is not used anymore. |
| 339 Handle<Object> handle = GlobalHandles::Create(*result); | 337 Handle<Object> handle = GlobalHandles::Create(*result); |
| 340 GlobalHandles::MakeWeak(handle.location(), NULL, &ClearWrapperCache); | 338 GlobalHandles::MakeWeak(handle.location(), NULL, &ClearWrapperCache); |
| 341 script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location())); | 339 script->wrapper()->set_proxy(reinterpret_cast<Address>(handle.location())); |
| 342 return result; | 340 return result; |
| 343 } | 341 } |
| 344 | 342 |
| 345 | 343 |
| 344 // Init line_ends array with code positions of line ends inside script | |
| 345 // source. | |
| 346 void InitScriptLineEnds(Handle<Script> script) { | |
| 347 if (!script->line_ends()->IsUndefined()) return; | |
| 348 | |
| 349 if (!script->source()->IsString()) { | |
| 350 ASSERT(script->source()->IsUndefined()); | |
| 351 script->set_line_ends(*(Factory::NewJSArray(0))); | |
| 352 ASSERT(script->line_ends()->IsJSArray()); | |
| 353 return; | |
| 354 } | |
| 355 | |
| 356 Handle<String> src(String::cast(script->source())); | |
| 357 const int src_len = src->length(); | |
| 358 Handle<String> new_line = Factory::NewStringFromAscii(CStrVector("\n")); | |
| 359 | |
| 360 // Pass 1: Identify line count. | |
| 361 int line_count = 0; | |
| 362 int position = 0; | |
| 363 while (position != -1 && position < src_len) { | |
| 364 position = Runtime::StringMatch(src, new_line, position); | |
| 365 if (position != -1) { | |
| 366 position++; | |
| 367 } | |
| 368 // Even if the last line misses a line end, it is counted. | |
| 369 line_count++; | |
| 370 } | |
| 371 | |
| 372 // Pass 2: Fill in line ends positions | |
| 373 Handle<FixedArray> array = Factory::NewFixedArray(line_count); | |
| 374 int array_index = 0; | |
| 375 position = 0; | |
| 376 while (position != -1 && position < src_len) { | |
| 377 position = Runtime::StringMatch(src, new_line, position); | |
| 378 // If the script does not end with a line ending add the final end | |
| 379 // position as just past the last line ending. | |
| 380 array->set(array_index++, | |
| 381 Smi::FromInt(position != -1 ? position++ : src_len)); | |
| 382 } | |
| 383 ASSERT(array_index == line_count); | |
| 384 | |
| 385 Handle<JSArray> object = Factory::NewJSArrayWithElements(array); | |
| 386 script->set_line_ends(*object); | |
| 387 ASSERT(script->line_ends()->IsJSArray()); | |
| 388 } | |
| 389 | |
| 390 | |
| 391 // Convert code position into line number. | |
| 392 int GetScriptLineNumber(Handle<Script> script, int code_pos) { | |
| 393 InitScriptLineEnds(script); | |
| 394 AssertNoAllocation no_allocation; | |
| 395 JSArray* line_ends_array = JSArray::cast(script->line_ends()); | |
| 396 const int line_ends_len = (Smi::cast(line_ends_array->length()))->value(); | |
| 397 | |
| 398 int line = -1; | |
| 399 if (line_ends_len > 0 && | |
| 400 code_pos <= (Smi::cast(line_ends_array->GetElement(0)))->value()) { | |
| 401 line = 0; | |
| 402 } else { | |
| 403 for (int i = 1; i < line_ends_len; ++i) { | |
| 404 if ((Smi::cast(line_ends_array->GetElement(i - 1)))->value() < code_pos && | |
| 405 code_pos <= (Smi::cast(line_ends_array->GetElement(i)))->value()) { | |
| 406 line = i; | |
| 407 break; | |
| 408 } | |
| 409 } | |
| 410 } | |
| 411 | |
| 412 return line != -1 ? line + script->line_offset()->value() : line; | |
| 413 } | |
| 414 | |
| 415 | |
| 346 // Compute the property keys from the interceptor. | 416 // Compute the property keys from the interceptor. |
| 347 v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver, | 417 v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSObject> receiver, |
| 348 Handle<JSObject> object) { | 418 Handle<JSObject> object) { |
| 349 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 419 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
| 350 Handle<Object> data(interceptor->data()); | 420 Handle<Object> data(interceptor->data()); |
| 351 v8::AccessorInfo info( | 421 v8::AccessorInfo info( |
| 352 v8::Utils::ToLocal(receiver), | 422 v8::Utils::ToLocal(receiver), |
| 353 v8::Utils::ToLocal(data), | 423 v8::Utils::ToLocal(data), |
| 354 v8::Utils::ToLocal(object)); | 424 v8::Utils::ToLocal(object)); |
| 355 v8::Handle<v8::Array> result; | 425 v8::Handle<v8::Array> result; |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 603 Handle<Context> compile_context, | 673 Handle<Context> compile_context, |
| 604 Handle<Context> function_context) { | 674 Handle<Context> function_context) { |
| 605 Handle<FixedArray> arr = Factory::NewFixedArray(3); | 675 Handle<FixedArray> arr = Factory::NewFixedArray(3); |
| 606 arr->set(0, Smi::FromInt(index)); | 676 arr->set(0, Smi::FromInt(index)); |
| 607 arr->set(1, *compile_context); // Compile in this context | 677 arr->set(1, *compile_context); // Compile in this context |
| 608 arr->set(2, *function_context); // Set function context to this | 678 arr->set(2, *function_context); // Set function context to this |
| 609 fun->shared()->set_lazy_load_data(*arr); | 679 fun->shared()->set_lazy_load_data(*arr); |
| 610 } | 680 } |
| 611 | 681 |
| 612 } } // namespace v8::internal | 682 } } // namespace v8::internal |
| OLD | NEW |