Index: src/ic.cc |
=================================================================== |
--- src/ic.cc (revision 5022) |
+++ src/ic.cc (working copy) |
@@ -1639,16 +1639,15 @@ |
Object* BinaryOp_Patch(Arguments args) { |
- ASSERT(args.length() == 6); |
+ ASSERT(args.length() == 5); |
Handle<Object> left = args.at<Object>(0); |
Handle<Object> right = args.at<Object>(1); |
- Handle<Object> result = args.at<Object>(2); |
- int key = Smi::cast(args[3])->value(); |
+ int key = Smi::cast(args[2])->value(); |
+ Token::Value op = static_cast<Token::Value>(Smi::cast(args[3])->value()); |
#ifdef DEBUG |
- Token::Value op = static_cast<Token::Value>(Smi::cast(args[4])->value()); |
BinaryOpIC::TypeInfo prev_type_info = |
- static_cast<BinaryOpIC::TypeInfo>(Smi::cast(args[5])->value()); |
+ static_cast<BinaryOpIC::TypeInfo>(Smi::cast(args[4])->value()); |
#endif // DEBUG |
{ HandleScope scope; |
BinaryOpIC::TypeInfo type_info = BinaryOpIC::GetTypeInfo(*left, *right); |
@@ -1667,6 +1666,61 @@ |
} |
} |
+ HandleScope scope; |
+ Handle<JSBuiltinsObject> builtins = Top::builtins(); |
+ |
+ Object* builtin = NULL; // Initialization calms down the compiler. |
+ |
+ switch (op) { |
+ case Token::ADD: |
+ builtin = builtins->javascript_builtin(Builtins::ADD); |
+ break; |
+ case Token::SUB: |
+ builtin = builtins->javascript_builtin(Builtins::SUB); |
+ break; |
+ case Token::MUL: |
+ builtin = builtins->javascript_builtin(Builtins::MUL); |
+ break; |
+ case Token::DIV: |
+ builtin = builtins->javascript_builtin(Builtins::DIV); |
+ break; |
+ case Token::MOD: |
+ builtin = builtins->javascript_builtin(Builtins::MOD); |
+ break; |
+ case Token::BIT_AND: |
+ builtin = builtins->javascript_builtin(Builtins::BIT_AND); |
+ break; |
+ case Token::BIT_OR: |
+ builtin = builtins->javascript_builtin(Builtins::BIT_OR); |
+ break; |
+ case Token::BIT_XOR: |
+ builtin = builtins->javascript_builtin(Builtins::BIT_XOR); |
+ break; |
+ case Token::SHR: |
+ builtin = builtins->javascript_builtin(Builtins::SHR); |
+ break; |
+ case Token::SAR: |
+ builtin = builtins->javascript_builtin(Builtins::SAR); |
+ break; |
+ case Token::SHL: |
+ builtin = builtins->javascript_builtin(Builtins::SHL); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ |
+ Handle<JSFunction> builtin_function(JSFunction::cast(builtin)); |
+ |
+ bool caught_exception; |
+ Object** builtin_args[] = { right.location() }; |
+ Handle<Object> result = Execution::Call(builtin_function, |
+ left, |
+ ARRAY_SIZE(builtin_args), |
+ builtin_args, |
+ &caught_exception); |
+ if (caught_exception) { |
+ return Failure::Exception(); |
+ } |
return *result; |
} |