Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: src/hydrogen.cc

Issue 8002019: Add Crankshaft support for smi-only elements (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 3319 matching lines...) Expand 10 before | Expand all | Expand 10 after
3330 // Load the elements array before the first store. 3330 // Load the elements array before the first store.
3331 if (elements == NULL) { 3331 if (elements == NULL) {
3332 elements = new(zone()) HLoadElements(literal); 3332 elements = new(zone()) HLoadElements(literal);
3333 AddInstruction(elements); 3333 AddInstruction(elements);
3334 } 3334 }
3335 3335
3336 HValue* key = AddInstruction( 3336 HValue* key = AddInstruction(
3337 new(zone()) HConstant(Handle<Object>(Smi::FromInt(i)), 3337 new(zone()) HConstant(Handle<Object>(Smi::FromInt(i)),
3338 Representation::Integer32())); 3338 Representation::Integer32()));
3339 if (FLAG_smi_only_arrays) { 3339 if (FLAG_smi_only_arrays) {
3340 HInstruction* elements_kind =
3341 AddInstruction(new(zone()) HElementsKind(literal));
3342 HBasicBlock* store_fast = graph()->CreateBasicBlock();
danno 2011/09/23 09:05:24 Wow, cool, you went for bonus points here (I don't
Jakob Kummerow 2011/09/26 11:30:32 Done.
3343 // Two empty blocks to satisfy edge split form.
3344 HBasicBlock* store_fast_edgesplit1 = graph()->CreateBasicBlock();
3345 HBasicBlock* store_fast_edgesplit2 = graph()->CreateBasicBlock();
3346 HBasicBlock* store_generic = graph()->CreateBasicBlock();
3347 HBasicBlock* check_smi_only_elements = graph()->CreateBasicBlock();
3348 HBasicBlock* join = graph()->CreateBasicBlock();
3349
3350 HIsSmiAndBranch* smicheck = new(zone()) HIsSmiAndBranch(value);
3351 smicheck->SetSuccessorAt(0, store_fast_edgesplit1);
3352 smicheck->SetSuccessorAt(1, check_smi_only_elements);
3353 current_block()->Finish(smicheck);
3354 store_fast_edgesplit1->Finish(new(zone()) HGoto(store_fast));
3355
3356 set_current_block(check_smi_only_elements);
3357 HCompareConstantEqAndBranch* smi_elements_check =
3358 new(zone()) HCompareConstantEqAndBranch(elements_kind,
3359 FAST_SMI_ONLY_ELEMENTS,
3360 Token::EQ_STRICT);
3361 smi_elements_check->SetSuccessorAt(0, store_generic);
3362 smi_elements_check->SetSuccessorAt(1, store_fast_edgesplit2);
3363 current_block()->Finish(smi_elements_check);
3364 store_fast_edgesplit2->Finish(new(zone()) HGoto(store_fast));
3365
3366 set_current_block(store_fast);
3367 AddInstruction(new(zone()) HStoreKeyedFastElement(elements, key, value));
3368 store_fast->Goto(join);
3369
3370 set_current_block(store_generic);
3340 AddInstruction(BuildStoreKeyedGeneric(literal, key, value)); 3371 AddInstruction(BuildStoreKeyedGeneric(literal, key, value));
3372 store_generic->Goto(join);
3373
3374 join->SetJoinId(expr->id());
3375 set_current_block(join);
3341 } else { 3376 } else {
3342 AddInstruction(new(zone()) HStoreKeyedFastElement(elements, key, value)); 3377 AddInstruction(new(zone()) HStoreKeyedFastElement(elements, key, value));
3343 } 3378 }
3344 3379
3345 AddSimulate(expr->GetIdForElement(i)); 3380 AddSimulate(expr->GetIdForElement(i));
3346 } 3381 }
3347 return ast_context()->ReturnValue(Pop()); 3382 return ast_context()->ReturnValue(Pop());
3348 } 3383 }
3349 3384
3350 3385
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after
3962 } 3997 }
3963 return new(zone()) HStoreKeyedSpecializedArrayElement( 3998 return new(zone()) HStoreKeyedSpecializedArrayElement(
3964 external_elements, checked_key, val, elements_kind); 3999 external_elements, checked_key, val, elements_kind);
3965 } else { 4000 } else {
3966 return new(zone()) HLoadKeyedSpecializedArrayElement( 4001 return new(zone()) HLoadKeyedSpecializedArrayElement(
3967 external_elements, checked_key, elements_kind); 4002 external_elements, checked_key, elements_kind);
3968 } 4003 }
3969 } 4004 }
3970 4005
3971 4006
4007 HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements,
danno 2011/09/23 09:05:24 I find it a little asymmetric that BuildFirstEleme
danno 2011/09/23 09:07:52 "not last last one" should read "the returned inst
Jakob Kummerow 2011/09/26 11:30:32 It's currently consistent with a bunch of other me
4008 HValue* checked_key,
4009 HValue* val,
4010 ElementsKind elements_kind,
4011 bool is_store) {
4012 if (is_store) {
4013 ASSERT(val != NULL);
4014 if (elements_kind == FAST_DOUBLE_ELEMENTS) {
4015 return new(zone()) HStoreKeyedFastDoubleElement(
4016 elements, checked_key, val);
4017 } else if (elements_kind == FAST_SMI_ONLY_ELEMENTS) {
4018 AddInstruction(new(zone()) HCheckSmi(val));
4019 return new(zone()) HStoreKeyedFastElement(
4020 elements, checked_key, val, HStoreKeyedFastElement::VALUE_IS_SMI);
4021 } else {
4022 return new(zone()) HStoreKeyedFastElement(elements, checked_key, val);
4023 }
4024 } else {
4025 if (elements_kind == FAST_DOUBLE_ELEMENTS) {
4026 return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key);
4027 } else {
4028 return new(zone()) HLoadKeyedFastElement(elements, checked_key);
danno 2011/09/23 09:05:24 If you're refactoring anyway, perhaps you might wa
Jakob Kummerow 2011/09/26 11:30:32 Done. Removed the unnecessary outer "else" and add
4029 }
4030 }
4031 }
4032
4033
3972 HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object, 4034 HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object,
3973 HValue* key, 4035 HValue* key,
3974 HValue* val, 4036 HValue* val,
3975 Expression* expr, 4037 Expression* expr,
3976 bool is_store) { 4038 bool is_store) {
3977 ASSERT(expr->IsMonomorphic()); 4039 ASSERT(expr->IsMonomorphic());
3978 Handle<Map> map = expr->GetMonomorphicReceiverType(); 4040 Handle<Map> map = expr->GetMonomorphicReceiverType();
3979 AddInstruction(new(zone()) HCheckNonSmi(object)); 4041 AddInstruction(new(zone()) HCheckNonSmi(object));
3980 HInstruction* mapcheck = AddInstruction(new(zone()) HCheckMap(object, map)); 4042 HInstruction* mapcheck = AddInstruction(new(zone()) HCheckMap(object, map));
3981 if (!map->has_fast_elements() && 4043 bool fast_smi_only_elements = map->has_fast_smi_only_elements();
3982 !map->has_fast_double_elements() && 4044 bool fast_elements = map->has_fast_elements();
4045 bool fast_double_elements = map->has_fast_double_elements();
4046 if (!fast_smi_only_elements &&
4047 !fast_elements &&
4048 !fast_double_elements &&
3983 !map->has_external_array_elements()) { 4049 !map->has_external_array_elements()) {
3984 return is_store ? BuildStoreKeyedGeneric(object, key, val) 4050 return is_store ? BuildStoreKeyedGeneric(object, key, val)
3985 : BuildLoadKeyedGeneric(object, key); 4051 : BuildLoadKeyedGeneric(object, key);
3986 } 4052 }
3987 HInstruction* elements = AddInstruction(new(zone()) HLoadElements(object)); 4053 HInstruction* elements = AddInstruction(new(zone()) HLoadElements(object));
3988 bool fast_double_elements = map->has_fast_double_elements(); 4054 if (is_store && (fast_elements || fast_smi_only_elements)) {
3989 if (is_store && map->has_fast_elements()) {
3990 AddInstruction(new(zone()) HCheckMap( 4055 AddInstruction(new(zone()) HCheckMap(
3991 elements, isolate()->factory()->fixed_array_map())); 4056 elements, isolate()->factory()->fixed_array_map()));
3992 } 4057 }
3993 HInstruction* length = NULL; 4058 HInstruction* length = NULL;
3994 HInstruction* checked_key = NULL; 4059 HInstruction* checked_key = NULL;
3995 if (map->has_external_array_elements()) { 4060 if (map->has_external_array_elements()) {
3996 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); 4061 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements));
3997 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); 4062 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length));
3998 HLoadExternalArrayPointer* external_elements = 4063 HLoadExternalArrayPointer* external_elements =
3999 new(zone()) HLoadExternalArrayPointer(elements); 4064 new(zone()) HLoadExternalArrayPointer(elements);
4000 AddInstruction(external_elements); 4065 AddInstruction(external_elements);
4001 return BuildExternalArrayElementAccess(external_elements, checked_key, 4066 return BuildExternalArrayElementAccess(external_elements, checked_key,
4002 val, map->elements_kind(), is_store); 4067 val, map->elements_kind(), is_store);
4003 } 4068 }
4004 ASSERT(map->has_fast_elements() || fast_double_elements); 4069 ASSERT(fast_smi_only_elements || fast_elements || fast_double_elements);
danno 2011/09/23 09:05:24 Perhaps add predicates to the map that test for mu
Jakob Kummerow 2011/09/26 11:30:32 I'd prefer not to do that, for two reasons: (1) Th
4005 if (map->instance_type() == JS_ARRAY_TYPE) { 4070 if (map->instance_type() == JS_ARRAY_TYPE) {
4006 length = AddInstruction(new(zone()) HJSArrayLength(object, mapcheck)); 4071 length = AddInstruction(new(zone()) HJSArrayLength(object, mapcheck));
4007 } else { 4072 } else {
4008 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); 4073 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements));
4009 } 4074 }
4010 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); 4075 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length));
4011 if (is_store) { 4076 return BuildFastElementAccess(elements, checked_key, val,
4012 if (fast_double_elements) { 4077 map->elements_kind(), is_store);
4013 return new(zone()) HStoreKeyedFastDoubleElement(elements,
4014 checked_key,
4015 val);
4016 } else {
4017 return new(zone()) HStoreKeyedFastElement(elements, checked_key, val);
4018 }
4019 } else {
4020 if (fast_double_elements) {
4021 return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key);
4022 } else {
4023 return new(zone()) HLoadKeyedFastElement(elements, checked_key);
4024 }
4025 }
4026 } 4078 }
4027 4079
4028 4080
4029 HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, 4081 HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object,
4030 HValue* key, 4082 HValue* key,
4031 HValue* val, 4083 HValue* val,
4032 Expression* prop, 4084 Expression* prop,
4033 int ast_id, 4085 int ast_id,
4034 int position, 4086 int position,
4035 bool is_store, 4087 bool is_store,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4068 // FAST_DOUBLE_ELEMENTS and DICTIONARY_ELEMENTS are handled before external 4120 // FAST_DOUBLE_ELEMENTS and DICTIONARY_ELEMENTS are handled before external
4069 // arrays. 4121 // arrays.
4070 STATIC_ASSERT(FAST_SMI_ONLY_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND); 4122 STATIC_ASSERT(FAST_SMI_ONLY_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND);
4071 STATIC_ASSERT(FAST_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND); 4123 STATIC_ASSERT(FAST_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND);
4072 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND); 4124 STATIC_ASSERT(FAST_DOUBLE_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND);
4073 STATIC_ASSERT(DICTIONARY_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND); 4125 STATIC_ASSERT(DICTIONARY_ELEMENTS < FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND);
4074 4126
4075 for (ElementsKind elements_kind = FIRST_ELEMENTS_KIND; 4127 for (ElementsKind elements_kind = FIRST_ELEMENTS_KIND;
4076 elements_kind <= LAST_ELEMENTS_KIND; 4128 elements_kind <= LAST_ELEMENTS_KIND;
4077 elements_kind = ElementsKind(elements_kind + 1)) { 4129 elements_kind = ElementsKind(elements_kind + 1)) {
4078 // After having handled FAST_ELEMENTS, FAST_SMI_ELEMENTS, 4130 // After having handled FAST_ELEMENTS, FAST_SMI_ONLY_ELEMENTS,
4079 // FAST_DOUBLE_ELEMENTS and DICTIONARY_ELEMENTS, we need to add some code 4131 // FAST_DOUBLE_ELEMENTS and DICTIONARY_ELEMENTS, we need to add some code
4080 // that's executed for all external array cases. 4132 // that's executed for all external array cases.
4081 STATIC_ASSERT(LAST_EXTERNAL_ARRAY_ELEMENTS_KIND == 4133 STATIC_ASSERT(LAST_EXTERNAL_ARRAY_ELEMENTS_KIND ==
4082 LAST_ELEMENTS_KIND); 4134 LAST_ELEMENTS_KIND);
4083 if (elements_kind == FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND 4135 if (elements_kind == FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND
4084 && todo_external_array) { 4136 && todo_external_array) {
4085 HInstruction* length = 4137 HInstruction* length =
4086 AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); 4138 AddInstruction(new(zone()) HFixedArrayBaseLength(elements));
4087 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); 4139 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length));
4088 external_elements = new(zone()) HLoadExternalArrayPointer(elements); 4140 external_elements = new(zone()) HLoadExternalArrayPointer(elements);
4089 AddInstruction(external_elements); 4141 AddInstruction(external_elements);
4090 } 4142 }
4091 if (type_todo[elements_kind]) { 4143 if (type_todo[elements_kind]) {
4092 HBasicBlock* if_true = graph()->CreateBasicBlock(); 4144 HBasicBlock* if_true = graph()->CreateBasicBlock();
4093 HBasicBlock* if_false = graph()->CreateBasicBlock(); 4145 HBasicBlock* if_false = graph()->CreateBasicBlock();
4094 elements_kind_branch = new(zone()) HCompareConstantEqAndBranch( 4146 elements_kind_branch = new(zone()) HCompareConstantEqAndBranch(
4095 elements_kind_instr, elements_kind, Token::EQ_STRICT); 4147 elements_kind_instr, elements_kind, Token::EQ_STRICT);
4096 elements_kind_branch->SetSuccessorAt(0, if_true); 4148 elements_kind_branch->SetSuccessorAt(0, if_true);
4097 elements_kind_branch->SetSuccessorAt(1, if_false); 4149 elements_kind_branch->SetSuccessorAt(1, if_false);
4098 current_block()->Finish(elements_kind_branch); 4150 current_block()->Finish(elements_kind_branch);
4099 4151
4100 set_current_block(if_true); 4152 set_current_block(if_true);
4101 HInstruction* access; 4153 HInstruction* access;
4102 if (elements_kind == FAST_SMI_ONLY_ELEMENTS || 4154 if (elements_kind == FAST_SMI_ONLY_ELEMENTS ||
4103 elements_kind == FAST_ELEMENTS || 4155 elements_kind == FAST_ELEMENTS ||
4104 elements_kind == FAST_DOUBLE_ELEMENTS) { 4156 elements_kind == FAST_DOUBLE_ELEMENTS) {
4105 bool fast_double_elements = 4157 if (is_store && elements_kind == FAST_SMI_ONLY_ELEMENTS) {
4106 elements_kind == FAST_DOUBLE_ELEMENTS; 4158 // When the |object| has FAST_SMI_ONLY_ELEMENTS, chances are we'll
danno 2011/09/23 09:05:24 stype nit: passive voice instead of "we"?
Jakob Kummerow 2011/09/26 11:30:32 Done -- both comment and the code it referred to a
4107 if (is_store && !fast_double_elements) { 4159 // only ever see more Smis being stored in it, so it's fine to
4160 // just deopt if that assumption is ever wrong.
4161 AddInstruction(new(zone()) HCheckSmi(val));
4162 }
4163 if (is_store && elements_kind != FAST_DOUBLE_ELEMENTS) {
4108 AddInstruction(new(zone()) HCheckMap( 4164 AddInstruction(new(zone()) HCheckMap(
4109 elements, isolate()->factory()->fixed_array_map(), 4165 elements, isolate()->factory()->fixed_array_map(),
4110 elements_kind_branch)); 4166 elements_kind_branch));
4111 } 4167 }
4168 // TODO(jkummerow): We could get around the need for these two blocks
danno 2011/09/23 09:05:24 stype nit: passive voice instead of "we"?
Jakob Kummerow 2011/09/26 11:30:32 Done.
4169 // in one of two ways:
4170 // (1) Introduce ElementsKinds for JSArrays that are distinct from
4171 // those for fast objects.
4172 // (2) Put the common instructions into a third "join" block. This
4173 // requires additional AST IDs that we can deopt to from inside
4174 // that join block. They must be added to the Property class (when
4175 // it's a keyed property) and registered in the full codegen.
4112 HBasicBlock* if_jsarray = graph()->CreateBasicBlock(); 4176 HBasicBlock* if_jsarray = graph()->CreateBasicBlock();
4113 HBasicBlock* if_fastobject = graph()->CreateBasicBlock(); 4177 HBasicBlock* if_fastobject = graph()->CreateBasicBlock();
4114 HHasInstanceTypeAndBranch* typecheck = 4178 HHasInstanceTypeAndBranch* typecheck =
4115 new(zone()) HHasInstanceTypeAndBranch(object, JS_ARRAY_TYPE); 4179 new(zone()) HHasInstanceTypeAndBranch(object, JS_ARRAY_TYPE);
4116 typecheck->SetSuccessorAt(0, if_jsarray); 4180 typecheck->SetSuccessorAt(0, if_jsarray);
4117 typecheck->SetSuccessorAt(1, if_fastobject); 4181 typecheck->SetSuccessorAt(1, if_fastobject);
4118 current_block()->Finish(typecheck); 4182 current_block()->Finish(typecheck);
4119 4183
4120 set_current_block(if_jsarray); 4184 set_current_block(if_jsarray);
4121 HInstruction* length; 4185 HInstruction* length;
4122 if (is_store && elements_kind == FAST_SMI_ONLY_ELEMENTS) { 4186 length = AddInstruction(new(zone()) HJSArrayLength(object, typecheck));
4123 // For now, fall back to the generic stub for 4187 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length));
4124 // FAST_SMI_ONLY_ELEMENTS 4188 access = AddInstruction(BuildFastElementAccess(
4125 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); 4189 elements, checked_key, val, elements_kind, is_store));
4126 } else { 4190 if (!is_store) {
4127 length = new(zone()) HJSArrayLength(object, typecheck); 4191 Push(access);
4128 AddInstruction(length);
4129 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length));
4130 if (is_store) {
4131 if (fast_double_elements) {
4132 access = AddInstruction(
4133 new(zone()) HStoreKeyedFastDoubleElement(elements,
4134 checked_key,
4135 val));
4136 } else {
4137 access = AddInstruction(
4138 new(zone()) HStoreKeyedFastElement(elements,
4139 checked_key,
4140 val));
4141 }
4142 } else {
4143 if (fast_double_elements) {
4144 access = AddInstruction(
4145 new(zone()) HLoadKeyedFastDoubleElement(elements,
4146 checked_key));
4147 } else {
4148 access = AddInstruction(
4149 new(zone()) HLoadKeyedFastElement(elements, checked_key));
4150 }
4151 Push(access);
4152 }
4153 } 4192 }
4154 4193
4155 *has_side_effects |= access->HasSideEffects(); 4194 *has_side_effects |= access->HasSideEffects();
4156 if (position != -1) { 4195 if (position != -1) {
4157 access->set_position(position); 4196 access->set_position(position);
4158 } 4197 }
4159 if_jsarray->Goto(join); 4198 if_jsarray->Goto(join);
4160 4199
4161 set_current_block(if_fastobject); 4200 set_current_block(if_fastobject);
4162 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); 4201 length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements));
4163 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); 4202 checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length));
4164 if (is_store) { 4203 access = AddInstruction(BuildFastElementAccess(
4165 if (fast_double_elements) { 4204 elements, checked_key, val, elements_kind, is_store));
4166 access = AddInstruction(
4167 new(zone()) HStoreKeyedFastDoubleElement(elements,
4168 checked_key,
4169 val));
4170 } else {
4171 access = AddInstruction(
4172 new(zone()) HStoreKeyedFastElement(elements, checked_key, val));
4173 }
4174 } else {
4175 if (fast_double_elements) {
4176 access = AddInstruction(
4177 new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key));
4178 } else {
4179 access = AddInstruction(
4180 new(zone()) HLoadKeyedFastElement(elements, checked_key));
4181 }
4182 }
4183 } else if (elements_kind == DICTIONARY_ELEMENTS) { 4205 } else if (elements_kind == DICTIONARY_ELEMENTS) {
4184 if (is_store) { 4206 if (is_store) {
4185 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); 4207 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val));
4186 } else { 4208 } else {
4187 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); 4209 access = AddInstruction(BuildLoadKeyedGeneric(object, key));
4188 } 4210 }
4189 } else { // External array elements. 4211 } else { // External array elements.
4190 access = AddInstruction(BuildExternalArrayElementAccess( 4212 access = AddInstruction(BuildExternalArrayElementAccess(
4191 external_elements, checked_key, val, elements_kind, is_store)); 4213 external_elements, checked_key, val, elements_kind, is_store));
4192 } 4214 }
(...skipping 2666 matching lines...) Expand 10 before | Expand all | Expand 10 after
6859 } 6881 }
6860 } 6882 }
6861 6883
6862 #ifdef DEBUG 6884 #ifdef DEBUG
6863 if (graph_ != NULL) graph_->Verify(false); // No full verify. 6885 if (graph_ != NULL) graph_->Verify(false); // No full verify.
6864 if (allocator_ != NULL) allocator_->Verify(); 6886 if (allocator_ != NULL) allocator_->Verify();
6865 #endif 6887 #endif
6866 } 6888 }
6867 6889
6868 } } // namespace v8::internal 6890 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | src/hydrogen-instructions.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698