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

Side by Side Diff: src/runtime.cc

Issue 3293002: Move inlined function declarations and support from codegen.* to runtime.*. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 3 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/x64/codegen-x64.h » ('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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-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 4501 matching lines...) Expand 10 before | Expand all | Expand 10 after
4512 NoHandleAllocation ha; 4512 NoHandleAllocation ha;
4513 4513
4514 CONVERT_CHECKED(String, s, args[0]); 4514 CONVERT_CHECKED(String, s, args[0]);
4515 CONVERT_SMI_CHECKED(radix, args[1]); 4515 CONVERT_SMI_CHECKED(radix, args[1]);
4516 4516
4517 s->TryFlatten(); 4517 s->TryFlatten();
4518 4518
4519 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); 4519 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36));
4520 double value = StringToInt(s, radix); 4520 double value = StringToInt(s, radix);
4521 return Heap::NumberFromDouble(value); 4521 return Heap::NumberFromDouble(value);
4522 return Heap::nan_value();
4523 } 4522 }
4524 4523
4525 4524
4526 static Object* Runtime_StringParseFloat(Arguments args) { 4525 static Object* Runtime_StringParseFloat(Arguments args) {
4527 NoHandleAllocation ha; 4526 NoHandleAllocation ha;
4528 CONVERT_CHECKED(String, str, args[0]); 4527 CONVERT_CHECKED(String, str, args[0]);
4529 4528
4530 // ECMA-262 section 15.1.2.3, empty string is NaN 4529 // ECMA-262 section 15.1.2.3, empty string is NaN
4531 double value = StringToDouble(str, ALLOW_TRAILING_JUNK, OS::nan_value()); 4530 double value = StringToDouble(str, ALLOW_TRAILING_JUNK, OS::nan_value());
4532 4531
(...skipping 5524 matching lines...) Expand 10 before | Expand all | Expand 10 after
10057 Vector<const char>(#Name, StrLength(#Name))); \ 10056 Vector<const char>(#Name, StrLength(#Name))); \
10058 } \ 10057 } \
10059 Handle<JSArray> pair = Factory::NewJSArray(0); \ 10058 Handle<JSArray> pair = Factory::NewJSArray(0); \
10060 SetElement(pair, 0, name); \ 10059 SetElement(pair, 0, name); \
10061 SetElement(pair, 1, Handle<Smi>(Smi::FromInt(argc))); \ 10060 SetElement(pair, 1, Handle<Smi>(Smi::FromInt(argc))); \
10062 SetElement(result, index++, pair); \ 10061 SetElement(result, index++, pair); \
10063 } 10062 }
10064 inline_runtime_functions = false; 10063 inline_runtime_functions = false;
10065 RUNTIME_FUNCTION_LIST(ADD_ENTRY) 10064 RUNTIME_FUNCTION_LIST(ADD_ENTRY)
10066 inline_runtime_functions = true; 10065 inline_runtime_functions = true;
10066 INLINE_FUNCTION_LIST(ADD_ENTRY)
10067 INLINE_RUNTIME_FUNCTION_LIST(ADD_ENTRY) 10067 INLINE_RUNTIME_FUNCTION_LIST(ADD_ENTRY)
10068 #undef ADD_ENTRY 10068 #undef ADD_ENTRY
10069 return *result; 10069 return *result;
10070 } 10070 }
10071 #endif 10071 #endif
10072 10072
10073 10073
10074 static Object* Runtime_Log(Arguments args) { 10074 static Object* Runtime_Log(Arguments args) {
10075 ASSERT(args.length() == 2); 10075 ASSERT(args.length() == 2);
10076 CONVERT_CHECKED(String, format, args[0]); 10076 CONVERT_CHECKED(String, format, args[0]);
10077 CONVERT_CHECKED(JSArray, elms, args[1]); 10077 CONVERT_CHECKED(JSArray, elms, args[1]);
10078 Vector<const char> chars = format->ToAsciiVector(); 10078 Vector<const char> chars = format->ToAsciiVector();
10079 Logger::LogRuntime(chars, elms); 10079 Logger::LogRuntime(chars, elms);
10080 return Heap::undefined_value(); 10080 return Heap::undefined_value();
10081 } 10081 }
10082 10082
10083 10083
10084 static Object* Runtime_IS_VAR(Arguments args) { 10084 static Object* Runtime_IS_VAR(Arguments args) {
10085 UNREACHABLE(); // implemented as macro in the parser 10085 UNREACHABLE(); // implemented as macro in the parser
10086 return NULL; 10086 return NULL;
10087 } 10087 }
10088 10088
10089 10089
10090 // ---------------------------------------------------------------------------- 10090 // ----------------------------------------------------------------------------
10091 // Implementation of Runtime 10091 // Implementation of Runtime
10092 10092
10093 #define F(name, nargs, ressize) \ 10093 #define F(name, number_of_args, result_size) \
10094 { #name, FUNCTION_ADDR(Runtime_##name), nargs, \ 10094 { Runtime::k##name, Runtime::RUNTIME, #name, \
10095 static_cast<int>(Runtime::k##name), ressize }, 10095 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size },
10096 10096
10097 static Runtime::Function Runtime_functions[] = { 10097
10098 #define I(name, number_of_args, result_size) \
10099 { Runtime::kInline##name, Runtime::INLINE, \
10100 "_" #name, NULL, number_of_args, result_size },
10101
10102 Runtime::Function kIntrinsicFunctions[] = {
10098 RUNTIME_FUNCTION_LIST(F) 10103 RUNTIME_FUNCTION_LIST(F)
10099 { NULL, NULL, 0, -1, 0 } 10104 INLINE_FUNCTION_LIST(I)
10105 INLINE_RUNTIME_FUNCTION_LIST(I)
10100 }; 10106 };
10101 10107
10102 #undef F 10108
10109 const int Runtime::kNotFound;
10103 10110
10104 10111
10105 Runtime::Function* Runtime::FunctionForId(FunctionId fid) { 10112 Object* Runtime::InitializeIntrinsicFunctionNames(Object* dictionary) {
10106 ASSERT(0 <= fid && fid < kNofFunctions); 10113 ASSERT(dictionary != NULL);
10107 return &Runtime_functions[fid]; 10114 ASSERT(StringDictionary::cast(dictionary)->NumberOfElements() == 0);
10115 for (int i = 0; i < kNumFunctions; ++i) {
10116 Object* name_symbol = Heap::LookupAsciiSymbol(kIntrinsicFunctions[i].name);
10117 if (name_symbol->IsFailure()) return name_symbol;
10118 StringDictionary* string_dictionary = StringDictionary::cast(dictionary);
10119 dictionary = string_dictionary->Add(String::cast(name_symbol),
10120 Smi::FromInt(i),
10121 PropertyDetails(NONE, NORMAL));
10122 // Non-recoverable failure. Calling code must restart heap initialization.
10123 if (dictionary->IsFailure()) return dictionary;
10124 }
10125 return dictionary;
10108 } 10126 }
10109 10127
10110 10128
10111 Runtime::Function* Runtime::FunctionForName(Vector<const char> name) { 10129 Runtime::Function* Runtime::FunctionForSymbol(Handle<String> name) {
10112 for (Function* f = Runtime_functions; f->name != NULL; f++) { 10130 int entry = Heap::intrinsic_function_names()->FindEntry(*name);
10113 if (strncmp(f->name, name.start(), name.length()) == 0 10131 if (entry != kNotFound) {
10114 && f->name[name.length()] == 0) { 10132 Object* smi_index = Heap::intrinsic_function_names()->ValueAt(entry);
10115 return f; 10133 int function_index = Smi::cast(smi_index)->value();
10116 } 10134 return &(kIntrinsicFunctions[function_index]);
10117 } 10135 }
10118 return NULL; 10136 return NULL;
10119 } 10137 }
10120 10138
10121 10139
10140 Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
10141 return &(kIntrinsicFunctions[static_cast<int>(id)]);
10142 }
10143
10144
10122 void Runtime::PerformGC(Object* result) { 10145 void Runtime::PerformGC(Object* result) {
10123 Failure* failure = Failure::cast(result); 10146 Failure* failure = Failure::cast(result);
10124 if (failure->IsRetryAfterGC()) { 10147 if (failure->IsRetryAfterGC()) {
10125 // Try to do a garbage collection; ignore it if it fails. The C 10148 // Try to do a garbage collection; ignore it if it fails. The C
10126 // entry stub will throw an out-of-memory exception in that case. 10149 // entry stub will throw an out-of-memory exception in that case.
10127 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); 10150 Heap::CollectGarbage(failure->requested(), failure->allocation_space());
10128 } else { 10151 } else {
10129 // Handle last resort GC and make sure to allow future allocations 10152 // Handle last resort GC and make sure to allow future allocations
10130 // to grow the heap without causing GCs (if possible). 10153 // to grow the heap without causing GCs (if possible).
10131 Counters::gc_last_resort_from_js.Increment(); 10154 Counters::gc_last_resort_from_js.Increment();
10132 Heap::CollectAllGarbage(false); 10155 Heap::CollectAllGarbage(false);
10133 } 10156 }
10134 } 10157 }
10135 10158
10136 10159
10137 } } // namespace v8::internal 10160 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/x64/codegen-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698