| OLD | NEW | 
|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 168                              bool is_eval) | 168                              bool is_eval) | 
| 169     : is_eval_(is_eval), | 169     : is_eval_(is_eval), | 
| 170       script_(script), | 170       script_(script), | 
| 171       deferred_(8), | 171       deferred_(8), | 
| 172       masm_(new MacroAssembler(NULL, buffer_size)), | 172       masm_(new MacroAssembler(NULL, buffer_size)), | 
| 173       scope_(NULL), | 173       scope_(NULL), | 
| 174       frame_(NULL), | 174       frame_(NULL), | 
| 175       cc_reg_(no_condition), | 175       cc_reg_(no_condition), | 
| 176       state_(NULL), | 176       state_(NULL), | 
| 177       is_inside_try_(false), | 177       is_inside_try_(false), | 
| 178       break_stack_height_(0) { | 178       break_stack_height_(0), | 
|  | 179       loop_nesting_(0) { | 
| 179 } | 180 } | 
| 180 | 181 | 
| 181 | 182 | 
| 182 // Calling conventions: | 183 // Calling conventions: | 
| 183 // ebp: frame pointer | 184 // ebp: frame pointer | 
| 184 // esp: stack pointer | 185 // esp: stack pointer | 
| 185 // edi: caller's parameter pointer | 186 // edi: caller's parameter pointer | 
| 186 // esi: callee's context | 187 // esi: callee's context | 
| 187 | 188 | 
| 188 void CodeGenerator::GenCode(FunctionLiteral* fun) { | 189 void CodeGenerator::GenCode(FunctionLiteral* fun) { | 
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 779     // deferred->exit() is bound. | 780     // deferred->exit() is bound. | 
| 780     __ push(eax); | 781     __ push(eax); | 
| 781   } | 782   } | 
| 782 | 783 | 
| 783  private: | 784  private: | 
| 784   GenericBinaryOpStub stub_; | 785   GenericBinaryOpStub stub_; | 
| 785 }; | 786 }; | 
| 786 | 787 | 
| 787 | 788 | 
| 788 void CodeGenerator::GenericBinaryOperation(Token::Value op, | 789 void CodeGenerator::GenericBinaryOperation(Token::Value op, | 
|  | 790                                            StaticType* type, | 
| 789                                            OverwriteMode overwrite_mode) { | 791                                            OverwriteMode overwrite_mode) { | 
| 790   Comment cmnt(masm_, "[ BinaryOperation"); | 792   Comment cmnt(masm_, "[ BinaryOperation"); | 
| 791   Comment cmnt_token(masm_, Token::String(op)); | 793   Comment cmnt_token(masm_, Token::String(op)); | 
| 792 | 794 | 
| 793   if (op == Token::COMMA) { | 795   if (op == Token::COMMA) { | 
| 794     // Simply discard left value. | 796     // Simply discard left value. | 
| 795     frame_->Pop(eax); | 797     frame_->Pop(eax); | 
| 796     frame_->Pop(); | 798     frame_->Pop(); | 
| 797     frame_->Push(eax); | 799     frame_->Push(eax); | 
| 798     return; | 800     return; | 
| 799   } | 801   } | 
| 800 | 802 | 
| 801   // For now, we keep the old behavior and only inline the smi code | 803   // For now, we keep the old behavior and only inline the smi code | 
| 802   // for the bitwise operations. | 804   // for the bitwise operations. | 
| 803   GenericBinaryFlags flags; | 805   GenericBinaryFlags flags; | 
| 804   switch (op) { | 806   switch (op) { | 
| 805     case Token::BIT_OR: | 807     case Token::BIT_OR: | 
| 806     case Token::BIT_AND: | 808     case Token::BIT_AND: | 
| 807     case Token::BIT_XOR: | 809     case Token::BIT_XOR: | 
| 808     case Token::SHL: | 810     case Token::SHL: | 
| 809     case Token::SHR: | 811     case Token::SHR: | 
| 810     case Token::SAR: | 812     case Token::SAR: | 
| 811       flags = SMI_CODE_INLINED; | 813       // Bit operations always assume they likely operate on Smis. Still only | 
|  | 814       // generate the inline Smi check code if this operation is part of a loop. | 
|  | 815       flags = (loop_nesting() > 0) | 
|  | 816               ? SMI_CODE_INLINED | 
|  | 817               : SMI_CODE_IN_STUB; | 
| 812       break; | 818       break; | 
| 813 | 819 | 
| 814     default: | 820     default: | 
| 815       flags = SMI_CODE_IN_STUB; | 821       // By default only inline the Smi check code for likely smis if this | 
|  | 822       // operation is part of a loop. | 
|  | 823       flags = ((loop_nesting() > 0) && type->IsLikelySmi()) | 
|  | 824               ? SMI_CODE_INLINED | 
|  | 825               : SMI_CODE_IN_STUB; | 
| 816       break; | 826       break; | 
| 817   } | 827   } | 
| 818 | 828 | 
| 819   if (flags == SMI_CODE_INLINED) { | 829   if (flags == SMI_CODE_INLINED) { | 
| 820     // Create a new deferred code for the slow-case part. | 830     // Create a new deferred code for the slow-case part. | 
| 821     DeferredInlineBinaryOperation* deferred = | 831     DeferredInlineBinaryOperation* deferred = | 
| 822         new DeferredInlineBinaryOperation(this, op, overwrite_mode, flags); | 832         new DeferredInlineBinaryOperation(this, op, overwrite_mode, flags); | 
| 823     // Fetch the operands from the stack. | 833     // Fetch the operands from the stack. | 
| 824     frame_->Pop(ebx);  // get y | 834     frame_->Pop(ebx);  // get y | 
| 825     __ mov(eax, frame_->Top());  // get x | 835     __ mov(eax, frame_->Top());  // get x | 
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 978     __ CallStub(&igostub); | 988     __ CallStub(&igostub); | 
| 979   } | 989   } | 
| 980 | 990 | 
| 981  private: | 991  private: | 
| 982   Register tos_reg_; | 992   Register tos_reg_; | 
| 983   OverwriteMode overwrite_mode_; | 993   OverwriteMode overwrite_mode_; | 
| 984 }; | 994 }; | 
| 985 | 995 | 
| 986 | 996 | 
| 987 void CodeGenerator::SmiOperation(Token::Value op, | 997 void CodeGenerator::SmiOperation(Token::Value op, | 
|  | 998                                  StaticType* type, | 
| 988                                  Handle<Object> value, | 999                                  Handle<Object> value, | 
| 989                                  bool reversed, | 1000                                  bool reversed, | 
| 990                                  OverwriteMode overwrite_mode) { | 1001                                  OverwriteMode overwrite_mode) { | 
| 991   // NOTE: This is an attempt to inline (a bit) more of the code for | 1002   // NOTE: This is an attempt to inline (a bit) more of the code for | 
| 992   // some possible smi operations (like + and -) when (at least) one | 1003   // some possible smi operations (like + and -) when (at least) one | 
| 993   // of the operands is a literal smi. With this optimization, the | 1004   // of the operands is a literal smi. With this optimization, the | 
| 994   // performance of the system is increased by ~15%, and the generated | 1005   // performance of the system is increased by ~15%, and the generated | 
| 995   // code size is increased by ~1% (measured on a combination of | 1006   // code size is increased by ~1% (measured on a combination of | 
| 996   // different benchmarks). | 1007   // different benchmarks). | 
| 997 | 1008 | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1039       __ bind(deferred->exit()); | 1050       __ bind(deferred->exit()); | 
| 1040       frame_->Push(eax); | 1051       frame_->Push(eax); | 
| 1041       break; | 1052       break; | 
| 1042     } | 1053     } | 
| 1043 | 1054 | 
| 1044     case Token::SAR: { | 1055     case Token::SAR: { | 
| 1045       if (reversed) { | 1056       if (reversed) { | 
| 1046         frame_->Pop(eax); | 1057         frame_->Pop(eax); | 
| 1047         frame_->Push(Immediate(value)); | 1058         frame_->Push(Immediate(value)); | 
| 1048         frame_->Push(eax); | 1059         frame_->Push(eax); | 
| 1049         GenericBinaryOperation(op, overwrite_mode); | 1060         GenericBinaryOperation(op, type, overwrite_mode); | 
| 1050       } else { | 1061       } else { | 
| 1051         int shift_value = int_value & 0x1f;  // only least significant 5 bits | 1062         int shift_value = int_value & 0x1f;  // only least significant 5 bits | 
| 1052         DeferredCode* deferred = | 1063         DeferredCode* deferred = | 
| 1053           new DeferredInlinedSmiOperation(this, Token::SAR, shift_value, | 1064           new DeferredInlinedSmiOperation(this, Token::SAR, shift_value, | 
| 1054                                           overwrite_mode); | 1065                                           overwrite_mode); | 
| 1055         frame_->Pop(eax); | 1066         frame_->Pop(eax); | 
| 1056         __ test(eax, Immediate(kSmiTagMask)); | 1067         __ test(eax, Immediate(kSmiTagMask)); | 
| 1057         __ j(not_zero, deferred->enter(), not_taken); | 1068         __ j(not_zero, deferred->enter(), not_taken); | 
| 1058         __ sar(eax, shift_value); | 1069         __ sar(eax, shift_value); | 
| 1059         __ and_(eax, ~kSmiTagMask); | 1070         __ and_(eax, ~kSmiTagMask); | 
| 1060         __ bind(deferred->exit()); | 1071         __ bind(deferred->exit()); | 
| 1061         frame_->Push(eax); | 1072         frame_->Push(eax); | 
| 1062       } | 1073       } | 
| 1063       break; | 1074       break; | 
| 1064     } | 1075     } | 
| 1065 | 1076 | 
| 1066     case Token::SHR: { | 1077     case Token::SHR: { | 
| 1067       if (reversed) { | 1078       if (reversed) { | 
| 1068         frame_->Pop(eax); | 1079         frame_->Pop(eax); | 
| 1069         frame_->Push(Immediate(value)); | 1080         frame_->Push(Immediate(value)); | 
| 1070         frame_->Push(eax); | 1081         frame_->Push(eax); | 
| 1071         GenericBinaryOperation(op, overwrite_mode); | 1082         GenericBinaryOperation(op, type, overwrite_mode); | 
| 1072       } else { | 1083       } else { | 
| 1073         int shift_value = int_value & 0x1f;  // only least significant 5 bits | 1084         int shift_value = int_value & 0x1f;  // only least significant 5 bits | 
| 1074         DeferredCode* deferred = | 1085         DeferredCode* deferred = | 
| 1075         new DeferredInlinedSmiOperation(this, Token::SHR, shift_value, | 1086         new DeferredInlinedSmiOperation(this, Token::SHR, shift_value, | 
| 1076                                         overwrite_mode); | 1087                                         overwrite_mode); | 
| 1077         frame_->Pop(eax); | 1088         frame_->Pop(eax); | 
| 1078         __ test(eax, Immediate(kSmiTagMask)); | 1089         __ test(eax, Immediate(kSmiTagMask)); | 
| 1079         __ mov(ebx, Operand(eax)); | 1090         __ mov(ebx, Operand(eax)); | 
| 1080         __ j(not_zero, deferred->enter(), not_taken); | 1091         __ j(not_zero, deferred->enter(), not_taken); | 
| 1081         __ sar(ebx, kSmiTagSize); | 1092         __ sar(ebx, kSmiTagSize); | 
| 1082         __ shr(ebx, shift_value); | 1093         __ shr(ebx, shift_value); | 
| 1083         __ test(ebx, Immediate(0xc0000000)); | 1094         __ test(ebx, Immediate(0xc0000000)); | 
| 1084         __ j(not_zero, deferred->enter(), not_taken); | 1095         __ j(not_zero, deferred->enter(), not_taken); | 
| 1085         // tag result and store it in TOS (eax) | 1096         // tag result and store it in TOS (eax) | 
| 1086         ASSERT(kSmiTagSize == times_2);  // adjust code if not the case | 1097         ASSERT(kSmiTagSize == times_2);  // adjust code if not the case | 
| 1087         __ lea(eax, Operand(ebx, times_2, kSmiTag)); | 1098         __ lea(eax, Operand(ebx, times_2, kSmiTag)); | 
| 1088         __ bind(deferred->exit()); | 1099         __ bind(deferred->exit()); | 
| 1089         frame_->Push(eax); | 1100         frame_->Push(eax); | 
| 1090       } | 1101       } | 
| 1091       break; | 1102       break; | 
| 1092     } | 1103     } | 
| 1093 | 1104 | 
| 1094     case Token::SHL: { | 1105     case Token::SHL: { | 
| 1095       if (reversed) { | 1106       if (reversed) { | 
| 1096         frame_->Pop(eax); | 1107         frame_->Pop(eax); | 
| 1097         frame_->Push(Immediate(value)); | 1108         frame_->Push(Immediate(value)); | 
| 1098         frame_->Push(eax); | 1109         frame_->Push(eax); | 
| 1099         GenericBinaryOperation(op, overwrite_mode); | 1110         GenericBinaryOperation(op, type, overwrite_mode); | 
| 1100       } else { | 1111       } else { | 
| 1101         int shift_value = int_value & 0x1f;  // only least significant 5 bits | 1112         int shift_value = int_value & 0x1f;  // only least significant 5 bits | 
| 1102         DeferredCode* deferred = | 1113         DeferredCode* deferred = | 
| 1103         new DeferredInlinedSmiOperation(this, Token::SHL, shift_value, | 1114         new DeferredInlinedSmiOperation(this, Token::SHL, shift_value, | 
| 1104                                         overwrite_mode); | 1115                                         overwrite_mode); | 
| 1105         frame_->Pop(eax); | 1116         frame_->Pop(eax); | 
| 1106         __ test(eax, Immediate(kSmiTagMask)); | 1117         __ test(eax, Immediate(kSmiTagMask)); | 
| 1107         __ mov(ebx, Operand(eax)); | 1118         __ mov(ebx, Operand(eax)); | 
| 1108         __ j(not_zero, deferred->enter(), not_taken); | 1119         __ j(not_zero, deferred->enter(), not_taken); | 
| 1109         __ sar(ebx, kSmiTagSize); | 1120         __ sar(ebx, kSmiTagSize); | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1148     } | 1159     } | 
| 1149 | 1160 | 
| 1150     default: { | 1161     default: { | 
| 1151       if (!reversed) { | 1162       if (!reversed) { | 
| 1152         frame_->Push(Immediate(value)); | 1163         frame_->Push(Immediate(value)); | 
| 1153       } else { | 1164       } else { | 
| 1154         frame_->Pop(eax); | 1165         frame_->Pop(eax); | 
| 1155         frame_->Push(Immediate(value)); | 1166         frame_->Push(Immediate(value)); | 
| 1156         frame_->Push(eax); | 1167         frame_->Push(eax); | 
| 1157       } | 1168       } | 
| 1158       GenericBinaryOperation(op, overwrite_mode); | 1169       GenericBinaryOperation(op, type, overwrite_mode); | 
| 1159       break; | 1170       break; | 
| 1160     } | 1171     } | 
| 1161   } | 1172   } | 
| 1162 } | 1173 } | 
| 1163 | 1174 | 
| 1164 | 1175 | 
| 1165 class CompareStub: public CodeStub { | 1176 class CompareStub: public CodeStub { | 
| 1166  public: | 1177  public: | 
| 1167   CompareStub(Condition cc, bool strict) : cc_(cc), strict_(strict) { } | 1178   CompareStub(Condition cc, bool strict) : cc_(cc), strict_(strict) { } | 
| 1168 | 1179 | 
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1740 | 1751 | 
| 1741   // init | 1752   // init | 
| 1742   if (node->init() != NULL) { | 1753   if (node->init() != NULL) { | 
| 1743     ASSERT(node->type() == LoopStatement::FOR_LOOP); | 1754     ASSERT(node->type() == LoopStatement::FOR_LOOP); | 
| 1744     Visit(node->init()); | 1755     Visit(node->init()); | 
| 1745   } | 1756   } | 
| 1746   if (node->type() != LoopStatement::DO_LOOP && info != ALWAYS_TRUE) { | 1757   if (node->type() != LoopStatement::DO_LOOP && info != ALWAYS_TRUE) { | 
| 1747     __ jmp(&entry); | 1758     __ jmp(&entry); | 
| 1748   } | 1759   } | 
| 1749 | 1760 | 
|  | 1761   IncrementLoopNesting(); | 
|  | 1762 | 
| 1750   // body | 1763   // body | 
| 1751   __ bind(&loop); | 1764   __ bind(&loop); | 
| 1752   CheckStack();  // TODO(1222600): ignore if body contains calls. | 1765   CheckStack();  // TODO(1222600): ignore if body contains calls. | 
| 1753   Visit(node->body()); | 1766   Visit(node->body()); | 
| 1754 | 1767 | 
| 1755   // next | 1768   // next | 
| 1756   __ bind(node->continue_target()); | 1769   __ bind(node->continue_target()); | 
| 1757   if (node->next() != NULL) { | 1770   if (node->next() != NULL) { | 
| 1758     // Record source position of the statement as this code which is after the | 1771     // Record source position of the statement as this code which is after the | 
| 1759     // code for the body actually belongs to the loop statement and not the | 1772     // code for the body actually belongs to the loop statement and not the | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 1772       break; | 1785       break; | 
| 1773     case ALWAYS_FALSE: | 1786     case ALWAYS_FALSE: | 
| 1774       break; | 1787       break; | 
| 1775     case DONT_KNOW: | 1788     case DONT_KNOW: | 
| 1776       LoadCondition(node->cond(), NOT_INSIDE_TYPEOF, &loop, | 1789       LoadCondition(node->cond(), NOT_INSIDE_TYPEOF, &loop, | 
| 1777                     node->break_target(), true); | 1790                     node->break_target(), true); | 
| 1778       Branch(true, &loop); | 1791       Branch(true, &loop); | 
| 1779       break; | 1792       break; | 
| 1780   } | 1793   } | 
| 1781 | 1794 | 
|  | 1795   DecrementLoopNesting(); | 
|  | 1796 | 
| 1782   // exit | 1797   // exit | 
| 1783   __ bind(node->break_target()); | 1798   __ bind(node->break_target()); | 
| 1784 } | 1799 } | 
| 1785 | 1800 | 
| 1786 | 1801 | 
| 1787 void CodeGenerator::VisitForInStatement(ForInStatement* node) { | 1802 void CodeGenerator::VisitForInStatement(ForInStatement* node) { | 
| 1788   Comment cmnt(masm_, "[ ForInStatement"); | 1803   Comment cmnt(masm_, "[ ForInStatement"); | 
| 1789   RecordStatementPosition(node); | 1804   RecordStatementPosition(node); | 
| 1790 | 1805 | 
| 1791   // We keep stuff on the stack while the body is executing. | 1806   // We keep stuff on the stack while the body is executing. | 
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2580 | 2595 | 
| 2581   if (node->op() == Token::ASSIGN || | 2596   if (node->op() == Token::ASSIGN || | 
| 2582       node->op() == Token::INIT_VAR || | 2597       node->op() == Token::INIT_VAR || | 
| 2583       node->op() == Token::INIT_CONST) { | 2598       node->op() == Token::INIT_CONST) { | 
| 2584     Load(node->value()); | 2599     Load(node->value()); | 
| 2585 | 2600 | 
| 2586   } else { | 2601   } else { | 
| 2587     target.GetValue(NOT_INSIDE_TYPEOF); | 2602     target.GetValue(NOT_INSIDE_TYPEOF); | 
| 2588     Literal* literal = node->value()->AsLiteral(); | 2603     Literal* literal = node->value()->AsLiteral(); | 
| 2589     if (IsInlineSmi(literal)) { | 2604     if (IsInlineSmi(literal)) { | 
| 2590       SmiOperation(node->binary_op(), literal->handle(), false, NO_OVERWRITE); | 2605       SmiOperation(node->binary_op(), node->type(), literal->handle(), false, | 
|  | 2606                    NO_OVERWRITE); | 
| 2591     } else { | 2607     } else { | 
| 2592       Load(node->value()); | 2608       Load(node->value()); | 
| 2593       GenericBinaryOperation(node->binary_op()); | 2609       GenericBinaryOperation(node->binary_op(), node->type()); | 
| 2594     } | 2610     } | 
| 2595   } | 2611   } | 
| 2596 | 2612 | 
| 2597   Variable* var = node->target()->AsVariableProxy()->AsVariable(); | 2613   Variable* var = node->target()->AsVariableProxy()->AsVariable(); | 
| 2598   if (var != NULL && | 2614   if (var != NULL && | 
| 2599       var->mode() == Variable::CONST && | 2615       var->mode() == Variable::CONST && | 
| 2600       node->op() != Token::INIT_VAR && node->op() != Token::INIT_CONST) { | 2616       node->op() != Token::INIT_VAR && node->op() != Token::INIT_CONST) { | 
| 2601     // Assignment ignored - leave the value on the stack. | 2617     // Assignment ignored - leave the value on the stack. | 
| 2602   } else { | 2618   } else { | 
| 2603     __ RecordPosition(node->position()); | 2619     __ RecordPosition(node->position()); | 
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3445       overwrite_mode = OVERWRITE_RIGHT; | 3461       overwrite_mode = OVERWRITE_RIGHT; | 
| 3446     } | 3462     } | 
| 3447 | 3463 | 
| 3448     // Optimize for the case where (at least) one of the expressions | 3464     // Optimize for the case where (at least) one of the expressions | 
| 3449     // is a literal small integer. | 3465     // is a literal small integer. | 
| 3450     Literal* lliteral = node->left()->AsLiteral(); | 3466     Literal* lliteral = node->left()->AsLiteral(); | 
| 3451     Literal* rliteral = node->right()->AsLiteral(); | 3467     Literal* rliteral = node->right()->AsLiteral(); | 
| 3452 | 3468 | 
| 3453     if (IsInlineSmi(rliteral)) { | 3469     if (IsInlineSmi(rliteral)) { | 
| 3454       Load(node->left()); | 3470       Load(node->left()); | 
| 3455       SmiOperation(node->op(), rliteral->handle(), false, overwrite_mode); | 3471       SmiOperation(node->op(), node->type(), rliteral->handle(), false, | 
| 3456 | 3472                    overwrite_mode); | 
| 3457     } else if (IsInlineSmi(lliteral)) { | 3473     } else if (IsInlineSmi(lliteral)) { | 
| 3458       Load(node->right()); | 3474       Load(node->right()); | 
| 3459       SmiOperation(node->op(), lliteral->handle(), true, overwrite_mode); | 3475       SmiOperation(node->op(), node->type(), lliteral->handle(), true, | 
| 3460 | 3476                    overwrite_mode); | 
| 3461     } else { | 3477     } else { | 
| 3462       Load(node->left()); | 3478       Load(node->left()); | 
| 3463       Load(node->right()); | 3479       Load(node->right()); | 
| 3464       GenericBinaryOperation(node->op(), overwrite_mode); | 3480       GenericBinaryOperation(node->op(), node->type(), overwrite_mode); | 
| 3465     } | 3481     } | 
| 3466   } | 3482   } | 
| 3467 } | 3483 } | 
| 3468 | 3484 | 
| 3469 | 3485 | 
| 3470 void CodeGenerator::VisitThisFunction(ThisFunction* node) { | 3486 void CodeGenerator::VisitThisFunction(ThisFunction* node) { | 
| 3471   frame_->Push(frame_->Function()); | 3487   frame_->Push(frame_->Function()); | 
| 3472 } | 3488 } | 
| 3473 | 3489 | 
| 3474 | 3490 | 
| (...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5101 | 5117 | 
| 5102   // Slow-case: Go through the JavaScript implementation. | 5118   // Slow-case: Go through the JavaScript implementation. | 
| 5103   __ bind(&slow); | 5119   __ bind(&slow); | 
| 5104   __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 5120   __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 
| 5105 } | 5121 } | 
| 5106 | 5122 | 
| 5107 | 5123 | 
| 5108 #undef __ | 5124 #undef __ | 
| 5109 | 5125 | 
| 5110 } }  // namespace v8::internal | 5126 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|