Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: src/runtime.cc

Issue 209353006: Refactor optimized in hydrogen only runtime functions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Patch for landing + rebase Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.h ('k') | src/serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2580 matching lines...) Expand 10 before | Expand all | Expand 10 after
2591 ASSERT(args.length() == 2); 2591 ASSERT(args.length() == 2);
2592 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 2592 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
2593 CONVERT_SMI_ARG_CHECKED(properties, 1); 2593 CONVERT_SMI_ARG_CHECKED(properties, 1);
2594 if (object->HasFastProperties() && !object->IsJSGlobalProxy()) { 2594 if (object->HasFastProperties() && !object->IsJSGlobalProxy()) {
2595 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties); 2595 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties);
2596 } 2596 }
2597 return *object; 2597 return *object;
2598 } 2598 }
2599 2599
2600 2600
2601 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExec) { 2601 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_RegExpExec) {
2602 HandleScope scope(isolate); 2602 HandleScope scope(isolate);
2603 ASSERT(args.length() == 4); 2603 ASSERT(args.length() == 4);
2604 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); 2604 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
2605 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); 2605 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
2606 // Due to the way the JS calls are constructed this must be less than the 2606 // Due to the way the JS calls are constructed this must be less than the
2607 // length of a string, i.e. it is always a Smi. We check anyway for security. 2607 // length of a string, i.e. it is always a Smi. We check anyway for security.
2608 CONVERT_SMI_ARG_CHECKED(index, 2); 2608 CONVERT_SMI_ARG_CHECKED(index, 2);
2609 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); 2609 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
2610 RUNTIME_ASSERT(index >= 0); 2610 RUNTIME_ASSERT(index >= 0);
2611 RUNTIME_ASSERT(index <= subject->length()); 2611 RUNTIME_ASSERT(index <= subject->length());
2612 isolate->counters()->regexp_entry_runtime()->Increment(); 2612 isolate->counters()->regexp_entry_runtime()->Increment();
2613 Handle<Object> result = RegExpImpl::Exec(regexp, 2613 Handle<Object> result = RegExpImpl::Exec(regexp,
2614 subject, 2614 subject,
2615 index, 2615 index,
2616 last_match_info); 2616 last_match_info);
2617 RETURN_IF_EMPTY_HANDLE(isolate, result); 2617 RETURN_IF_EMPTY_HANDLE(isolate, result);
2618 return *result; 2618 return *result;
2619 } 2619 }
2620 2620
2621 2621
2622 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpConstructResult) { 2622 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_RegExpConstructResult) {
2623 SealHandleScope shs(isolate); 2623 SealHandleScope shs(isolate);
2624 ASSERT(args.length() == 3); 2624 ASSERT(args.length() == 3);
2625 CONVERT_SMI_ARG_CHECKED(elements_count, 0); 2625 CONVERT_SMI_ARG_CHECKED(elements_count, 0);
2626 if (elements_count < 0 || 2626 if (elements_count < 0 ||
2627 elements_count > FixedArray::kMaxLength || 2627 elements_count > FixedArray::kMaxLength ||
2628 !Smi::IsValid(elements_count)) { 2628 !Smi::IsValid(elements_count)) {
2629 return isolate->ThrowIllegalOperation(); 2629 return isolate->ThrowIllegalOperation();
2630 } 2630 }
2631 Object* new_object; 2631 Object* new_object;
2632 { MaybeObject* maybe_new_object = 2632 { MaybeObject* maybe_new_object =
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
3274 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate, 3274 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate,
3275 Object* char_code) { 3275 Object* char_code) {
3276 if (char_code->IsNumber()) { 3276 if (char_code->IsNumber()) {
3277 return isolate->heap()->LookupSingleCharacterStringFromCode( 3277 return isolate->heap()->LookupSingleCharacterStringFromCode(
3278 NumberToUint32(char_code) & 0xffff); 3278 NumberToUint32(char_code) & 0xffff);
3279 } 3279 }
3280 return isolate->heap()->empty_string(); 3280 return isolate->heap()->empty_string();
3281 } 3281 }
3282 3282
3283 3283
3284 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { 3284 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringCharCodeAt) {
3285 SealHandleScope shs(isolate); 3285 SealHandleScope shs(isolate);
3286 ASSERT(args.length() == 2); 3286 ASSERT(args.length() == 2);
3287 3287
3288 CONVERT_ARG_CHECKED(String, subject, 0); 3288 CONVERT_ARG_CHECKED(String, subject, 0);
3289 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]); 3289 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]);
3290 3290
3291 // Flatten the string. If someone wants to get a char at an index 3291 // Flatten the string. If someone wants to get a char at an index
3292 // in a cons string, it is likely that more indices will be 3292 // in a cons string, it is likely that more indices will be
3293 // accessed. 3293 // accessed.
3294 Object* flat; 3294 Object* flat;
(...skipping 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after
4544 for (int i = 0; i < end; i++) { 4544 for (int i = 0; i < end; i++) {
4545 uint16_t char1 = stream1.GetNext(); 4545 uint16_t char1 = stream1.GetNext();
4546 uint16_t char2 = stream2.GetNext(); 4546 uint16_t char2 = stream2.GetNext();
4547 if (char1 != char2) return Smi::FromInt(char1 - char2); 4547 if (char1 != char2) return Smi::FromInt(char1 - char2);
4548 } 4548 }
4549 4549
4550 return Smi::FromInt(str1_length - str2_length); 4550 return Smi::FromInt(str1_length - str2_length);
4551 } 4551 }
4552 4552
4553 4553
4554 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) { 4554 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_SubString) {
4555 HandleScope scope(isolate); 4555 HandleScope scope(isolate);
4556 ASSERT(args.length() == 3); 4556 ASSERT(args.length() == 3);
4557 4557
4558 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 4558 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
4559 int start, end; 4559 int start, end;
4560 // We have a fast integer-only case here to avoid a conversion to double in 4560 // We have a fast integer-only case here to avoid a conversion to double in
4561 // the common case where from and to are Smis. 4561 // the common case where from and to are Smis.
4562 if (args[1]->IsSmi() && args[2]->IsSmi()) { 4562 if (args[1]->IsSmi() && args[2]->IsSmi()) {
4563 CONVERT_SMI_ARG_CHECKED(from_number, 1); 4563 CONVERT_SMI_ARG_CHECKED(from_number, 1);
4564 CONVERT_SMI_ARG_CHECKED(to_number, 2); 4564 CONVERT_SMI_ARG_CHECKED(to_number, 2);
(...skipping 2343 matching lines...) Expand 10 before | Expand all | Expand 10 after
6908 } 6908 }
6909 6909
6910 6910
6911 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { 6911 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) {
6912 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; 6912 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth];
6913 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); 6913 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars);
6914 return char_length == 0; 6914 return char_length == 0;
6915 } 6915 }
6916 6916
6917 6917
6918 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToString) { 6918 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_NumberToString) {
6919 SealHandleScope shs(isolate); 6919 SealHandleScope shs(isolate);
6920 ASSERT(args.length() == 1); 6920 ASSERT(args.length() == 1);
6921 6921
6922 Object* number = args[0]; 6922 Object* number = args[0];
6923 RUNTIME_ASSERT(number->IsNumber()); 6923 RUNTIME_ASSERT(number->IsNumber());
6924 6924
6925 return isolate->heap()->NumberToString(number); 6925 return isolate->heap()->NumberToString(number);
6926 } 6926 }
6927 6927
6928 6928
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
7112 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberImul) { 7112 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberImul) {
7113 SealHandleScope shs(isolate); 7113 SealHandleScope shs(isolate);
7114 ASSERT(args.length() == 2); 7114 ASSERT(args.length() == 2);
7115 7115
7116 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 7116 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
7117 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7117 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7118 return isolate->heap()->NumberFromInt32(x * y); 7118 return isolate->heap()->NumberFromInt32(x * y);
7119 } 7119 }
7120 7120
7121 7121
7122 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) { 7122 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringAdd) {
7123 HandleScope scope(isolate); 7123 HandleScope scope(isolate);
7124 ASSERT(args.length() == 2); 7124 ASSERT(args.length() == 2);
7125 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0); 7125 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0);
7126 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1); 7126 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1);
7127 isolate->counters()->string_add_runtime()->Increment(); 7127 isolate->counters()->string_add_runtime()->Increment();
7128 Handle<String> result = isolate->factory()->NewConsString(str1, str2); 7128 Handle<String> result = isolate->factory()->NewConsString(str1, str2);
7129 RETURN_IF_EMPTY_HANDLE(isolate, result); 7129 RETURN_IF_EMPTY_HANDLE(isolate, result);
7130 return *result; 7130 return *result;
7131 } 7131 }
7132 7132
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
7735 result = equal_prefix_result; 7735 result = equal_prefix_result;
7736 } else { 7736 } else {
7737 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER); 7737 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER);
7738 } 7738 }
7739 ASSERT(result == 7739 ASSERT(result ==
7740 StringCharacterStreamCompare(x->GetIsolate()->runtime_state(), x, y)); 7740 StringCharacterStreamCompare(x->GetIsolate()->runtime_state(), x, y));
7741 return result; 7741 return result;
7742 } 7742 }
7743 7743
7744 7744
7745 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) { 7745 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringCompare) {
7746 SealHandleScope shs(isolate); 7746 SealHandleScope shs(isolate);
7747 ASSERT(args.length() == 2); 7747 ASSERT(args.length() == 2);
7748 7748
7749 CONVERT_ARG_CHECKED(String, x, 0); 7749 CONVERT_ARG_CHECKED(String, x, 0);
7750 CONVERT_ARG_CHECKED(String, y, 1); 7750 CONVERT_ARG_CHECKED(String, y, 1);
7751 7751
7752 isolate->counters()->string_compare_runtime()->Increment(); 7752 isolate->counters()->string_compare_runtime()->Increment();
7753 7753
7754 // A few fast case tests before we flatten. 7754 // A few fast case tests before we flatten.
7755 if (x == y) return Smi::FromInt(EQUAL); 7755 if (x == y) return Smi::FromInt(EQUAL);
(...skipping 6821 matching lines...) Expand 10 before | Expand all | Expand 10 after
14577 // This call must not cause lazy deopts, because it's called from deferred 14577 // This call must not cause lazy deopts, because it's called from deferred
14578 // code where we can't handle lazy deopts for lack of a suitable bailout 14578 // code where we can't handle lazy deopts for lack of a suitable bailout
14579 // ID. So we just try migration and signal failure if necessary, 14579 // ID. So we just try migration and signal failure if necessary,
14580 // which will also trigger a deopt. 14580 // which will also trigger a deopt.
14581 Handle<Object> result = JSObject::TryMigrateInstance(js_object); 14581 Handle<Object> result = JSObject::TryMigrateInstance(js_object);
14582 if (result.is_null()) return Smi::FromInt(0); 14582 if (result.is_null()) return Smi::FromInt(0);
14583 return *object; 14583 return *object;
14584 } 14584 }
14585 14585
14586 14586
14587 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) { 14587 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_GetFromCache) {
14588 SealHandleScope shs(isolate); 14588 SealHandleScope shs(isolate);
14589 // This is only called from codegen, so checks might be more lax. 14589 // This is only called from codegen, so checks might be more lax.
14590 CONVERT_ARG_CHECKED(JSFunctionResultCache, cache, 0); 14590 CONVERT_ARG_CHECKED(JSFunctionResultCache, cache, 0);
14591 Object* key = args[1]; 14591 Object* key = args[1];
14592 14592
14593 int finger_index = cache->finger_index(); 14593 int finger_index = cache->finger_index();
14594 Object* o = cache->get(finger_index); 14594 Object* o = cache->get(finger_index);
14595 if (o == key) { 14595 if (o == key) {
14596 // The fastest case: hit the same place again. 14596 // The fastest case: hit the same place again.
14597 return cache->get(finger_index + 1); 14597 return cache->get(finger_index + 1);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
14699 14699
14700 #ifdef DEBUG 14700 #ifdef DEBUG
14701 // ListNatives is ONLY used by the fuzz-natives.js in debug mode 14701 // ListNatives is ONLY used by the fuzz-natives.js in debug mode
14702 // Exclude the code in release mode. 14702 // Exclude the code in release mode.
14703 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { 14703 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) {
14704 HandleScope scope(isolate); 14704 HandleScope scope(isolate);
14705 ASSERT(args.length() == 0); 14705 ASSERT(args.length() == 0);
14706 #define COUNT_ENTRY(Name, argc, ressize) + 1 14706 #define COUNT_ENTRY(Name, argc, ressize) + 1
14707 int entry_count = 0 14707 int entry_count = 0
14708 RUNTIME_FUNCTION_LIST(COUNT_ENTRY) 14708 RUNTIME_FUNCTION_LIST(COUNT_ENTRY)
14709 RUNTIME_HIDDEN_FUNCTION_LIST(COUNT_ENTRY)
14709 INLINE_FUNCTION_LIST(COUNT_ENTRY); 14710 INLINE_FUNCTION_LIST(COUNT_ENTRY);
14710 #undef COUNT_ENTRY 14711 #undef COUNT_ENTRY
14711 Factory* factory = isolate->factory(); 14712 Factory* factory = isolate->factory();
14712 Handle<FixedArray> elements = factory->NewFixedArray(entry_count); 14713 Handle<FixedArray> elements = factory->NewFixedArray(entry_count);
14713 int index = 0; 14714 int index = 0;
14714 bool inline_runtime_functions = false; 14715 bool inline_runtime_functions = false;
14715 #define ADD_ENTRY(Name, argc, ressize) \ 14716 #define ADD_ENTRY(Name, argc, ressize) \
14716 { \ 14717 { \
14717 HandleScope inner(isolate); \ 14718 HandleScope inner(isolate); \
14718 Handle<String> name; \ 14719 Handle<String> name; \
14719 /* Inline runtime functions have an underscore in front of the name. */ \ 14720 /* Inline runtime functions have an underscore in front of the name. */ \
14720 if (inline_runtime_functions) { \ 14721 if (inline_runtime_functions) { \
14721 name = factory->NewStringFromAscii( \ 14722 name = factory->NewStringFromAscii( \
14722 Vector<const char>("_" #Name, StrLength("_" #Name))); \ 14723 Vector<const char>("_" #Name, StrLength("_" #Name))); \
14723 } else { \ 14724 } else { \
14724 name = factory->NewStringFromAscii( \ 14725 name = factory->NewStringFromAscii( \
14725 Vector<const char>(#Name, StrLength(#Name))); \ 14726 Vector<const char>(#Name, StrLength(#Name))); \
14726 } \ 14727 } \
14727 Handle<FixedArray> pair_elements = factory->NewFixedArray(2); \ 14728 Handle<FixedArray> pair_elements = factory->NewFixedArray(2); \
14728 pair_elements->set(0, *name); \ 14729 pair_elements->set(0, *name); \
14729 pair_elements->set(1, Smi::FromInt(argc)); \ 14730 pair_elements->set(1, Smi::FromInt(argc)); \
14730 Handle<JSArray> pair = factory->NewJSArrayWithElements(pair_elements); \ 14731 Handle<JSArray> pair = factory->NewJSArrayWithElements(pair_elements); \
14731 elements->set(index++, *pair); \ 14732 elements->set(index++, *pair); \
14732 } 14733 }
14733 inline_runtime_functions = false; 14734 inline_runtime_functions = false;
14734 RUNTIME_FUNCTION_LIST(ADD_ENTRY) 14735 RUNTIME_FUNCTION_LIST(ADD_ENTRY)
14736 // Calling hidden runtime functions should just throw.
14737 RUNTIME_HIDDEN_FUNCTION_LIST(ADD_ENTRY)
14735 inline_runtime_functions = true; 14738 inline_runtime_functions = true;
14736 INLINE_FUNCTION_LIST(ADD_ENTRY) 14739 INLINE_FUNCTION_LIST(ADD_ENTRY)
14737 #undef ADD_ENTRY 14740 #undef ADD_ENTRY
14738 ASSERT_EQ(index, entry_count); 14741 ASSERT_EQ(index, entry_count);
14739 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); 14742 Handle<JSArray> result = factory->NewJSArrayWithElements(elements);
14740 return *result; 14743 return *result;
14741 } 14744 }
14742 #endif 14745 #endif
14743 14746
14744 14747
14745 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { 14748 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_Log) {
14746 HandleScope handle_scope(isolate); 14749 HandleScope handle_scope(isolate);
14747 ASSERT(args.length() == 2); 14750 ASSERT(args.length() == 2);
14748 CONVERT_ARG_HANDLE_CHECKED(String, format, 0); 14751 CONVERT_ARG_HANDLE_CHECKED(String, format, 0);
14749 CONVERT_ARG_HANDLE_CHECKED(JSArray, elms, 1); 14752 CONVERT_ARG_HANDLE_CHECKED(JSArray, elms, 1);
14750 14753
14751 SmartArrayPointer<char> format_chars = format->ToCString(); 14754 SmartArrayPointer<char> format_chars = format->ToCString();
14752 isolate->logger()->LogRuntime( 14755 isolate->logger()->LogRuntime(
14753 Vector<const char>(format_chars.get(), format->length()), elms); 14756 Vector<const char>(format_chars.get(), format->length()), elms);
14754 return isolate->heap()->undefined_value(); 14757 return isolate->heap()->undefined_value();
14755 } 14758 }
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
15091 15094
15092 15095
15093 // ---------------------------------------------------------------------------- 15096 // ----------------------------------------------------------------------------
15094 // Implementation of Runtime 15097 // Implementation of Runtime
15095 15098
15096 #define F(name, number_of_args, result_size) \ 15099 #define F(name, number_of_args, result_size) \
15097 { Runtime::k##name, Runtime::RUNTIME, #name, \ 15100 { Runtime::k##name, Runtime::RUNTIME, #name, \
15098 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size }, 15101 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size },
15099 15102
15100 15103
15104 #define FH(name, number_of_args, result_size) \
15105 { Runtime::kHidden##name, Runtime::RUNTIME_HIDDEN, NULL, \
15106 FUNCTION_ADDR(RuntimeHidden_##name), number_of_args, result_size },
15107
15108
15101 #define I(name, number_of_args, result_size) \ 15109 #define I(name, number_of_args, result_size) \
15102 { Runtime::kInline##name, Runtime::INLINE, \ 15110 { Runtime::kInline##name, Runtime::INLINE, \
15103 "_" #name, NULL, number_of_args, result_size }, 15111 "_" #name, NULL, number_of_args, result_size },
15104 15112
15113
15114 #define IO(name, number_of_args, result_size) \
15115 { Runtime::kInlineOptimized##name, Runtime::INLINE_OPTIMIZED, \
15116 "_" #name, FUNCTION_ADDR(Runtime_##name), number_of_args, result_size },
15117
15118
15105 static const Runtime::Function kIntrinsicFunctions[] = { 15119 static const Runtime::Function kIntrinsicFunctions[] = {
15106 RUNTIME_FUNCTION_LIST(F) 15120 RUNTIME_FUNCTION_LIST(F)
15121 RUNTIME_HIDDEN_FUNCTION_LIST(FH)
15107 INLINE_FUNCTION_LIST(I) 15122 INLINE_FUNCTION_LIST(I)
15123 INLINE_OPTIMIZED_FUNCTION_LIST(IO)
15108 }; 15124 };
15109 15125
15126 #undef IO
15110 #undef I 15127 #undef I
15128 #undef FH
15111 #undef F 15129 #undef F
15112 15130
15113 15131
15114 MaybeObject* Runtime::InitializeIntrinsicFunctionNames(Heap* heap, 15132 MaybeObject* Runtime::InitializeIntrinsicFunctionNames(Heap* heap,
15115 Object* dictionary) { 15133 Object* dictionary) {
15116 ASSERT(dictionary != NULL); 15134 ASSERT(dictionary != NULL);
15117 ASSERT(NameDictionary::cast(dictionary)->NumberOfElements() == 0); 15135 ASSERT(NameDictionary::cast(dictionary)->NumberOfElements() == 0);
15118 for (int i = 0; i < kNumFunctions; ++i) { 15136 for (int i = 0; i < kNumFunctions; ++i) {
15137 const char* name = kIntrinsicFunctions[i].name;
15138 if (name == NULL) continue;
15119 Object* name_string; 15139 Object* name_string;
15120 { MaybeObject* maybe_name_string = 15140 { MaybeObject* maybe_name_string =
15121 heap->InternalizeUtf8String(kIntrinsicFunctions[i].name); 15141 heap->InternalizeUtf8String(name);
15122 if (!maybe_name_string->ToObject(&name_string)) return maybe_name_string; 15142 if (!maybe_name_string->ToObject(&name_string)) return maybe_name_string;
15123 } 15143 }
15124 NameDictionary* name_dictionary = NameDictionary::cast(dictionary); 15144 NameDictionary* name_dictionary = NameDictionary::cast(dictionary);
15125 { MaybeObject* maybe_dictionary = name_dictionary->Add( 15145 { MaybeObject* maybe_dictionary = name_dictionary->Add(
15126 String::cast(name_string), 15146 String::cast(name_string),
15127 Smi::FromInt(i), 15147 Smi::FromInt(i),
15128 PropertyDetails(NONE, NORMAL, Representation::None())); 15148 PropertyDetails(NONE, NORMAL, Representation::None()));
15129 if (!maybe_dictionary->ToObject(&dictionary)) { 15149 if (!maybe_dictionary->ToObject(&dictionary)) {
15130 // Non-recoverable failure. Calling code must restart heap 15150 // Non-recoverable failure. Calling code must restart heap
15131 // initialization. 15151 // initialization.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
15169 // Handle last resort GC and make sure to allow future allocations 15189 // Handle last resort GC and make sure to allow future allocations
15170 // to grow the heap without causing GCs (if possible). 15190 // to grow the heap without causing GCs (if possible).
15171 isolate->counters()->gc_last_resort_from_js()->Increment(); 15191 isolate->counters()->gc_last_resort_from_js()->Increment();
15172 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 15192 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
15173 "Runtime::PerformGC"); 15193 "Runtime::PerformGC");
15174 } 15194 }
15175 } 15195 }
15176 15196
15177 15197
15178 } } // namespace v8::internal 15198 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698