| 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 2638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2649 ExternalReference::address_of_stack_guard_limit(); | 2649 ExternalReference::address_of_stack_guard_limit(); |
| 2650 __ cmp(esp, Operand::StaticVariable(stack_guard_limit)); | 2650 __ cmp(esp, Operand::StaticVariable(stack_guard_limit)); |
| 2651 __ j(below, deferred->enter(), not_taken); | 2651 __ j(below, deferred->enter(), not_taken); |
| 2652 __ bind(deferred->exit()); | 2652 __ bind(deferred->exit()); |
| 2653 } | 2653 } |
| 2654 } | 2654 } |
| 2655 | 2655 |
| 2656 | 2656 |
| 2657 void Ia32CodeGenerator::VisitBlock(Block* node) { | 2657 void Ia32CodeGenerator::VisitBlock(Block* node) { |
| 2658 Comment cmnt(masm_, "[ Block"); | 2658 Comment cmnt(masm_, "[ Block"); |
| 2659 if (FLAG_debug_info) RecordStatementPosition(node); | 2659 RecordStatementPosition(node); |
| 2660 node->set_break_stack_height(break_stack_height_); | 2660 node->set_break_stack_height(break_stack_height_); |
| 2661 VisitStatements(node->statements()); | 2661 VisitStatements(node->statements()); |
| 2662 __ bind(node->break_target()); | 2662 __ bind(node->break_target()); |
| 2663 } | 2663 } |
| 2664 | 2664 |
| 2665 | 2665 |
| 2666 void Ia32CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { | 2666 void Ia32CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { |
| 2667 __ push(Immediate(pairs)); | 2667 __ push(Immediate(pairs)); |
| 2668 __ push(Operand(esi)); | 2668 __ push(Operand(esi)); |
| 2669 __ push(Immediate(Smi::FromInt(is_eval() ? 1 : 0))); | 2669 __ push(Immediate(Smi::FromInt(is_eval() ? 1 : 0))); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2727 Load(val); | 2727 Load(val); |
| 2728 SetValue(&target); | 2728 SetValue(&target); |
| 2729 // Get rid of the assigned value (declarations are statements). | 2729 // Get rid of the assigned value (declarations are statements). |
| 2730 __ pop(eax); // Pop(no_reg); | 2730 __ pop(eax); // Pop(no_reg); |
| 2731 } | 2731 } |
| 2732 } | 2732 } |
| 2733 | 2733 |
| 2734 | 2734 |
| 2735 void Ia32CodeGenerator::VisitExpressionStatement(ExpressionStatement* node) { | 2735 void Ia32CodeGenerator::VisitExpressionStatement(ExpressionStatement* node) { |
| 2736 Comment cmnt(masm_, "[ ExpressionStatement"); | 2736 Comment cmnt(masm_, "[ ExpressionStatement"); |
| 2737 if (FLAG_debug_info) RecordStatementPosition(node); | 2737 RecordStatementPosition(node); |
| 2738 Expression* expression = node->expression(); | 2738 Expression* expression = node->expression(); |
| 2739 expression->MarkAsStatement(); | 2739 expression->MarkAsStatement(); |
| 2740 Load(expression); | 2740 Load(expression); |
| 2741 __ pop(eax); // remove the lingering expression result from the top of stack | 2741 __ pop(eax); // remove the lingering expression result from the top of stack |
| 2742 } | 2742 } |
| 2743 | 2743 |
| 2744 | 2744 |
| 2745 void Ia32CodeGenerator::VisitEmptyStatement(EmptyStatement* node) { | 2745 void Ia32CodeGenerator::VisitEmptyStatement(EmptyStatement* node) { |
| 2746 Comment cmnt(masm_, "// EmptyStatement"); | 2746 Comment cmnt(masm_, "// EmptyStatement"); |
| 2747 // nothing to do | 2747 // nothing to do |
| 2748 } | 2748 } |
| 2749 | 2749 |
| 2750 | 2750 |
| 2751 void Ia32CodeGenerator::VisitIfStatement(IfStatement* node) { | 2751 void Ia32CodeGenerator::VisitIfStatement(IfStatement* node) { |
| 2752 Comment cmnt(masm_, "[ IfStatement"); | 2752 Comment cmnt(masm_, "[ IfStatement"); |
| 2753 // Generate different code depending on which | 2753 // Generate different code depending on which |
| 2754 // parts of the if statement are present or not. | 2754 // parts of the if statement are present or not. |
| 2755 bool has_then_stm = node->HasThenStatement(); | 2755 bool has_then_stm = node->HasThenStatement(); |
| 2756 bool has_else_stm = node->HasElseStatement(); | 2756 bool has_else_stm = node->HasElseStatement(); |
| 2757 | 2757 |
| 2758 if (FLAG_debug_info) RecordStatementPosition(node); | 2758 RecordStatementPosition(node); |
| 2759 Label exit; | 2759 Label exit; |
| 2760 if (has_then_stm && has_else_stm) { | 2760 if (has_then_stm && has_else_stm) { |
| 2761 Label then; | 2761 Label then; |
| 2762 Label else_; | 2762 Label else_; |
| 2763 // if (cond) | 2763 // if (cond) |
| 2764 LoadCondition(node->condition(), CodeGenState::LOAD, &then, &else_, true); | 2764 LoadCondition(node->condition(), CodeGenState::LOAD, &then, &else_, true); |
| 2765 Branch(false, &else_); | 2765 Branch(false, &else_); |
| 2766 // then | 2766 // then |
| 2767 __ bind(&then); | 2767 __ bind(&then); |
| 2768 Visit(node->then_statement()); | 2768 Visit(node->then_statement()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2812 void Ia32CodeGenerator::CleanStack(int num_bytes) { | 2812 void Ia32CodeGenerator::CleanStack(int num_bytes) { |
| 2813 ASSERT(num_bytes >= 0); | 2813 ASSERT(num_bytes >= 0); |
| 2814 if (num_bytes > 0) { | 2814 if (num_bytes > 0) { |
| 2815 __ add(Operand(esp), Immediate(num_bytes)); | 2815 __ add(Operand(esp), Immediate(num_bytes)); |
| 2816 } | 2816 } |
| 2817 } | 2817 } |
| 2818 | 2818 |
| 2819 | 2819 |
| 2820 void Ia32CodeGenerator::VisitContinueStatement(ContinueStatement* node) { | 2820 void Ia32CodeGenerator::VisitContinueStatement(ContinueStatement* node) { |
| 2821 Comment cmnt(masm_, "[ ContinueStatement"); | 2821 Comment cmnt(masm_, "[ ContinueStatement"); |
| 2822 if (FLAG_debug_info) RecordStatementPosition(node); | 2822 RecordStatementPosition(node); |
| 2823 CleanStack(break_stack_height_ - node->target()->break_stack_height()); | 2823 CleanStack(break_stack_height_ - node->target()->break_stack_height()); |
| 2824 __ jmp(node->target()->continue_target()); | 2824 __ jmp(node->target()->continue_target()); |
| 2825 } | 2825 } |
| 2826 | 2826 |
| 2827 | 2827 |
| 2828 void Ia32CodeGenerator::VisitBreakStatement(BreakStatement* node) { | 2828 void Ia32CodeGenerator::VisitBreakStatement(BreakStatement* node) { |
| 2829 Comment cmnt(masm_, "[ BreakStatement"); | 2829 Comment cmnt(masm_, "[ BreakStatement"); |
| 2830 if (FLAG_debug_info) RecordStatementPosition(node); | 2830 RecordStatementPosition(node); |
| 2831 CleanStack(break_stack_height_ - node->target()->break_stack_height()); | 2831 CleanStack(break_stack_height_ - node->target()->break_stack_height()); |
| 2832 __ jmp(node->target()->break_target()); | 2832 __ jmp(node->target()->break_target()); |
| 2833 } | 2833 } |
| 2834 | 2834 |
| 2835 | 2835 |
| 2836 void Ia32CodeGenerator::VisitReturnStatement(ReturnStatement* node) { | 2836 void Ia32CodeGenerator::VisitReturnStatement(ReturnStatement* node) { |
| 2837 Comment cmnt(masm_, "[ ReturnStatement"); | 2837 Comment cmnt(masm_, "[ ReturnStatement"); |
| 2838 if (FLAG_debug_info) RecordStatementPosition(node); | 2838 RecordStatementPosition(node); |
| 2839 Load(node->expression()); | 2839 Load(node->expression()); |
| 2840 | 2840 |
| 2841 // Move the function result into eax | 2841 // Move the function result into eax |
| 2842 __ pop(eax); | 2842 __ pop(eax); |
| 2843 | 2843 |
| 2844 // If we're inside a try statement or the return instruction | 2844 // If we're inside a try statement or the return instruction |
| 2845 // sequence has been generated, we just jump to that | 2845 // sequence has been generated, we just jump to that |
| 2846 // point. Otherwise, we generate the return instruction sequence and | 2846 // point. Otherwise, we generate the return instruction sequence and |
| 2847 // bind the function return label. | 2847 // bind the function return label. |
| 2848 if (is_inside_try_ || function_return_.is_bound()) { | 2848 if (is_inside_try_ || function_return_.is_bound()) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2866 // Check that the size of the code used for returning matches what is | 2866 // Check that the size of the code used for returning matches what is |
| 2867 // expected by the debugger. | 2867 // expected by the debugger. |
| 2868 ASSERT_EQ(Debug::kIa32JSReturnSequenceLength, | 2868 ASSERT_EQ(Debug::kIa32JSReturnSequenceLength, |
| 2869 __ SizeOfCodeGeneratedSince(&check_exit_codesize)); | 2869 __ SizeOfCodeGeneratedSince(&check_exit_codesize)); |
| 2870 } | 2870 } |
| 2871 } | 2871 } |
| 2872 | 2872 |
| 2873 | 2873 |
| 2874 void Ia32CodeGenerator::VisitWithEnterStatement(WithEnterStatement* node) { | 2874 void Ia32CodeGenerator::VisitWithEnterStatement(WithEnterStatement* node) { |
| 2875 Comment cmnt(masm_, "[ WithEnterStatement"); | 2875 Comment cmnt(masm_, "[ WithEnterStatement"); |
| 2876 if (FLAG_debug_info) RecordStatementPosition(node); | 2876 RecordStatementPosition(node); |
| 2877 Load(node->expression()); | 2877 Load(node->expression()); |
| 2878 __ CallRuntime(Runtime::kPushContext, 1); | 2878 __ CallRuntime(Runtime::kPushContext, 1); |
| 2879 | 2879 |
| 2880 if (kDebug) { | 2880 if (kDebug) { |
| 2881 Label verified_true; | 2881 Label verified_true; |
| 2882 // Verify eax and esi are the same in debug mode | 2882 // Verify eax and esi are the same in debug mode |
| 2883 __ cmp(eax, Operand(esi)); | 2883 __ cmp(eax, Operand(esi)); |
| 2884 __ j(equal, &verified_true); | 2884 __ j(equal, &verified_true); |
| 2885 __ int3(); | 2885 __ int3(); |
| 2886 __ bind(&verified_true); | 2886 __ bind(&verified_true); |
| 2887 } | 2887 } |
| 2888 | 2888 |
| 2889 // Update context local. | 2889 // Update context local. |
| 2890 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), esi); | 2890 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), esi); |
| 2891 } | 2891 } |
| 2892 | 2892 |
| 2893 | 2893 |
| 2894 void Ia32CodeGenerator::VisitWithExitStatement(WithExitStatement* node) { | 2894 void Ia32CodeGenerator::VisitWithExitStatement(WithExitStatement* node) { |
| 2895 Comment cmnt(masm_, "[ WithExitStatement"); | 2895 Comment cmnt(masm_, "[ WithExitStatement"); |
| 2896 // Pop context. | 2896 // Pop context. |
| 2897 __ mov(esi, ContextOperand(esi, Context::PREVIOUS_INDEX)); | 2897 __ mov(esi, ContextOperand(esi, Context::PREVIOUS_INDEX)); |
| 2898 // Update context local. | 2898 // Update context local. |
| 2899 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), esi); | 2899 __ mov(Operand(ebp, StandardFrameConstants::kContextOffset), esi); |
| 2900 } | 2900 } |
| 2901 | 2901 |
| 2902 | 2902 |
| 2903 void Ia32CodeGenerator::VisitSwitchStatement(SwitchStatement* node) { | 2903 void Ia32CodeGenerator::VisitSwitchStatement(SwitchStatement* node) { |
| 2904 Comment cmnt(masm_, "[ SwitchStatement"); | 2904 Comment cmnt(masm_, "[ SwitchStatement"); |
| 2905 if (FLAG_debug_info) RecordStatementPosition(node); | 2905 RecordStatementPosition(node); |
| 2906 node->set_break_stack_height(break_stack_height_); | 2906 node->set_break_stack_height(break_stack_height_); |
| 2907 | 2907 |
| 2908 Load(node->tag()); | 2908 Load(node->tag()); |
| 2909 | 2909 |
| 2910 Label next, fall_through, default_case; | 2910 Label next, fall_through, default_case; |
| 2911 ZoneList<CaseClause*>* cases = node->cases(); | 2911 ZoneList<CaseClause*>* cases = node->cases(); |
| 2912 int length = cases->length(); | 2912 int length = cases->length(); |
| 2913 | 2913 |
| 2914 for (int i = 0; i < length; i++) { | 2914 for (int i = 0; i < length; i++) { |
| 2915 CaseClause* clause = cases->at(i); | 2915 CaseClause* clause = cases->at(i); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2959 __ pop(eax); | 2959 __ pop(eax); |
| 2960 } | 2960 } |
| 2961 | 2961 |
| 2962 __ bind(&fall_through); | 2962 __ bind(&fall_through); |
| 2963 __ bind(node->break_target()); | 2963 __ bind(node->break_target()); |
| 2964 } | 2964 } |
| 2965 | 2965 |
| 2966 | 2966 |
| 2967 void Ia32CodeGenerator::VisitLoopStatement(LoopStatement* node) { | 2967 void Ia32CodeGenerator::VisitLoopStatement(LoopStatement* node) { |
| 2968 Comment cmnt(masm_, "[ LoopStatement"); | 2968 Comment cmnt(masm_, "[ LoopStatement"); |
| 2969 if (FLAG_debug_info) RecordStatementPosition(node); | 2969 RecordStatementPosition(node); |
| 2970 node->set_break_stack_height(break_stack_height_); | 2970 node->set_break_stack_height(break_stack_height_); |
| 2971 | 2971 |
| 2972 // simple condition analysis | 2972 // simple condition analysis |
| 2973 enum { ALWAYS_TRUE, ALWAYS_FALSE, DONT_KNOW } info = DONT_KNOW; | 2973 enum { ALWAYS_TRUE, ALWAYS_FALSE, DONT_KNOW } info = DONT_KNOW; |
| 2974 if (node->cond() == NULL) { | 2974 if (node->cond() == NULL) { |
| 2975 ASSERT(node->type() == LoopStatement::FOR_LOOP); | 2975 ASSERT(node->type() == LoopStatement::FOR_LOOP); |
| 2976 info = ALWAYS_TRUE; | 2976 info = ALWAYS_TRUE; |
| 2977 } else { | 2977 } else { |
| 2978 Literal* lit = node->cond()->AsLiteral(); | 2978 Literal* lit = node->cond()->AsLiteral(); |
| 2979 if (lit != NULL) { | 2979 if (lit != NULL) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3000 __ bind(&loop); | 3000 __ bind(&loop); |
| 3001 CheckStack(); // TODO(1222600): ignore if body contains calls. | 3001 CheckStack(); // TODO(1222600): ignore if body contains calls. |
| 3002 Visit(node->body()); | 3002 Visit(node->body()); |
| 3003 | 3003 |
| 3004 // next | 3004 // next |
| 3005 __ bind(node->continue_target()); | 3005 __ bind(node->continue_target()); |
| 3006 if (node->next() != NULL) { | 3006 if (node->next() != NULL) { |
| 3007 // Record source position of the statement as this code which is after the | 3007 // Record source position of the statement as this code which is after the |
| 3008 // code for the body actually belongs to the loop statement and not the | 3008 // code for the body actually belongs to the loop statement and not the |
| 3009 // body. | 3009 // body. |
| 3010 if (FLAG_debug_info) __ RecordPosition(node->statement_pos()); | 3010 RecordStatementPosition(node); |
| 3011 __ RecordPosition(node->statement_pos()); |
| 3011 ASSERT(node->type() == LoopStatement::FOR_LOOP); | 3012 ASSERT(node->type() == LoopStatement::FOR_LOOP); |
| 3012 Visit(node->next()); | 3013 Visit(node->next()); |
| 3013 } | 3014 } |
| 3014 | 3015 |
| 3015 // cond | 3016 // cond |
| 3016 __ bind(&entry); | 3017 __ bind(&entry); |
| 3017 switch (info) { | 3018 switch (info) { |
| 3018 case ALWAYS_TRUE: | 3019 case ALWAYS_TRUE: |
| 3019 __ jmp(&loop); | 3020 __ jmp(&loop); |
| 3020 break; | 3021 break; |
| 3021 case ALWAYS_FALSE: | 3022 case ALWAYS_FALSE: |
| 3022 break; | 3023 break; |
| 3023 case DONT_KNOW: | 3024 case DONT_KNOW: |
| 3024 LoadCondition(node->cond(), CodeGenState::LOAD, &loop, | 3025 LoadCondition(node->cond(), CodeGenState::LOAD, &loop, |
| 3025 node->break_target(), true); | 3026 node->break_target(), true); |
| 3026 Branch(true, &loop); | 3027 Branch(true, &loop); |
| 3027 break; | 3028 break; |
| 3028 } | 3029 } |
| 3029 | 3030 |
| 3030 // exit | 3031 // exit |
| 3031 __ bind(node->break_target()); | 3032 __ bind(node->break_target()); |
| 3032 } | 3033 } |
| 3033 | 3034 |
| 3034 | 3035 |
| 3035 void Ia32CodeGenerator::VisitForInStatement(ForInStatement* node) { | 3036 void Ia32CodeGenerator::VisitForInStatement(ForInStatement* node) { |
| 3036 Comment cmnt(masm_, "[ ForInStatement"); | 3037 Comment cmnt(masm_, "[ ForInStatement"); |
| 3037 if (FLAG_debug_info) RecordStatementPosition(node); | 3038 RecordStatementPosition(node); |
| 3038 | 3039 |
| 3039 // We keep stuff on the stack while the body is executing. | 3040 // We keep stuff on the stack while the body is executing. |
| 3040 // Record it, so that a break/continue crossing this statement | 3041 // Record it, so that a break/continue crossing this statement |
| 3041 // can restore the stack. | 3042 // can restore the stack. |
| 3042 const int kForInStackSize = 5 * kPointerSize; | 3043 const int kForInStackSize = 5 * kPointerSize; |
| 3043 break_stack_height_ += kForInStackSize; | 3044 break_stack_height_ += kForInStackSize; |
| 3044 node->set_break_stack_height(break_stack_height_); | 3045 node->set_break_stack_height(break_stack_height_); |
| 3045 | 3046 |
| 3046 Label loop, next, entry, cleanup, exit, primitive, jsobject; | 3047 Label loop, next, entry, cleanup, exit, primitive, jsobject; |
| 3047 Label end_del_check, fixed_array; | 3048 Label end_del_check, fixed_array; |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3439 __ push(eax); // undo pop from above | 3440 __ push(eax); // undo pop from above |
| 3440 __ CallRuntime(Runtime::kReThrow, 1); | 3441 __ CallRuntime(Runtime::kReThrow, 1); |
| 3441 | 3442 |
| 3442 // Done. | 3443 // Done. |
| 3443 __ bind(&exit); | 3444 __ bind(&exit); |
| 3444 } | 3445 } |
| 3445 | 3446 |
| 3446 | 3447 |
| 3447 void Ia32CodeGenerator::VisitDebuggerStatement(DebuggerStatement* node) { | 3448 void Ia32CodeGenerator::VisitDebuggerStatement(DebuggerStatement* node) { |
| 3448 Comment cmnt(masm_, "[ DebuggerStatement"); | 3449 Comment cmnt(masm_, "[ DebuggerStatement"); |
| 3449 if (FLAG_debug_info) RecordStatementPosition(node); | 3450 RecordStatementPosition(node); |
| 3450 __ CallRuntime(Runtime::kDebugBreak, 1); | 3451 __ CallRuntime(Runtime::kDebugBreak, 1); |
| 3451 __ push(eax); | 3452 __ push(eax); |
| 3452 } | 3453 } |
| 3453 | 3454 |
| 3454 | 3455 |
| 3455 void Ia32CodeGenerator::InstantiateBoilerplate(Handle<JSFunction> boilerplate) { | 3456 void Ia32CodeGenerator::InstantiateBoilerplate(Handle<JSFunction> boilerplate) { |
| 3456 ASSERT(boilerplate->IsBoilerplate()); | 3457 ASSERT(boilerplate->IsBoilerplate()); |
| 3457 | 3458 |
| 3458 // Push the boilerplate on the stack. | 3459 // Push the boilerplate on the stack. |
| 3459 __ push(Immediate(boilerplate)); | 3460 __ push(Immediate(boilerplate)); |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3802 bool Ia32CodeGenerator::IsInlineSmi(Literal* literal) { | 3803 bool Ia32CodeGenerator::IsInlineSmi(Literal* literal) { |
| 3803 if (literal == NULL || !literal->handle()->IsSmi()) return false; | 3804 if (literal == NULL || !literal->handle()->IsSmi()) return false; |
| 3804 int int_value = Smi::cast(*literal->handle())->value(); | 3805 int int_value = Smi::cast(*literal->handle())->value(); |
| 3805 return is_intn(int_value, kMaxSmiInlinedBits); | 3806 return is_intn(int_value, kMaxSmiInlinedBits); |
| 3806 } | 3807 } |
| 3807 | 3808 |
| 3808 | 3809 |
| 3809 void Ia32CodeGenerator::VisitAssignment(Assignment* node) { | 3810 void Ia32CodeGenerator::VisitAssignment(Assignment* node) { |
| 3810 Comment cmnt(masm_, "[ Assignment"); | 3811 Comment cmnt(masm_, "[ Assignment"); |
| 3811 | 3812 |
| 3812 if (FLAG_debug_info) RecordStatementPosition(node); | 3813 RecordStatementPosition(node); |
| 3813 Reference target(this, node->target()); | 3814 Reference target(this, node->target()); |
| 3814 if (target.is_illegal()) return; | 3815 if (target.is_illegal()) return; |
| 3815 | 3816 |
| 3816 if (node->op() == Token::ASSIGN || | 3817 if (node->op() == Token::ASSIGN || |
| 3817 node->op() == Token::INIT_VAR || | 3818 node->op() == Token::INIT_VAR || |
| 3818 node->op() == Token::INIT_CONST) { | 3819 node->op() == Token::INIT_CONST) { |
| 3819 Load(node->value()); | 3820 Load(node->value()); |
| 3820 | 3821 |
| 3821 } else { | 3822 } else { |
| 3822 GetValue(&target); | 3823 GetValue(&target); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3870 GetValue(&property); | 3871 GetValue(&property); |
| 3871 } | 3872 } |
| 3872 } | 3873 } |
| 3873 | 3874 |
| 3874 | 3875 |
| 3875 void Ia32CodeGenerator::VisitCall(Call* node) { | 3876 void Ia32CodeGenerator::VisitCall(Call* node) { |
| 3876 Comment cmnt(masm_, "[ Call"); | 3877 Comment cmnt(masm_, "[ Call"); |
| 3877 | 3878 |
| 3878 ZoneList<Expression*>* args = node->arguments(); | 3879 ZoneList<Expression*>* args = node->arguments(); |
| 3879 | 3880 |
| 3880 if (FLAG_debug_info) RecordStatementPosition(node); | 3881 RecordStatementPosition(node); |
| 3881 | 3882 |
| 3882 // Check if the function is a variable or a property. | 3883 // Check if the function is a variable or a property. |
| 3883 Expression* function = node->expression(); | 3884 Expression* function = node->expression(); |
| 3884 Variable* var = function->AsVariableProxy()->AsVariable(); | 3885 Variable* var = function->AsVariableProxy()->AsVariable(); |
| 3885 Property* property = function->AsProperty(); | 3886 Property* property = function->AsProperty(); |
| 3886 | 3887 |
| 3887 // ------------------------------------------------------------------------ | 3888 // ------------------------------------------------------------------------ |
| 3888 // Fast-case: Use inline caching. | 3889 // Fast-case: Use inline caching. |
| 3889 // --- | 3890 // --- |
| 3890 // According to ECMA-262, section 11.2.3, page 44, the function to call | 3891 // According to ECMA-262, section 11.2.3, page 44, the function to call |
| (...skipping 1508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5399 bool is_eval) { | 5400 bool is_eval) { |
| 5400 Handle<Code> code = Ia32CodeGenerator::MakeCode(fun, script, is_eval); | 5401 Handle<Code> code = Ia32CodeGenerator::MakeCode(fun, script, is_eval); |
| 5401 if (!code.is_null()) { | 5402 if (!code.is_null()) { |
| 5402 Counters::total_compiled_code_size.Increment(code->instruction_size()); | 5403 Counters::total_compiled_code_size.Increment(code->instruction_size()); |
| 5403 } | 5404 } |
| 5404 return code; | 5405 return code; |
| 5405 } | 5406 } |
| 5406 | 5407 |
| 5407 | 5408 |
| 5408 } } // namespace v8::internal | 5409 } } // namespace v8::internal |
| OLD | NEW |