| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 5567 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5578       Push(value); | 5578       Push(value); | 
| 5579     } | 5579     } | 
| 5580 | 5580 | 
| 5581     if (NeedsWrappingFor(info->type(), info->accessor())) { | 5581     if (NeedsWrappingFor(info->type(), info->accessor())) { | 
| 5582       HValue* function = Add<HConstant>(info->accessor()); | 5582       HValue* function = Add<HConstant>(info->accessor()); | 
| 5583       PushArgumentsFromEnvironment(argument_count); | 5583       PushArgumentsFromEnvironment(argument_count); | 
| 5584       return New<HCallFunction>(function, argument_count, WRAP_AND_CALL); | 5584       return New<HCallFunction>(function, argument_count, WRAP_AND_CALL); | 
| 5585     } else if (FLAG_inline_accessors && can_inline_accessor) { | 5585     } else if (FLAG_inline_accessors && can_inline_accessor) { | 
| 5586       bool success = info->IsLoad() | 5586       bool success = info->IsLoad() | 
| 5587           ? TryInlineGetter(info->accessor(), info->map(), ast_id, return_id) | 5587           ? TryInlineGetter(info->accessor(), info->map(), ast_id, return_id) | 
| 5588           : TryInlineSetter(info->accessor(), ast_id, return_id, value); | 5588           : TryInlineSetter( | 
|  | 5589               info->accessor(), info->map(), ast_id, return_id, value); | 
| 5589       if (success) return NULL; | 5590       if (success) return NULL; | 
| 5590     } | 5591     } | 
| 5591 | 5592 | 
| 5592     PushArgumentsFromEnvironment(argument_count); | 5593     PushArgumentsFromEnvironment(argument_count); | 
| 5593     return BuildCallConstantFunction(info->accessor(), argument_count); | 5594     return BuildCallConstantFunction(info->accessor(), argument_count); | 
| 5594   } | 5595   } | 
| 5595 | 5596 | 
| 5596   ASSERT(info->lookup()->IsConstant()); | 5597   ASSERT(info->lookup()->IsConstant()); | 
| 5597   if (info->IsLoad()) { | 5598   if (info->IsLoad()) { | 
| 5598     return New<HConstant>(info->constant()); | 5599     return New<HConstant>(info->constant()); | 
| (...skipping 1814 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7413   return TryInline(getter, | 7414   return TryInline(getter, | 
| 7414                    0, | 7415                    0, | 
| 7415                    NULL, | 7416                    NULL, | 
| 7416                    ast_id, | 7417                    ast_id, | 
| 7417                    return_id, | 7418                    return_id, | 
| 7418                    GETTER_CALL_RETURN); | 7419                    GETTER_CALL_RETURN); | 
| 7419 } | 7420 } | 
| 7420 | 7421 | 
| 7421 | 7422 | 
| 7422 bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, | 7423 bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, | 
|  | 7424                                              Handle<Map> receiver_map, | 
| 7423                                              BailoutId id, | 7425                                              BailoutId id, | 
| 7424                                              BailoutId assignment_id, | 7426                                              BailoutId assignment_id, | 
| 7425                                              HValue* implicit_return_value) { | 7427                                              HValue* implicit_return_value) { | 
|  | 7428   if (TryInlineApiSetter(setter, receiver_map, id)) return true; | 
| 7426   return TryInline(setter, | 7429   return TryInline(setter, | 
| 7427                    1, | 7430                    1, | 
| 7428                    implicit_return_value, | 7431                    implicit_return_value, | 
| 7429                    id, assignment_id, | 7432                    id, assignment_id, | 
| 7430                    SETTER_CALL_RETURN); | 7433                    SETTER_CALL_RETURN); | 
| 7431 } | 7434 } | 
| 7432 | 7435 | 
| 7433 | 7436 | 
| 7434 bool HOptimizedGraphBuilder::TryInlineApply(Handle<JSFunction> function, | 7437 bool HOptimizedGraphBuilder::TryInlineApply(Handle<JSFunction> function, | 
| 7435                                             Call* expr, | 7438                                             Call* expr, | 
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7726   receiver_maps.Add(receiver_map, zone()); | 7729   receiver_maps.Add(receiver_map, zone()); | 
| 7727   return TryInlineApiCall(function, | 7730   return TryInlineApiCall(function, | 
| 7728                           NULL,  // Receiver is on expression stack. | 7731                           NULL,  // Receiver is on expression stack. | 
| 7729                           &receiver_maps, | 7732                           &receiver_maps, | 
| 7730                           0, | 7733                           0, | 
| 7731                           ast_id, | 7734                           ast_id, | 
| 7732                           kCallApiGetter); | 7735                           kCallApiGetter); | 
| 7733 } | 7736 } | 
| 7734 | 7737 | 
| 7735 | 7738 | 
|  | 7739 bool HOptimizedGraphBuilder::TryInlineApiSetter(Handle<JSFunction> function, | 
|  | 7740                                                 Handle<Map> receiver_map, | 
|  | 7741                                                 BailoutId ast_id) { | 
|  | 7742   SmallMapList receiver_maps(1, zone()); | 
|  | 7743   receiver_maps.Add(receiver_map, zone()); | 
|  | 7744   return TryInlineApiCall(function, | 
|  | 7745                           NULL,  // Receiver is on expression stack. | 
|  | 7746                           &receiver_maps, | 
|  | 7747                           1, | 
|  | 7748                           ast_id, | 
|  | 7749                           kCallApiSetter); | 
|  | 7750 } | 
|  | 7751 | 
|  | 7752 | 
| 7736 bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function, | 7753 bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function, | 
| 7737                                                HValue* receiver, | 7754                                                HValue* receiver, | 
| 7738                                                SmallMapList* receiver_maps, | 7755                                                SmallMapList* receiver_maps, | 
| 7739                                                int argc, | 7756                                                int argc, | 
| 7740                                                BailoutId ast_id, | 7757                                                BailoutId ast_id, | 
| 7741                                                ApiCallType call_type) { | 7758                                                ApiCallType call_type) { | 
| 7742   CallOptimization optimization(function); | 7759   CallOptimization optimization(function); | 
| 7743   if (!optimization.is_simple_api_call()) return false; | 7760   if (!optimization.is_simple_api_call()) return false; | 
| 7744   Handle<Map> holder_map; | 7761   Handle<Map> holder_map; | 
| 7745   if (call_type == kCallApiFunction) { | 7762   if (call_type == kCallApiFunction) { | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7781       drop_extra = true; | 7798       drop_extra = true; | 
| 7782       break; | 7799       break; | 
| 7783     case kCallApiGetter: | 7800     case kCallApiGetter: | 
| 7784       // Receiver and prototype chain cannot have changed. | 7801       // Receiver and prototype chain cannot have changed. | 
| 7785       ASSERT_EQ(0, argc); | 7802       ASSERT_EQ(0, argc); | 
| 7786       ASSERT_EQ(NULL, receiver); | 7803       ASSERT_EQ(NULL, receiver); | 
| 7787       // Receiver is on expression stack. | 7804       // Receiver is on expression stack. | 
| 7788       receiver = Pop(); | 7805       receiver = Pop(); | 
| 7789       Add<HPushArgument>(receiver); | 7806       Add<HPushArgument>(receiver); | 
| 7790       break; | 7807       break; | 
|  | 7808     case kCallApiSetter: | 
|  | 7809       { | 
|  | 7810         // Receiver and prototype chain cannot have changed. | 
|  | 7811         ASSERT_EQ(1, argc); | 
|  | 7812         ASSERT_EQ(NULL, receiver); | 
|  | 7813         // Receiver and value are on expression stack. | 
|  | 7814         HValue* value = Pop(); | 
|  | 7815         receiver = Pop(); | 
|  | 7816         Add<HPushArgument>(receiver); | 
|  | 7817         Add<HPushArgument>(value); | 
|  | 7818         break; | 
|  | 7819      } | 
| 7791   } | 7820   } | 
| 7792 | 7821 | 
| 7793   HValue* holder = NULL; | 7822   HValue* holder = NULL; | 
| 7794   switch (holder_lookup) { | 7823   switch (holder_lookup) { | 
| 7795     case CallOptimization::kHolderFound: | 7824     case CallOptimization::kHolderFound: | 
| 7796       holder = Add<HConstant>(api_holder); | 7825       holder = Add<HConstant>(api_holder); | 
| 7797       break; | 7826       break; | 
| 7798     case CallOptimization::kHolderIsReceiver: | 7827     case CallOptimization::kHolderIsReceiver: | 
| 7799       holder = receiver; | 7828       holder = receiver; | 
| 7800       break; | 7829       break; | 
| (...skipping 3403 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 11204   if (ShouldProduceTraceOutput()) { | 11233   if (ShouldProduceTraceOutput()) { | 
| 11205     isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11234     isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 
| 11206   } | 11235   } | 
| 11207 | 11236 | 
| 11208 #ifdef DEBUG | 11237 #ifdef DEBUG | 
| 11209   graph_->Verify(false);  // No full verify. | 11238   graph_->Verify(false);  // No full verify. | 
| 11210 #endif | 11239 #endif | 
| 11211 } | 11240 } | 
| 11212 | 11241 | 
| 11213 } }  // namespace v8::internal | 11242 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|