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

Side by Side Diff: src/ic.cc

Issue 136443006: Remove special charAt and charCodeAt handling in the ICs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebase Created 6 years, 11 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/ic.h ('k') | src/mips/stub-cache-mips.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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 if (proto->IsNull()) { 224 if (proto->IsNull()) {
225 ASSERT(!lookup->IsFound()); 225 ASSERT(!lookup->IsFound());
226 return; 226 return;
227 } 227 }
228 228
229 object = proto; 229 object = proto;
230 } 230 }
231 } 231 }
232 232
233 233
234 bool CallIC::TryUpdateExtraICState(LookupResult* lookup,
235 Handle<Object> object) {
236 if (!lookup->IsConstantFunction()) return false;
237 JSFunction* function = lookup->GetConstantFunction();
238 if (!function->shared()->HasBuiltinFunctionId()) return false;
239
240 // Fetch the arguments passed to the called function.
241 const int argc = target()->arguments_count();
242 Address entry = isolate()->c_entry_fp(isolate()->thread_local_top());
243 Address fp = Memory::Address_at(entry + ExitFrameConstants::kCallerFPOffset);
244 Arguments args(argc + 1,
245 &Memory::Object_at(fp +
246 StandardFrameConstants::kCallerSPOffset +
247 argc * kPointerSize));
248 switch (function->shared()->builtin_function_id()) {
249 case kStringCharCodeAt:
250 case kStringCharAt:
251 if (object->IsString()) {
252 String* string = String::cast(*object);
253 // Check there's the right string value or wrapper in the receiver slot.
254 ASSERT(string == args[0] || string == JSValue::cast(args[0])->value());
255 // If we're in the default (fastest) state and the index is
256 // out of bounds, update the state to record this fact.
257 if (StringStubState::decode(extra_ic_state()) == DEFAULT_STRING_STUB &&
258 argc >= 1 && args[1]->IsNumber()) {
259 double index = DoubleToInteger(args.number_at(1));
260 if (index < 0 || index >= string->length()) {
261 set_extra_ic_state(StringStubState::update(extra_ic_state(),
262 STRING_INDEX_OUT_OF_BOUNDS));
263 return true;
264 }
265 }
266 }
267 break;
268 default:
269 return false;
270 }
271 return false;
272 }
273
274
275 bool IC::TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, 234 bool IC::TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
276 Handle<String> name) { 235 Handle<String> name) {
277 if (target()->is_call_stub()) {
278 LookupResult lookup(isolate());
279 LookupForRead(receiver, name, &lookup);
280 if (static_cast<CallIC*>(this)->TryUpdateExtraICState(&lookup, receiver)) {
281 return true;
282 }
283 }
284
285 if (target()->is_keyed_stub()) { 236 if (target()->is_keyed_stub()) {
286 // Determine whether the failure is due to a name failure. 237 // Determine whether the failure is due to a name failure.
287 if (!name->IsName()) return false; 238 if (!name->IsName()) return false;
288 Name* stub_name = target()->FindFirstName(); 239 Name* stub_name = target()->FindFirstName();
289 if (*name != stub_name) return false; 240 if (*name != stub_name) return false;
290 } 241 }
291 242
292 InlineCacheHolderFlag cache_holder = 243 InlineCacheHolderFlag cache_holder =
293 Code::ExtractCacheHolderFromFlags(target()->flags()); 244 Code::ExtractCacheHolderFromFlags(target()->flags());
294 245
(...skipping 2923 matching lines...) Expand 10 before | Expand all | Expand 10 after
3218 #undef ADDR 3169 #undef ADDR
3219 }; 3170 };
3220 3171
3221 3172
3222 Address IC::AddressFromUtilityId(IC::UtilityId id) { 3173 Address IC::AddressFromUtilityId(IC::UtilityId id) {
3223 return IC_utilities[id]; 3174 return IC_utilities[id];
3224 } 3175 }
3225 3176
3226 3177
3227 } } // namespace v8::internal 3178 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ic.h ('k') | src/mips/stub-cache-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698