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 3539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3550 return value->SubString(start, end); | 3550 return value->SubString(start, end); |
3551 } | 3551 } |
3552 | 3552 |
3553 | 3553 |
3554 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) { | 3554 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) { |
3555 ASSERT_EQ(3, args.length()); | 3555 ASSERT_EQ(3, args.length()); |
3556 | 3556 |
3557 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); | 3557 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
3558 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); | 3558 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); |
3559 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); | 3559 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); |
3560 HandleScope handles; | 3560 HandleScope handles(isolate); |
3561 | 3561 |
3562 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); | 3562 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); |
3563 if (global_cache.HasException()) return Failure::Exception(); | 3563 if (global_cache.HasException()) return Failure::Exception(); |
3564 | 3564 |
3565 int capture_count = regexp->CaptureCount(); | 3565 int capture_count = regexp->CaptureCount(); |
3566 | 3566 |
3567 Zone* zone = isolate->runtime_zone(); | 3567 Zone* zone = isolate->runtime_zone(); |
3568 ZoneScope zone_space(zone, DELETE_ON_EXIT); | 3568 ZoneScope zone_space(zone, DELETE_ON_EXIT); |
3569 ZoneList<int> offsets(8, zone); | 3569 ZoneList<int> offsets(8, zone); |
3570 | 3570 |
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4448 } | 4448 } |
4449 | 4449 |
4450 | 4450 |
4451 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { | 4451 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { |
4452 RUNTIME_ASSERT(args.length() == 5); | 4452 RUNTIME_ASSERT(args.length() == 5); |
4453 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 4453 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
4454 CONVERT_SMI_ARG_CHECKED(store_index, 1); | 4454 CONVERT_SMI_ARG_CHECKED(store_index, 1); |
4455 Handle<Object> value = args.at<Object>(2); | 4455 Handle<Object> value = args.at<Object>(2); |
4456 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3); | 4456 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3); |
4457 CONVERT_SMI_ARG_CHECKED(literal_index, 4); | 4457 CONVERT_SMI_ARG_CHECKED(literal_index, 4); |
4458 HandleScope scope; | 4458 HandleScope scope(isolate); |
4459 | 4459 |
4460 Object* raw_boilerplate_object = literals->get(literal_index); | 4460 Object* raw_boilerplate_object = literals->get(literal_index); |
4461 Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object)); | 4461 Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object)); |
4462 ElementsKind elements_kind = object->GetElementsKind(); | 4462 ElementsKind elements_kind = object->GetElementsKind(); |
4463 ASSERT(IsFastElementsKind(elements_kind)); | 4463 ASSERT(IsFastElementsKind(elements_kind)); |
4464 // Smis should never trigger transitions. | 4464 // Smis should never trigger transitions. |
4465 ASSERT(!value->IsSmi()); | 4465 ASSERT(!value->IsSmi()); |
4466 | 4466 |
4467 if (value->IsNumber()) { | 4467 if (value->IsNumber()) { |
4468 ASSERT(IsFastSmiElementsKind(elements_kind)); | 4468 ASSERT(IsFastSmiElementsKind(elements_kind)); |
(...skipping 1680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6149 ASSERT(result->HasFastObjectElements()); | 6149 ASSERT(result->HasFastObjectElements()); |
6150 | 6150 |
6151 if (part_count == 1 && indices.at(0) == subject_length) { | 6151 if (part_count == 1 && indices.at(0) == subject_length) { |
6152 FixedArray::cast(result->elements())->set(0, *subject); | 6152 FixedArray::cast(result->elements())->set(0, *subject); |
6153 return *result; | 6153 return *result; |
6154 } | 6154 } |
6155 | 6155 |
6156 Handle<FixedArray> elements(FixedArray::cast(result->elements())); | 6156 Handle<FixedArray> elements(FixedArray::cast(result->elements())); |
6157 int part_start = 0; | 6157 int part_start = 0; |
6158 for (int i = 0; i < part_count; i++) { | 6158 for (int i = 0; i < part_count; i++) { |
6159 HandleScope local_loop_handle; | 6159 HandleScope local_loop_handle(isolate); |
6160 int part_end = indices.at(i); | 6160 int part_end = indices.at(i); |
6161 Handle<String> substring = | 6161 Handle<String> substring = |
6162 isolate->factory()->NewProperSubString(subject, part_start, part_end); | 6162 isolate->factory()->NewProperSubString(subject, part_start, part_end); |
6163 elements->set(i, *substring); | 6163 elements->set(i, *substring); |
6164 part_start = part_end + pattern_length; | 6164 part_start = part_end + pattern_length; |
6165 } | 6165 } |
6166 | 6166 |
6167 if (limit == 0xffffffffu) { | 6167 if (limit == 0xffffffffu) { |
6168 if (result->HasFastObjectElements()) { | 6168 if (result->HasFastObjectElements()) { |
6169 RegExpResultsCache::Enter(isolate->heap(), | 6169 RegExpResultsCache::Enter(isolate->heap(), |
(...skipping 1392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7562 context, | 7562 context, |
7563 pretenure_flag); | 7563 pretenure_flag); |
7564 return *result; | 7564 return *result; |
7565 } | 7565 } |
7566 | 7566 |
7567 | 7567 |
7568 // Find the arguments of the JavaScript function invocation that called | 7568 // Find the arguments of the JavaScript function invocation that called |
7569 // into C++ code. Collect these in a newly allocated array of handles (possibly | 7569 // into C++ code. Collect these in a newly allocated array of handles (possibly |
7570 // prefixed by a number of empty handles). | 7570 // prefixed by a number of empty handles). |
7571 static SmartArrayPointer<Handle<Object> > GetCallerArguments( | 7571 static SmartArrayPointer<Handle<Object> > GetCallerArguments( |
| 7572 Isolate* isolate, |
7572 int prefix_argc, | 7573 int prefix_argc, |
7573 int* total_argc) { | 7574 int* total_argc) { |
7574 // Find frame containing arguments passed to the caller. | 7575 // Find frame containing arguments passed to the caller. |
7575 JavaScriptFrameIterator it; | 7576 JavaScriptFrameIterator it(isolate); |
7576 JavaScriptFrame* frame = it.frame(); | 7577 JavaScriptFrame* frame = it.frame(); |
7577 List<JSFunction*> functions(2); | 7578 List<JSFunction*> functions(2); |
7578 frame->GetFunctions(&functions); | 7579 frame->GetFunctions(&functions); |
7579 if (functions.length() > 1) { | 7580 if (functions.length() > 1) { |
7580 int inlined_jsframe_index = functions.length() - 1; | 7581 int inlined_jsframe_index = functions.length() - 1; |
7581 JSFunction* inlined_function = functions[inlined_jsframe_index]; | 7582 JSFunction* inlined_function = functions[inlined_jsframe_index]; |
7582 Vector<SlotRef> args_slots = | 7583 Vector<SlotRef> args_slots = |
7583 SlotRef::ComputeSlotMappingForArguments( | 7584 SlotRef::ComputeSlotMappingForArguments( |
7584 frame, | 7585 frame, |
7585 inlined_jsframe_index, | 7586 inlined_jsframe_index, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7619 HandleScope scope(isolate); | 7620 HandleScope scope(isolate); |
7620 ASSERT(args.length() == 4); | 7621 ASSERT(args.length() == 4); |
7621 CONVERT_ARG_HANDLE_CHECKED(JSFunction, bound_function, 0); | 7622 CONVERT_ARG_HANDLE_CHECKED(JSFunction, bound_function, 0); |
7622 RUNTIME_ASSERT(args[3]->IsNumber()); | 7623 RUNTIME_ASSERT(args[3]->IsNumber()); |
7623 Handle<Object> bindee = args.at<Object>(1); | 7624 Handle<Object> bindee = args.at<Object>(1); |
7624 | 7625 |
7625 // TODO(lrn): Create bound function in C++ code from premade shared info. | 7626 // TODO(lrn): Create bound function in C++ code from premade shared info. |
7626 bound_function->shared()->set_bound(true); | 7627 bound_function->shared()->set_bound(true); |
7627 // Get all arguments of calling function (Function.prototype.bind). | 7628 // Get all arguments of calling function (Function.prototype.bind). |
7628 int argc = 0; | 7629 int argc = 0; |
7629 SmartArrayPointer<Handle<Object> > arguments = GetCallerArguments(0, &argc); | 7630 SmartArrayPointer<Handle<Object> > arguments = |
| 7631 GetCallerArguments(isolate, 0, &argc); |
7630 // Don't count the this-arg. | 7632 // Don't count the this-arg. |
7631 if (argc > 0) { | 7633 if (argc > 0) { |
7632 ASSERT(*arguments[0] == args[2]); | 7634 ASSERT(*arguments[0] == args[2]); |
7633 argc--; | 7635 argc--; |
7634 } else { | 7636 } else { |
7635 ASSERT(args[2]->IsUndefined()); | 7637 ASSERT(args[2]->IsUndefined()); |
7636 } | 7638 } |
7637 // Initialize array of bindings (function, this, and any existing arguments | 7639 // Initialize array of bindings (function, this, and any existing arguments |
7638 // if the function was already bound). | 7640 // if the function was already bound). |
7639 Handle<FixedArray> new_bindings; | 7641 Handle<FixedArray> new_bindings; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7701 Handle<FixedArray> bound_args = | 7703 Handle<FixedArray> bound_args = |
7702 Handle<FixedArray>(FixedArray::cast(function->function_bindings())); | 7704 Handle<FixedArray>(FixedArray::cast(function->function_bindings())); |
7703 int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex; | 7705 int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex; |
7704 Handle<Object> bound_function( | 7706 Handle<Object> bound_function( |
7705 JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex))); | 7707 JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex))); |
7706 ASSERT(!bound_function->IsJSFunction() || | 7708 ASSERT(!bound_function->IsJSFunction() || |
7707 !Handle<JSFunction>::cast(bound_function)->shared()->bound()); | 7709 !Handle<JSFunction>::cast(bound_function)->shared()->bound()); |
7708 | 7710 |
7709 int total_argc = 0; | 7711 int total_argc = 0; |
7710 SmartArrayPointer<Handle<Object> > param_data = | 7712 SmartArrayPointer<Handle<Object> > param_data = |
7711 GetCallerArguments(bound_argc, &total_argc); | 7713 GetCallerArguments(isolate, bound_argc, &total_argc); |
7712 for (int i = 0; i < bound_argc; i++) { | 7714 for (int i = 0; i < bound_argc; i++) { |
7713 param_data[i] = Handle<Object>(bound_args->get( | 7715 param_data[i] = Handle<Object>(bound_args->get( |
7714 JSFunction::kBoundArgumentsStartIndex + i)); | 7716 JSFunction::kBoundArgumentsStartIndex + i)); |
7715 } | 7717 } |
7716 | 7718 |
7717 if (!bound_function->IsJSFunction()) { | 7719 if (!bound_function->IsJSFunction()) { |
7718 bool exception_thrown; | 7720 bool exception_thrown; |
7719 bound_function = Execution::TryGetConstructorDelegate(bound_function, | 7721 bound_function = Execution::TryGetConstructorDelegate(bound_function, |
7720 &exception_thrown); | 7722 &exception_thrown); |
7721 if (exception_thrown) return Failure::Exception(); | 7723 if (exception_thrown) return Failure::Exception(); |
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8908 return Execution::HandleStackGuardInterrupt(isolate); | 8910 return Execution::HandleStackGuardInterrupt(isolate); |
8909 } | 8911 } |
8910 | 8912 |
8911 | 8913 |
8912 RUNTIME_FUNCTION(MaybeObject*, Runtime_Interrupt) { | 8914 RUNTIME_FUNCTION(MaybeObject*, Runtime_Interrupt) { |
8913 ASSERT(args.length() == 0); | 8915 ASSERT(args.length() == 0); |
8914 return Execution::HandleStackGuardInterrupt(isolate); | 8916 return Execution::HandleStackGuardInterrupt(isolate); |
8915 } | 8917 } |
8916 | 8918 |
8917 | 8919 |
8918 static int StackSize() { | 8920 static int StackSize(Isolate* isolate) { |
8919 int n = 0; | 8921 int n = 0; |
8920 for (JavaScriptFrameIterator it; !it.done(); it.Advance()) n++; | 8922 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) n++; |
8921 return n; | 8923 return n; |
8922 } | 8924 } |
8923 | 8925 |
8924 | 8926 |
8925 static void PrintTransition(Object* result) { | 8927 static void PrintTransition(Isolate* isolate, Object* result) { |
8926 // indentation | 8928 // indentation |
8927 { const int nmax = 80; | 8929 { const int nmax = 80; |
8928 int n = StackSize(); | 8930 int n = StackSize(isolate); |
8929 if (n <= nmax) | 8931 if (n <= nmax) |
8930 PrintF("%4d:%*s", n, n, ""); | 8932 PrintF("%4d:%*s", n, n, ""); |
8931 else | 8933 else |
8932 PrintF("%4d:%*s", n, nmax, "..."); | 8934 PrintF("%4d:%*s", n, nmax, "..."); |
8933 } | 8935 } |
8934 | 8936 |
8935 if (result == NULL) { | 8937 if (result == NULL) { |
8936 JavaScriptFrame::PrintTop(stdout, true, false); | 8938 JavaScriptFrame::PrintTop(isolate, stdout, true, false); |
8937 PrintF(" {\n"); | 8939 PrintF(" {\n"); |
8938 } else { | 8940 } else { |
8939 // function result | 8941 // function result |
8940 PrintF("} -> "); | 8942 PrintF("} -> "); |
8941 result->ShortPrint(); | 8943 result->ShortPrint(); |
8942 PrintF("\n"); | 8944 PrintF("\n"); |
8943 } | 8945 } |
8944 } | 8946 } |
8945 | 8947 |
8946 | 8948 |
8947 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceEnter) { | 8949 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceEnter) { |
8948 ASSERT(args.length() == 0); | 8950 ASSERT(args.length() == 0); |
8949 NoHandleAllocation ha; | 8951 NoHandleAllocation ha; |
8950 PrintTransition(NULL); | 8952 PrintTransition(isolate, NULL); |
8951 return isolate->heap()->undefined_value(); | 8953 return isolate->heap()->undefined_value(); |
8952 } | 8954 } |
8953 | 8955 |
8954 | 8956 |
8955 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceExit) { | 8957 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceExit) { |
8956 NoHandleAllocation ha; | 8958 NoHandleAllocation ha; |
8957 PrintTransition(args[0]); | 8959 PrintTransition(isolate, args[0]); |
8958 return args[0]; // return TOS | 8960 return args[0]; // return TOS |
8959 } | 8961 } |
8960 | 8962 |
8961 | 8963 |
8962 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) { | 8964 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) { |
8963 NoHandleAllocation ha; | 8965 NoHandleAllocation ha; |
8964 ASSERT(args.length() == 1); | 8966 ASSERT(args.length() == 1); |
8965 | 8967 |
8966 #ifdef DEBUG | 8968 #ifdef DEBUG |
8967 if (args[0]->IsString()) { | 8969 if (args[0]->IsString()) { |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9359 private: | 9361 private: |
9360 // Convert storage to dictionary mode. | 9362 // Convert storage to dictionary mode. |
9361 void SetDictionaryMode(uint32_t index) { | 9363 void SetDictionaryMode(uint32_t index) { |
9362 ASSERT(fast_elements_); | 9364 ASSERT(fast_elements_); |
9363 Handle<FixedArray> current_storage(*storage_); | 9365 Handle<FixedArray> current_storage(*storage_); |
9364 Handle<SeededNumberDictionary> slow_storage( | 9366 Handle<SeededNumberDictionary> slow_storage( |
9365 isolate_->factory()->NewSeededNumberDictionary( | 9367 isolate_->factory()->NewSeededNumberDictionary( |
9366 current_storage->length())); | 9368 current_storage->length())); |
9367 uint32_t current_length = static_cast<uint32_t>(current_storage->length()); | 9369 uint32_t current_length = static_cast<uint32_t>(current_storage->length()); |
9368 for (uint32_t i = 0; i < current_length; i++) { | 9370 for (uint32_t i = 0; i < current_length; i++) { |
9369 HandleScope loop_scope; | 9371 HandleScope loop_scope(isolate_); |
9370 Handle<Object> element(current_storage->get(i)); | 9372 Handle<Object> element(current_storage->get(i)); |
9371 if (!element->IsTheHole()) { | 9373 if (!element->IsTheHole()) { |
9372 Handle<SeededNumberDictionary> new_storage = | 9374 Handle<SeededNumberDictionary> new_storage = |
9373 isolate_->factory()->DictionaryAtNumberPut(slow_storage, i, element); | 9375 isolate_->factory()->DictionaryAtNumberPut(slow_storage, i, element); |
9374 if (!new_storage.is_identical_to(slow_storage)) { | 9376 if (!new_storage.is_identical_to(slow_storage)) { |
9375 slow_storage = loop_scope.CloseAndEscape(new_storage); | 9377 slow_storage = loop_scope.CloseAndEscape(new_storage); |
9376 } | 9378 } |
9377 } | 9379 } |
9378 } | 9380 } |
9379 clear_storage(); | 9381 clear_storage(); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9474 bool elements_are_guaranteed_smis, | 9476 bool elements_are_guaranteed_smis, |
9475 ArrayConcatVisitor* visitor) { | 9477 ArrayConcatVisitor* visitor) { |
9476 Handle<ExternalArrayClass> array( | 9478 Handle<ExternalArrayClass> array( |
9477 ExternalArrayClass::cast(receiver->elements())); | 9479 ExternalArrayClass::cast(receiver->elements())); |
9478 uint32_t len = static_cast<uint32_t>(array->length()); | 9480 uint32_t len = static_cast<uint32_t>(array->length()); |
9479 | 9481 |
9480 ASSERT(visitor != NULL); | 9482 ASSERT(visitor != NULL); |
9481 if (elements_are_ints) { | 9483 if (elements_are_ints) { |
9482 if (elements_are_guaranteed_smis) { | 9484 if (elements_are_guaranteed_smis) { |
9483 for (uint32_t j = 0; j < len; j++) { | 9485 for (uint32_t j = 0; j < len; j++) { |
9484 HandleScope loop_scope; | 9486 HandleScope loop_scope(isolate); |
9485 Handle<Smi> e(Smi::FromInt(static_cast<int>(array->get_scalar(j)))); | 9487 Handle<Smi> e(Smi::FromInt(static_cast<int>(array->get_scalar(j)))); |
9486 visitor->visit(j, e); | 9488 visitor->visit(j, e); |
9487 } | 9489 } |
9488 } else { | 9490 } else { |
9489 for (uint32_t j = 0; j < len; j++) { | 9491 for (uint32_t j = 0; j < len; j++) { |
9490 HandleScope loop_scope; | 9492 HandleScope loop_scope(isolate); |
9491 int64_t val = static_cast<int64_t>(array->get_scalar(j)); | 9493 int64_t val = static_cast<int64_t>(array->get_scalar(j)); |
9492 if (Smi::IsValid(static_cast<intptr_t>(val))) { | 9494 if (Smi::IsValid(static_cast<intptr_t>(val))) { |
9493 Handle<Smi> e(Smi::FromInt(static_cast<int>(val))); | 9495 Handle<Smi> e(Smi::FromInt(static_cast<int>(val))); |
9494 visitor->visit(j, e); | 9496 visitor->visit(j, e); |
9495 } else { | 9497 } else { |
9496 Handle<Object> e = | 9498 Handle<Object> e = |
9497 isolate->factory()->NewNumber(static_cast<ElementType>(val)); | 9499 isolate->factory()->NewNumber(static_cast<ElementType>(val)); |
9498 visitor->visit(j, e); | 9500 visitor->visit(j, e); |
9499 } | 9501 } |
9500 } | 9502 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9540 case FAST_DOUBLE_ELEMENTS: { | 9542 case FAST_DOUBLE_ELEMENTS: { |
9541 // TODO(1810): Decide if it's worthwhile to implement this. | 9543 // TODO(1810): Decide if it's worthwhile to implement this. |
9542 UNREACHABLE(); | 9544 UNREACHABLE(); |
9543 break; | 9545 break; |
9544 } | 9546 } |
9545 case DICTIONARY_ELEMENTS: { | 9547 case DICTIONARY_ELEMENTS: { |
9546 Handle<SeededNumberDictionary> dict( | 9548 Handle<SeededNumberDictionary> dict( |
9547 SeededNumberDictionary::cast(object->elements())); | 9549 SeededNumberDictionary::cast(object->elements())); |
9548 uint32_t capacity = dict->Capacity(); | 9550 uint32_t capacity = dict->Capacity(); |
9549 for (uint32_t j = 0; j < capacity; j++) { | 9551 for (uint32_t j = 0; j < capacity; j++) { |
9550 HandleScope loop_scope; | 9552 HandleScope loop_scope(object->GetIsolate()); |
9551 Handle<Object> k(dict->KeyAt(j)); | 9553 Handle<Object> k(dict->KeyAt(j)); |
9552 if (dict->IsKey(*k)) { | 9554 if (dict->IsKey(*k)) { |
9553 ASSERT(k->IsNumber()); | 9555 ASSERT(k->IsNumber()); |
9554 uint32_t index = static_cast<uint32_t>(k->Number()); | 9556 uint32_t index = static_cast<uint32_t>(k->Number()); |
9555 if (index < range) { | 9557 if (index < range) { |
9556 indices->Add(index); | 9558 indices->Add(index); |
9557 } | 9559 } |
9558 } | 9560 } |
9559 } | 9561 } |
9560 break; | 9562 break; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9703 case DICTIONARY_ELEMENTS: { | 9705 case DICTIONARY_ELEMENTS: { |
9704 Handle<SeededNumberDictionary> dict(receiver->element_dictionary()); | 9706 Handle<SeededNumberDictionary> dict(receiver->element_dictionary()); |
9705 List<uint32_t> indices(dict->Capacity() / 2); | 9707 List<uint32_t> indices(dict->Capacity() / 2); |
9706 // Collect all indices in the object and the prototypes less | 9708 // Collect all indices in the object and the prototypes less |
9707 // than length. This might introduce duplicates in the indices list. | 9709 // than length. This might introduce duplicates in the indices list. |
9708 CollectElementIndices(receiver, length, &indices); | 9710 CollectElementIndices(receiver, length, &indices); |
9709 indices.Sort(&compareUInt32); | 9711 indices.Sort(&compareUInt32); |
9710 int j = 0; | 9712 int j = 0; |
9711 int n = indices.length(); | 9713 int n = indices.length(); |
9712 while (j < n) { | 9714 while (j < n) { |
9713 HandleScope loop_scope; | 9715 HandleScope loop_scope(isolate); |
9714 uint32_t index = indices[j]; | 9716 uint32_t index = indices[j]; |
9715 Handle<Object> element = Object::GetElement(receiver, index); | 9717 Handle<Object> element = Object::GetElement(receiver, index); |
9716 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, element, false); | 9718 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, element, false); |
9717 visitor->visit(index, element); | 9719 visitor->visit(index, element); |
9718 // Skip to next different index (i.e., omit duplicates). | 9720 // Skip to next different index (i.e., omit duplicates). |
9719 do { | 9721 do { |
9720 j++; | 9722 j++; |
9721 } while (j < n && indices[j] == index); | 9723 } while (j < n && indices[j] == index); |
9722 } | 9724 } |
9723 break; | 9725 break; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9798 // Pass 1: estimate the length and number of elements of the result. | 9800 // Pass 1: estimate the length and number of elements of the result. |
9799 // The actual length can be larger if any of the arguments have getters | 9801 // The actual length can be larger if any of the arguments have getters |
9800 // that mutate other arguments (but will otherwise be precise). | 9802 // that mutate other arguments (but will otherwise be precise). |
9801 // The number of elements is precise if there are no inherited elements. | 9803 // The number of elements is precise if there are no inherited elements. |
9802 | 9804 |
9803 ElementsKind kind = FAST_SMI_ELEMENTS; | 9805 ElementsKind kind = FAST_SMI_ELEMENTS; |
9804 | 9806 |
9805 uint32_t estimate_result_length = 0; | 9807 uint32_t estimate_result_length = 0; |
9806 uint32_t estimate_nof_elements = 0; | 9808 uint32_t estimate_nof_elements = 0; |
9807 for (int i = 0; i < argument_count; i++) { | 9809 for (int i = 0; i < argument_count; i++) { |
9808 HandleScope loop_scope; | 9810 HandleScope loop_scope(isolate); |
9809 Handle<Object> obj(elements->get(i)); | 9811 Handle<Object> obj(elements->get(i)); |
9810 uint32_t length_estimate; | 9812 uint32_t length_estimate; |
9811 uint32_t element_estimate; | 9813 uint32_t element_estimate; |
9812 if (obj->IsJSArray()) { | 9814 if (obj->IsJSArray()) { |
9813 Handle<JSArray> array(Handle<JSArray>::cast(obj)); | 9815 Handle<JSArray> array(Handle<JSArray>::cast(obj)); |
9814 length_estimate = static_cast<uint32_t>(array->length()->Number()); | 9816 length_estimate = static_cast<uint32_t>(array->length()->Number()); |
9815 if (length_estimate != 0) { | 9817 if (length_estimate != 0) { |
9816 ElementsKind array_kind = | 9818 ElementsKind array_kind = |
9817 GetPackedElementsKind(array->map()->elements_kind()); | 9819 GetPackedElementsKind(array->map()->elements_kind()); |
9818 if (IsMoreGeneralElementsKindTransition(kind, array_kind)) { | 9820 if (IsMoreGeneralElementsKindTransition(kind, array_kind)) { |
(...skipping 1862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11681 return isolate->heap()->ToBoolean(res); | 11683 return isolate->heap()->ToBoolean(res); |
11682 } | 11684 } |
11683 | 11685 |
11684 | 11686 |
11685 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrintScopes) { | 11687 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrintScopes) { |
11686 HandleScope scope(isolate); | 11688 HandleScope scope(isolate); |
11687 ASSERT(args.length() == 0); | 11689 ASSERT(args.length() == 0); |
11688 | 11690 |
11689 #ifdef DEBUG | 11691 #ifdef DEBUG |
11690 // Print the scopes for the top frame. | 11692 // Print the scopes for the top frame. |
11691 StackFrameLocator locator; | 11693 StackFrameLocator locator(isolate); |
11692 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); | 11694 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); |
11693 for (ScopeIterator it(isolate, frame, 0); | 11695 for (ScopeIterator it(isolate, frame, 0); |
11694 !it.Done(); | 11696 !it.Done(); |
11695 it.Next()) { | 11697 it.Next()) { |
11696 it.DebugPrint(); | 11698 it.DebugPrint(); |
11697 } | 11699 } |
11698 #endif | 11700 #endif |
11699 return isolate->heap()->undefined_value(); | 11701 return isolate->heap()->undefined_value(); |
11700 } | 11702 } |
11701 | 11703 |
(...skipping 1566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13268 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); | 13270 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); |
13269 return message->script(); | 13271 return message->script(); |
13270 } | 13272 } |
13271 | 13273 |
13272 | 13274 |
13273 #ifdef DEBUG | 13275 #ifdef DEBUG |
13274 // ListNatives is ONLY used by the fuzz-natives.js in debug mode | 13276 // ListNatives is ONLY used by the fuzz-natives.js in debug mode |
13275 // Exclude the code in release mode. | 13277 // Exclude the code in release mode. |
13276 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { | 13278 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { |
13277 ASSERT(args.length() == 0); | 13279 ASSERT(args.length() == 0); |
13278 HandleScope scope; | 13280 HandleScope scope(isolate); |
13279 #define COUNT_ENTRY(Name, argc, ressize) + 1 | 13281 #define COUNT_ENTRY(Name, argc, ressize) + 1 |
13280 int entry_count = 0 | 13282 int entry_count = 0 |
13281 RUNTIME_FUNCTION_LIST(COUNT_ENTRY) | 13283 RUNTIME_FUNCTION_LIST(COUNT_ENTRY) |
13282 INLINE_FUNCTION_LIST(COUNT_ENTRY) | 13284 INLINE_FUNCTION_LIST(COUNT_ENTRY) |
13283 INLINE_RUNTIME_FUNCTION_LIST(COUNT_ENTRY); | 13285 INLINE_RUNTIME_FUNCTION_LIST(COUNT_ENTRY); |
13284 #undef COUNT_ENTRY | 13286 #undef COUNT_ENTRY |
13285 Factory* factory = isolate->factory(); | 13287 Factory* factory = isolate->factory(); |
13286 Handle<FixedArray> elements = factory->NewFixedArray(entry_count); | 13288 Handle<FixedArray> elements = factory->NewFixedArray(entry_count); |
13287 int index = 0; | 13289 int index = 0; |
13288 bool inline_runtime_functions = false; | 13290 bool inline_runtime_functions = false; |
13289 #define ADD_ENTRY(Name, argc, ressize) \ | 13291 #define ADD_ENTRY(Name, argc, ressize) \ |
13290 { \ | 13292 { \ |
13291 HandleScope inner; \ | 13293 HandleScope inner(isolate); \ |
13292 Handle<String> name; \ | 13294 Handle<String> name; \ |
13293 /* Inline runtime functions have an underscore in front of the name. */ \ | 13295 /* Inline runtime functions have an underscore in front of the name. */ \ |
13294 if (inline_runtime_functions) { \ | 13296 if (inline_runtime_functions) { \ |
13295 name = factory->NewStringFromAscii( \ | 13297 name = factory->NewStringFromAscii( \ |
13296 Vector<const char>("_" #Name, StrLength("_" #Name))); \ | 13298 Vector<const char>("_" #Name, StrLength("_" #Name))); \ |
13297 } else { \ | 13299 } else { \ |
13298 name = factory->NewStringFromAscii( \ | 13300 name = factory->NewStringFromAscii( \ |
13299 Vector<const char>(#Name, StrLength(#Name))); \ | 13301 Vector<const char>(#Name, StrLength(#Name))); \ |
13300 } \ | 13302 } \ |
13301 Handle<FixedArray> pair_elements = factory->NewFixedArray(2); \ | 13303 Handle<FixedArray> pair_elements = factory->NewFixedArray(2); \ |
(...skipping 15 matching lines...) Expand all Loading... |
13317 #endif | 13319 #endif |
13318 | 13320 |
13319 | 13321 |
13320 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { | 13322 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { |
13321 ASSERT(args.length() == 2); | 13323 ASSERT(args.length() == 2); |
13322 CONVERT_ARG_CHECKED(String, format, 0); | 13324 CONVERT_ARG_CHECKED(String, format, 0); |
13323 CONVERT_ARG_CHECKED(JSArray, elms, 1); | 13325 CONVERT_ARG_CHECKED(JSArray, elms, 1); |
13324 String::FlatContent format_content = format->GetFlatContent(); | 13326 String::FlatContent format_content = format->GetFlatContent(); |
13325 RUNTIME_ASSERT(format_content.IsAscii()); | 13327 RUNTIME_ASSERT(format_content.IsAscii()); |
13326 Vector<const uint8_t> chars = format_content.ToOneByteVector(); | 13328 Vector<const uint8_t> chars = format_content.ToOneByteVector(); |
13327 LOGGER->LogRuntime(Vector<const char>::cast(chars), elms); | 13329 LOGGER->LogRuntime(isolate, Vector<const char>::cast(chars), elms); |
13328 return isolate->heap()->undefined_value(); | 13330 return isolate->heap()->undefined_value(); |
13329 } | 13331 } |
13330 | 13332 |
13331 | 13333 |
13332 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) { | 13334 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) { |
13333 UNREACHABLE(); // implemented as macro in the parser | 13335 UNREACHABLE(); // implemented as macro in the parser |
13334 return NULL; | 13336 return NULL; |
13335 } | 13337 } |
13336 | 13338 |
13337 | 13339 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13531 // Handle last resort GC and make sure to allow future allocations | 13533 // Handle last resort GC and make sure to allow future allocations |
13532 // to grow the heap without causing GCs (if possible). | 13534 // to grow the heap without causing GCs (if possible). |
13533 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13535 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13534 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13536 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13535 "Runtime::PerformGC"); | 13537 "Runtime::PerformGC"); |
13536 } | 13538 } |
13537 } | 13539 } |
13538 | 13540 |
13539 | 13541 |
13540 } } // namespace v8::internal | 13542 } } // namespace v8::internal |
OLD | NEW |