OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
79 | 79 |
80 if (HasPointerMap()) { | 80 if (HasPointerMap()) { |
81 stream->Add(" "); | 81 stream->Add(" "); |
82 pointer_map()->PrintTo(stream); | 82 pointer_map()->PrintTo(stream); |
83 } | 83 } |
84 } | 84 } |
85 | 85 |
86 | 86 |
87 template<int R, int I, int T> | 87 template<int R, int I, int T> |
88 void LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) { | 88 void LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) { |
89 for (int i = 0; i < I; i++) { | 89 stream->Add(" = "); |
Kevin Millikin (Chromium)
2011/01/13 08:45:59
This adds a space before the '=' where before ther
fschneider
2011/01/13 13:03:25
Done.
| |
90 stream->Add(i == 0 ? "= " : " "); | 90 inputs_.PrintOperandsTo(stream); |
91 inputs_.at(i)->PrintTo(stream); | |
92 } | |
93 } | 91 } |
94 | 92 |
95 | 93 |
96 template<int R, int I, int T> | 94 template<int R, int I, int T> |
97 void LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) { | 95 void LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) { |
98 if (this->HasResult()) { | 96 outputs_.PrintOperandsTo(stream); |
99 this->result()->PrintTo(stream); | 97 } |
100 stream->Add(" "); | 98 |
99 | |
100 template<typename T, int N> | |
101 void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) { | |
102 for (int i = 0; i < N; i++) { | |
103 if (i > 0) stream->Add(" "); | |
104 elems_[i]->PrintTo(stream); | |
101 } | 105 } |
102 } | 106 } |
103 | 107 |
104 | 108 |
105 void LLabel::PrintDataTo(StringStream* stream) { | 109 void LLabel::PrintDataTo(StringStream* stream) { |
106 LGap::PrintDataTo(stream); | 110 LGap::PrintDataTo(stream); |
107 LLabel* rep = replacement(); | 111 LLabel* rep = replacement(); |
108 if (rep != NULL) { | 112 if (rep != NULL) { |
109 stream->Add(" Dead block replaced with B%d", rep->block_id()); | 113 stream->Add(" Dead block replaced with B%d", rep->block_id()); |
110 } | 114 } |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
867 if (current->has_position()) position_ = current->position(); | 871 if (current->has_position()) position_ = current->position(); |
868 LInstruction* instr = current->CompileToLithium(this); | 872 LInstruction* instr = current->CompileToLithium(this); |
869 | 873 |
870 if (instr != NULL) { | 874 if (instr != NULL) { |
871 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { | 875 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { |
872 instr = AssignPointerMap(instr); | 876 instr = AssignPointerMap(instr); |
873 } | 877 } |
874 if (FLAG_stress_environments && !instr->HasEnvironment()) { | 878 if (FLAG_stress_environments && !instr->HasEnvironment()) { |
875 instr = AssignEnvironment(instr); | 879 instr = AssignEnvironment(instr); |
876 } | 880 } |
877 if (current->IsBranch()) { | 881 if (current->IsBranch() && !instr->IsGoto()) { |
878 instr->set_hydrogen_value(HBranch::cast(current)->value()); | 882 // TODO(fschneider): Handle branch instructions uniformly like |
883 // other instructions. This requires us to generate the right | |
884 // branch instruction already at the HIR level. | |
885 ASSERT(instr->IsControl()); | |
886 HBranch* branch = HBranch::cast(current); | |
887 instr->set_hydrogen_value(branch->value()); | |
888 HBasicBlock* first = branch->FirstSuccessor(); | |
889 HBasicBlock* second = branch->SecondSuccessor(); | |
890 ASSERT(first != NULL && second != NULL); | |
891 instr->SetBranchTargets(first->block_id(), second->block_id()); | |
879 } else { | 892 } else { |
880 instr->set_hydrogen_value(current); | 893 instr->set_hydrogen_value(current); |
881 } | 894 } |
882 | 895 |
883 int index = chunk_->AddInstruction(instr, current_block_); | 896 int index = chunk_->AddInstruction(instr, current_block_); |
884 allocator_->SummarizeInstruction(index); | 897 allocator_->SummarizeInstruction(index); |
885 } else { | 898 } else { |
886 // This instruction should be omitted. | 899 // This instruction should be omitted. |
887 allocator_->OmitInstruction(); | 900 allocator_->OmitInstruction(); |
888 } | 901 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
929 LGoto* result = new LGoto(instr->FirstSuccessor()->block_id(), | 942 LGoto* result = new LGoto(instr->FirstSuccessor()->block_id(), |
930 instr->include_stack_check()); | 943 instr->include_stack_check()); |
931 return (instr->include_stack_check()) | 944 return (instr->include_stack_check()) |
932 ? AssignPointerMap(result) | 945 ? AssignPointerMap(result) |
933 : result; | 946 : result; |
934 } | 947 } |
935 | 948 |
936 | 949 |
937 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { | 950 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
938 HValue* v = instr->value(); | 951 HValue* v = instr->value(); |
939 HBasicBlock* first = instr->FirstSuccessor(); | |
940 HBasicBlock* second = instr->SecondSuccessor(); | |
941 ASSERT(first != NULL && second != NULL); | |
942 int first_id = first->block_id(); | |
943 int second_id = second->block_id(); | |
944 | |
945 if (v->EmitAtUses()) { | 952 if (v->EmitAtUses()) { |
946 if (v->IsClassOfTest()) { | 953 if (v->IsClassOfTest()) { |
947 HClassOfTest* compare = HClassOfTest::cast(v); | 954 HClassOfTest* compare = HClassOfTest::cast(v); |
948 ASSERT(compare->value()->representation().IsTagged()); | 955 ASSERT(compare->value()->representation().IsTagged()); |
949 | 956 |
950 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), | 957 return new LClassOfTestAndBranch(UseTempRegister(compare->value()), |
951 TempRegister(), | 958 TempRegister(), |
952 TempRegister(), | 959 TempRegister()); |
953 first_id, | |
954 second_id); | |
955 } else if (v->IsCompare()) { | 960 } else if (v->IsCompare()) { |
956 HCompare* compare = HCompare::cast(v); | 961 HCompare* compare = HCompare::cast(v); |
957 Token::Value op = compare->token(); | 962 Token::Value op = compare->token(); |
958 HValue* left = compare->left(); | 963 HValue* left = compare->left(); |
959 HValue* right = compare->right(); | 964 HValue* right = compare->right(); |
960 Representation r = compare->GetInputRepresentation(); | 965 Representation r = compare->GetInputRepresentation(); |
961 if (r.IsInteger32()) { | 966 if (r.IsInteger32()) { |
962 ASSERT(left->representation().IsInteger32()); | 967 ASSERT(left->representation().IsInteger32()); |
963 ASSERT(right->representation().IsInteger32()); | 968 ASSERT(right->representation().IsInteger32()); |
964 | 969 |
965 return new LCmpIDAndBranch(UseRegisterAtStart(left), | 970 return new LCmpIDAndBranch(UseRegisterAtStart(left), |
966 UseOrConstantAtStart(right), | 971 UseOrConstantAtStart(right)); |
967 first_id, | |
968 second_id); | |
969 } else if (r.IsDouble()) { | 972 } else if (r.IsDouble()) { |
970 ASSERT(left->representation().IsDouble()); | 973 ASSERT(left->representation().IsDouble()); |
971 ASSERT(right->representation().IsDouble()); | 974 ASSERT(right->representation().IsDouble()); |
972 | 975 |
973 return new LCmpIDAndBranch(UseRegisterAtStart(left), | 976 return new LCmpIDAndBranch(UseRegisterAtStart(left), |
974 UseRegisterAtStart(right), | 977 UseRegisterAtStart(right)); |
975 first_id, | |
976 second_id); | |
977 } else { | 978 } else { |
978 ASSERT(left->representation().IsTagged()); | 979 ASSERT(left->representation().IsTagged()); |
979 ASSERT(right->representation().IsTagged()); | 980 ASSERT(right->representation().IsTagged()); |
980 bool reversed = op == Token::GT || op == Token::LTE; | 981 bool reversed = op == Token::GT || op == Token::LTE; |
981 LOperand* left_operand = UseFixed(left, reversed ? eax : edx); | 982 LOperand* left_operand = UseFixed(left, reversed ? eax : edx); |
982 LOperand* right_operand = UseFixed(right, reversed ? edx : eax); | 983 LOperand* right_operand = UseFixed(right, reversed ? edx : eax); |
983 LCmpTAndBranch* result = new LCmpTAndBranch(left_operand, | 984 LCmpTAndBranch* result = new LCmpTAndBranch(left_operand, |
984 right_operand, | 985 right_operand); |
985 first_id, | |
986 second_id); | |
987 return MarkAsCall(result, instr); | 986 return MarkAsCall(result, instr); |
988 } | 987 } |
989 } else if (v->IsIsSmi()) { | 988 } else if (v->IsIsSmi()) { |
990 HIsSmi* compare = HIsSmi::cast(v); | 989 HIsSmi* compare = HIsSmi::cast(v); |
991 ASSERT(compare->value()->representation().IsTagged()); | 990 ASSERT(compare->value()->representation().IsTagged()); |
992 | 991 |
993 return new LIsSmiAndBranch(Use(compare->value()), | 992 return new LIsSmiAndBranch(Use(compare->value())); |
994 first_id, | |
995 second_id); | |
996 } else if (v->IsHasInstanceType()) { | 993 } else if (v->IsHasInstanceType()) { |
997 HHasInstanceType* compare = HHasInstanceType::cast(v); | 994 HHasInstanceType* compare = HHasInstanceType::cast(v); |
998 ASSERT(compare->value()->representation().IsTagged()); | 995 ASSERT(compare->value()->representation().IsTagged()); |
999 | 996 |
1000 return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value()), | 997 return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value()), |
1001 TempRegister(), | 998 TempRegister()); |
1002 first_id, | |
1003 second_id); | |
1004 } else if (v->IsHasCachedArrayIndex()) { | 999 } else if (v->IsHasCachedArrayIndex()) { |
1005 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); | 1000 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); |
1006 ASSERT(compare->value()->representation().IsTagged()); | 1001 ASSERT(compare->value()->representation().IsTagged()); |
1007 | 1002 |
1008 return new LHasCachedArrayIndexAndBranch( | 1003 return new LHasCachedArrayIndexAndBranch( |
1009 UseRegisterAtStart(compare->value()), first_id, second_id); | 1004 UseRegisterAtStart(compare->value())); |
1010 } else if (v->IsIsNull()) { | 1005 } else if (v->IsIsNull()) { |
1011 HIsNull* compare = HIsNull::cast(v); | 1006 HIsNull* compare = HIsNull::cast(v); |
1012 ASSERT(compare->value()->representation().IsTagged()); | 1007 ASSERT(compare->value()->representation().IsTagged()); |
1013 | 1008 |
1014 // We only need a temp register for non-strict compare. | 1009 // We only need a temp register for non-strict compare. |
1015 LOperand* temp = compare->is_strict() ? NULL : TempRegister(); | 1010 LOperand* temp = compare->is_strict() ? NULL : TempRegister(); |
1016 return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), | 1011 return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), |
1017 temp, | 1012 temp); |
1018 first_id, | |
1019 second_id); | |
1020 } else if (v->IsIsObject()) { | 1013 } else if (v->IsIsObject()) { |
1021 HIsObject* compare = HIsObject::cast(v); | 1014 HIsObject* compare = HIsObject::cast(v); |
1022 ASSERT(compare->value()->representation().IsTagged()); | 1015 ASSERT(compare->value()->representation().IsTagged()); |
1023 | 1016 |
1024 LOperand* temp1 = TempRegister(); | 1017 LOperand* temp1 = TempRegister(); |
1025 LOperand* temp2 = TempRegister(); | 1018 LOperand* temp2 = TempRegister(); |
1026 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), | 1019 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), |
1027 temp1, | 1020 temp1, |
1028 temp2, | 1021 temp2); |
1029 first_id, | |
1030 second_id); | |
1031 } else if (v->IsCompareJSObjectEq()) { | 1022 } else if (v->IsCompareJSObjectEq()) { |
1032 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); | 1023 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); |
1033 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), | 1024 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), |
1034 UseRegisterAtStart(compare->right()), | 1025 UseRegisterAtStart(compare->right())); |
1035 first_id, | |
1036 second_id); | |
1037 } else if (v->IsInstanceOf()) { | 1026 } else if (v->IsInstanceOf()) { |
1038 HInstanceOf* instance_of = HInstanceOf::cast(v); | 1027 HInstanceOf* instance_of = HInstanceOf::cast(v); |
1039 LInstanceOfAndBranch* result = | 1028 LInstanceOfAndBranch* result = |
1040 new LInstanceOfAndBranch( | 1029 new LInstanceOfAndBranch( |
1041 UseFixed(instance_of->left(), InstanceofStub::left()), | 1030 UseFixed(instance_of->left(), InstanceofStub::left()), |
1042 UseFixed(instance_of->right(), InstanceofStub::right()), | 1031 UseFixed(instance_of->right(), InstanceofStub::right())); |
1043 first_id, | |
1044 second_id); | |
1045 return MarkAsCall(result, instr); | 1032 return MarkAsCall(result, instr); |
1046 } else if (v->IsTypeofIs()) { | 1033 } else if (v->IsTypeofIs()) { |
1047 HTypeofIs* typeof_is = HTypeofIs::cast(v); | 1034 HTypeofIs* typeof_is = HTypeofIs::cast(v); |
1048 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value()), | 1035 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); |
1049 first_id, | |
1050 second_id); | |
1051 } else { | 1036 } else { |
1052 if (v->IsConstant()) { | 1037 if (v->IsConstant()) { |
1053 if (HConstant::cast(v)->handle()->IsTrue()) { | 1038 if (HConstant::cast(v)->handle()->IsTrue()) { |
1054 return new LGoto(first_id); | 1039 return new LGoto(instr->FirstSuccessor()->block_id()); |
1055 } else if (HConstant::cast(v)->handle()->IsFalse()) { | 1040 } else if (HConstant::cast(v)->handle()->IsFalse()) { |
1056 return new LGoto(second_id); | 1041 return new LGoto(instr->SecondSuccessor()->block_id()); |
1057 } | 1042 } |
1058 } | 1043 } |
1059 Abort("Undefined compare before branch"); | 1044 Abort("Undefined compare before branch"); |
1060 return NULL; | 1045 return NULL; |
1061 } | 1046 } |
1062 } | 1047 } |
1063 return new LBranch(UseRegisterAtStart(v), first_id, second_id); | 1048 return new LBranch(UseRegisterAtStart(v)); |
1064 } | 1049 } |
1065 | 1050 |
1066 | 1051 |
1067 LInstruction* LChunkBuilder::DoCompareMapAndBranch( | 1052 LInstruction* LChunkBuilder::DoCompareMapAndBranch( |
1068 HCompareMapAndBranch* instr) { | 1053 HCompareMapAndBranch* instr) { |
1069 ASSERT(instr->value()->representation().IsTagged()); | 1054 ASSERT(instr->value()->representation().IsTagged()); |
1070 LOperand* value = UseRegisterAtStart(instr->value()); | 1055 LOperand* value = UseRegisterAtStart(instr->value()); |
1071 return new LCmpMapAndBranch(value); | 1056 return new LCmpMapAndBranch(value); |
1072 } | 1057 } |
1073 | 1058 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1162 UNREACHABLE(); | 1147 UNREACHABLE(); |
1163 return NULL; | 1148 return NULL; |
1164 } | 1149 } |
1165 } | 1150 } |
1166 } | 1151 } |
1167 | 1152 |
1168 | 1153 |
1169 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | 1154 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
1170 ASSERT(instr->key()->representation().IsTagged()); | 1155 ASSERT(instr->key()->representation().IsTagged()); |
1171 argument_count_ -= instr->argument_count(); | 1156 argument_count_ -= instr->argument_count(); |
1172 UseFixed(instr->key(), ecx); | 1157 LOperand* temp = UseFixed(instr->key(), ecx); |
1173 return MarkAsCall(DefineFixed(new LCallKeyed, eax), instr); | 1158 return MarkAsCall(DefineFixed(new LCallKeyed(temp), eax), instr); |
1174 } | 1159 } |
1175 | 1160 |
1176 | 1161 |
1177 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | 1162 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
1178 argument_count_ -= instr->argument_count(); | 1163 argument_count_ -= instr->argument_count(); |
1179 return MarkAsCall(DefineFixed(new LCallNamed, eax), instr); | 1164 return MarkAsCall(DefineFixed(new LCallNamed, eax), instr); |
1180 } | 1165 } |
1181 | 1166 |
1182 | 1167 |
1183 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { | 1168 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1250 return DoBit(Token::BIT_XOR, instr); | 1235 return DoBit(Token::BIT_XOR, instr); |
1251 } | 1236 } |
1252 | 1237 |
1253 | 1238 |
1254 LInstruction* LChunkBuilder::DoDiv(HDiv* instr) { | 1239 LInstruction* LChunkBuilder::DoDiv(HDiv* instr) { |
1255 if (instr->representation().IsDouble()) { | 1240 if (instr->representation().IsDouble()) { |
1256 return DoArithmeticD(Token::DIV, instr); | 1241 return DoArithmeticD(Token::DIV, instr); |
1257 } else if (instr->representation().IsInteger32()) { | 1242 } else if (instr->representation().IsInteger32()) { |
1258 // The temporary operand is necessary to ensure that right is not allocated | 1243 // The temporary operand is necessary to ensure that right is not allocated |
1259 // into edx. | 1244 // into edx. |
1260 FixedTemp(edx); | 1245 LOperand* temp = FixedTemp(edx); |
1261 LOperand* value = UseFixed(instr->left(), eax); | 1246 LOperand* value = UseFixed(instr->left(), eax); |
1262 LOperand* divisor = UseRegister(instr->right()); | 1247 LOperand* divisor = UseRegister(instr->right()); |
1263 return AssignEnvironment(DefineFixed(new LDivI(value, divisor), eax)); | 1248 LDivI* result = new LDivI(value, divisor, temp); |
1249 return AssignEnvironment(DefineFixed(result, eax)); | |
1264 } else { | 1250 } else { |
1265 ASSERT(instr->representation().IsTagged()); | 1251 ASSERT(instr->representation().IsTagged()); |
1266 return DoArithmeticT(Token::DIV, instr); | 1252 return DoArithmeticT(Token::DIV, instr); |
1267 } | 1253 } |
1268 } | 1254 } |
1269 | 1255 |
1270 | 1256 |
1271 LInstruction* LChunkBuilder::DoMod(HMod* instr) { | 1257 LInstruction* LChunkBuilder::DoMod(HMod* instr) { |
1272 if (instr->representation().IsInteger32()) { | 1258 if (instr->representation().IsInteger32()) { |
1273 ASSERT(instr->left()->representation().IsInteger32()); | 1259 ASSERT(instr->left()->representation().IsInteger32()); |
1274 ASSERT(instr->right()->representation().IsInteger32()); | 1260 ASSERT(instr->right()->representation().IsInteger32()); |
1275 // The temporary operand is necessary to ensure that right is not allocated | 1261 // The temporary operand is necessary to ensure that right is not allocated |
1276 // into edx. | 1262 // into edx. |
1277 FixedTemp(edx); | 1263 LOperand* temp = FixedTemp(edx); |
1278 LOperand* value = UseFixed(instr->left(), eax); | 1264 LOperand* value = UseFixed(instr->left(), eax); |
1279 LOperand* divisor = UseRegister(instr->right()); | 1265 LOperand* divisor = UseRegister(instr->right()); |
1280 LModI* mod = new LModI(value, divisor); | 1266 LModI* mod = new LModI(value, divisor, temp); |
1281 LInstruction* result = DefineFixed(mod, edx); | 1267 LInstruction* result = DefineFixed(mod, edx); |
1282 return (instr->CheckFlag(HValue::kBailoutOnMinusZero) || | 1268 return (instr->CheckFlag(HValue::kBailoutOnMinusZero) || |
1283 instr->CheckFlag(HValue::kCanBeDivByZero)) | 1269 instr->CheckFlag(HValue::kCanBeDivByZero)) |
1284 ? AssignEnvironment(result) | 1270 ? AssignEnvironment(result) |
1285 : result; | 1271 : result; |
1286 } else if (instr->representation().IsTagged()) { | 1272 } else if (instr->representation().IsTagged()) { |
1287 return DoArithmeticT(Token::MOD, instr); | 1273 return DoArithmeticT(Token::MOD, instr); |
1288 } else { | 1274 } else { |
1289 ASSERT(instr->representation().IsDouble()); | 1275 ASSERT(instr->representation().IsDouble()); |
1290 // We call a C function for double modulo. It can't trigger a GC. | 1276 // We call a C function for double modulo. It can't trigger a GC. |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1867 | 1853 |
1868 | 1854 |
1869 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { | 1855 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { |
1870 HEnvironment* outer = current_block_->last_environment()->outer(); | 1856 HEnvironment* outer = current_block_->last_environment()->outer(); |
1871 current_block_->UpdateEnvironment(outer); | 1857 current_block_->UpdateEnvironment(outer); |
1872 return NULL; | 1858 return NULL; |
1873 } | 1859 } |
1874 | 1860 |
1875 | 1861 |
1876 } } // namespace v8::internal | 1862 } } // namespace v8::internal |
OLD | NEW |