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 |