OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 case kStringCharCodeAt: | 571 case kStringCharCodeAt: |
572 case kStringCharAt: | 572 case kStringCharAt: |
573 if (object->IsString()) { | 573 if (object->IsString()) { |
574 String* string = String::cast(*object); | 574 String* string = String::cast(*object); |
575 // Check there's the right string value or wrapper in the receiver slot. | 575 // Check there's the right string value or wrapper in the receiver slot. |
576 ASSERT(string == args[0] || string == JSValue::cast(args[0])->value()); | 576 ASSERT(string == args[0] || string == JSValue::cast(args[0])->value()); |
577 // If we're in the default (fastest) state and the index is | 577 // If we're in the default (fastest) state and the index is |
578 // out of bounds, update the state to record this fact. | 578 // out of bounds, update the state to record this fact. |
579 if (StringStubState::decode(*extra_ic_state) == DEFAULT_STRING_STUB && | 579 if (StringStubState::decode(*extra_ic_state) == DEFAULT_STRING_STUB && |
580 argc >= 1 && args[1]->IsNumber()) { | 580 argc >= 1 && args[1]->IsNumber()) { |
581 double index; | 581 double index = DoubleToInteger(args.number_at(1)); |
582 if (args[1]->IsSmi()) { | |
583 index = Smi::cast(args[1])->value(); | |
584 } else { | |
585 ASSERT(args[1]->IsHeapNumber()); | |
586 index = DoubleToInteger(HeapNumber::cast(args[1])->value()); | |
587 } | |
588 if (index < 0 || index >= string->length()) { | 582 if (index < 0 || index >= string->length()) { |
589 *extra_ic_state = | 583 *extra_ic_state = |
590 StringStubState::update(*extra_ic_state, | 584 StringStubState::update(*extra_ic_state, |
591 STRING_INDEX_OUT_OF_BOUNDS); | 585 STRING_INDEX_OUT_OF_BOUNDS); |
592 return true; | 586 return true; |
593 } | 587 } |
594 } | 588 } |
595 } | 589 } |
596 break; | 590 break; |
597 default: | 591 default: |
(...skipping 1689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2287 | 2281 |
2288 return GENERIC; | 2282 return GENERIC; |
2289 } | 2283 } |
2290 | 2284 |
2291 | 2285 |
2292 RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) { | 2286 RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) { |
2293 ASSERT(args.length() == 4); | 2287 ASSERT(args.length() == 4); |
2294 | 2288 |
2295 HandleScope scope(isolate); | 2289 HandleScope scope(isolate); |
2296 Handle<Object> operand = args.at<Object>(0); | 2290 Handle<Object> operand = args.at<Object>(0); |
2297 int key = Smi::cast(args[1])->value(); | 2291 int key = args.smi_at(1); |
2298 Token::Value op = static_cast<Token::Value>(Smi::cast(args[2])->value()); | 2292 Token::Value op = static_cast<Token::Value>(args.smi_at(2)); |
2299 UnaryOpIC::TypeInfo previous_type = | 2293 UnaryOpIC::TypeInfo previous_type = |
2300 static_cast<UnaryOpIC::TypeInfo>(Smi::cast(args[3])->value()); | 2294 static_cast<UnaryOpIC::TypeInfo>(args.smi_at(3)); |
2301 | 2295 |
2302 UnaryOpIC::TypeInfo type = UnaryOpIC::GetTypeInfo(operand); | 2296 UnaryOpIC::TypeInfo type = UnaryOpIC::GetTypeInfo(operand); |
2303 type = UnaryOpIC::ComputeNewType(type, previous_type); | 2297 type = UnaryOpIC::ComputeNewType(type, previous_type); |
2304 | 2298 |
2305 UnaryOpStub stub(key, type); | 2299 UnaryOpStub stub(key, type); |
2306 Handle<Code> code = stub.GetCode(); | 2300 Handle<Code> code = stub.GetCode(); |
2307 if (!code.is_null()) { | 2301 if (!code.is_null()) { |
2308 if (FLAG_trace_ic) { | 2302 if (FLAG_trace_ic) { |
2309 PrintF("[UnaryOpIC (%s->%s)#%s]\n", | 2303 PrintF("[UnaryOpIC (%s->%s)#%s]\n", |
2310 UnaryOpIC::GetName(previous_type), | 2304 UnaryOpIC::GetName(previous_type), |
(...skipping 28 matching lines...) Expand all Loading... |
2339 } | 2333 } |
2340 return *result; | 2334 return *result; |
2341 } | 2335 } |
2342 | 2336 |
2343 RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { | 2337 RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { |
2344 ASSERT(args.length() == 5); | 2338 ASSERT(args.length() == 5); |
2345 | 2339 |
2346 HandleScope scope(isolate); | 2340 HandleScope scope(isolate); |
2347 Handle<Object> left = args.at<Object>(0); | 2341 Handle<Object> left = args.at<Object>(0); |
2348 Handle<Object> right = args.at<Object>(1); | 2342 Handle<Object> right = args.at<Object>(1); |
2349 int key = Smi::cast(args[2])->value(); | 2343 int key = args.smi_at(2); |
2350 Token::Value op = static_cast<Token::Value>(Smi::cast(args[3])->value()); | 2344 Token::Value op = static_cast<Token::Value>(args.smi_at(3)); |
2351 BinaryOpIC::TypeInfo previous_type = | 2345 BinaryOpIC::TypeInfo previous_type = |
2352 static_cast<BinaryOpIC::TypeInfo>(Smi::cast(args[4])->value()); | 2346 static_cast<BinaryOpIC::TypeInfo>(args.smi_at(4)); |
2353 | 2347 |
2354 BinaryOpIC::TypeInfo type = BinaryOpIC::GetTypeInfo(left, right); | 2348 BinaryOpIC::TypeInfo type = BinaryOpIC::GetTypeInfo(left, right); |
2355 type = BinaryOpIC::JoinTypes(type, previous_type); | 2349 type = BinaryOpIC::JoinTypes(type, previous_type); |
2356 BinaryOpIC::TypeInfo result_type = BinaryOpIC::UNINITIALIZED; | 2350 BinaryOpIC::TypeInfo result_type = BinaryOpIC::UNINITIALIZED; |
2357 if ((type == BinaryOpIC::STRING || type == BinaryOpIC::BOTH_STRING) && | 2351 if ((type == BinaryOpIC::STRING || type == BinaryOpIC::BOTH_STRING) && |
2358 op != Token::ADD) { | 2352 op != Token::ADD) { |
2359 type = BinaryOpIC::GENERIC; | 2353 type = BinaryOpIC::GENERIC; |
2360 } | 2354 } |
2361 if (type == BinaryOpIC::SMI && previous_type == BinaryOpIC::SMI) { | 2355 if (type == BinaryOpIC::SMI && previous_type == BinaryOpIC::SMI) { |
2362 if (op == Token::DIV || | 2356 if (op == Token::DIV || |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2502 if (state == UNINITIALIZED && | 2496 if (state == UNINITIALIZED && |
2503 x->IsJSObject() && y->IsJSObject()) return OBJECTS; | 2497 x->IsJSObject() && y->IsJSObject()) return OBJECTS; |
2504 return GENERIC; | 2498 return GENERIC; |
2505 } | 2499 } |
2506 | 2500 |
2507 | 2501 |
2508 // Used from ic_<arch>.cc. | 2502 // Used from ic_<arch>.cc. |
2509 RUNTIME_FUNCTION(Code*, CompareIC_Miss) { | 2503 RUNTIME_FUNCTION(Code*, CompareIC_Miss) { |
2510 NoHandleAllocation na; | 2504 NoHandleAllocation na; |
2511 ASSERT(args.length() == 3); | 2505 ASSERT(args.length() == 3); |
2512 CompareIC ic(isolate, static_cast<Token::Value>(Smi::cast(args[2])->value())); | 2506 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2))); |
2513 ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); | 2507 ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1)); |
2514 return ic.target(); | 2508 return ic.target(); |
2515 } | 2509 } |
2516 | 2510 |
2517 | 2511 |
2518 static const Address IC_utilities[] = { | 2512 static const Address IC_utilities[] = { |
2519 #define ADDR(name) FUNCTION_ADDR(name), | 2513 #define ADDR(name) FUNCTION_ADDR(name), |
2520 IC_UTIL_LIST(ADDR) | 2514 IC_UTIL_LIST(ADDR) |
2521 NULL | 2515 NULL |
2522 #undef ADDR | 2516 #undef ADDR |
2523 }; | 2517 }; |
2524 | 2518 |
2525 | 2519 |
2526 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2520 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
2527 return IC_utilities[id]; | 2521 return IC_utilities[id]; |
2528 } | 2522 } |
2529 | 2523 |
2530 | 2524 |
2531 } } // namespace v8::internal | 2525 } } // namespace v8::internal |
OLD | NEW |