Chromium Code Reviews| Index: vm/code_generator_ia32.cc |
| =================================================================== |
| --- vm/code_generator_ia32.cc (revision 2318) |
| +++ vm/code_generator_ia32.cc (working copy) |
| @@ -426,16 +426,28 @@ |
| intptr_t token_index, |
| const String& function_name, |
| int num_arguments, |
| - const Array& optional_arguments_names) { |
| + const Array& optional_arguments_names, |
| + intptr_t num_checks) { |
| + ASSERT(num_checks > 0); // At least receiver check is necessary. |
| // Set up the function name and number of arguments (including the receiver) |
| // to the InstanceCall stub which will resolve the correct entrypoint for |
| // the operator and call it. |
| - ICData ic_data(function_name, 1); |
| + ICData ic_data(function_name, num_checks); |
| __ LoadObject(ECX, Array::ZoneHandle(ic_data.data())); |
| __ LoadObject(EDX, ArgumentsDescriptor(num_arguments, |
| optional_arguments_names)); |
| - ExternalLabel target_label( |
| - "InlineCache", StubCode::InlineCacheEntryPoint()); |
| + uword label_address = 0; |
| + switch (num_checks) { |
| + case 1: |
| + label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); |
| + break; |
| + case 2: |
| + label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); |
| + break; |
| + default: |
| + UNIMPLEMENTED(); |
| + } |
| + ExternalLabel target_label("InlineCache", label_address); |
| __ call(&target_label); |
| AddCurrentDescriptor(PcDescriptors::kIcCall, |
| @@ -1054,7 +1066,8 @@ |
| token_index, |
| operator_name, |
| kNumArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 1); |
|
regis
2011/12/09 23:08:03
Declaring a constant as for kNumArguments and kNoA
srdjan
2011/12/12 17:19:33
Added const int kNumArgumentsChecked
|
| } |
| @@ -1099,7 +1112,8 @@ |
| token_index, |
| operator_name, |
| kNumArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 1); |
|
regis
2011/12/09 23:08:03
ditto and ditto for all other instances below.
srdjan
2011/12/12 17:19:33
Done.
|
| } |
| @@ -1191,7 +1205,8 @@ |
| node->token_index(), |
| operator_name, |
| kNumberOfArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 1); |
| if (IsResultNeeded(node)) { |
| __ pushl(EAX); |
| } |
| @@ -1818,7 +1833,8 @@ |
| node->token_index(), |
| operator_name, |
| kNumberOfArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 1); |
| // Result is in EAX. No need to negate if result is not needed. |
| if ((node->kind() == Token::kNE) && IsResultNeeded(node)) { |
| @@ -2085,7 +2101,8 @@ |
| token_index, |
| operator_name, |
| kNumberOfArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 2); |
| } |
| @@ -2189,7 +2206,8 @@ |
| node->token_index(), |
| node->function_name(), |
| number_of_arguments, |
| - node->arguments()->names()); |
| + node->arguments()->names(), |
| + 1); |
| // Result is in EAX. |
| if (IsResultNeeded(node)) { |
| __ pushl(EAX); |
| @@ -2443,7 +2461,8 @@ |
| token_index, |
| getter_name, |
| kNumberOfArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 1); |
| } |
| @@ -2471,7 +2490,8 @@ |
| token_index, |
| setter_name, |
| kNumberOfArguments, |
| - kNoArgumentNames); |
| + kNoArgumentNames, |
| + 1); |
| } |