| 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 7061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7072 if (known_global_function) { | 7072 if (known_global_function) { |
| 7073 // Push the global object instead of the global receiver because | 7073 // Push the global object instead of the global receiver because |
| 7074 // code generated by the full code generator expects it. | 7074 // code generated by the full code generator expects it. |
| 7075 HValue* context = environment()->context(); | 7075 HValue* context = environment()->context(); |
| 7076 HGlobalObject* global_object = new(zone()) HGlobalObject(context); | 7076 HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
| 7077 PushAndAdd(global_object); | 7077 PushAndAdd(global_object); |
| 7078 CHECK_ALIVE(VisitExpressions(expr->arguments())); | 7078 CHECK_ALIVE(VisitExpressions(expr->arguments())); |
| 7079 | 7079 |
| 7080 CHECK_ALIVE(VisitForValue(expr->expression())); | 7080 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 7081 HValue* function = Pop(); | 7081 HValue* function = Pop(); |
| 7082 Add<HCheckFunction>(function, expr->target()); | 7082 Add<HCheckValue>(function, expr->target()); |
| 7083 | 7083 |
| 7084 // Replace the global object with the global receiver. | 7084 // Replace the global object with the global receiver. |
| 7085 HGlobalReceiver* global_receiver = Add<HGlobalReceiver>(global_object); | 7085 HGlobalReceiver* global_receiver = Add<HGlobalReceiver>(global_object); |
| 7086 // Index of the receiver from the top of the expression stack. | 7086 // Index of the receiver from the top of the expression stack. |
| 7087 const int receiver_index = argument_count - 1; | 7087 const int receiver_index = argument_count - 1; |
| 7088 ASSERT(environment()->ExpressionStackAt(receiver_index)-> | 7088 ASSERT(environment()->ExpressionStackAt(receiver_index)-> |
| 7089 IsGlobalObject()); | 7089 IsGlobalObject()); |
| 7090 environment()->SetExpressionStackAt(receiver_index, global_receiver); | 7090 environment()->SetExpressionStackAt(receiver_index, global_receiver); |
| 7091 | 7091 |
| 7092 if (TryInlineBuiltinFunctionCall(expr, false)) { // Nothing to drop. | 7092 if (TryInlineBuiltinFunctionCall(expr, false)) { // Nothing to drop. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7124 | 7124 |
| 7125 } else if (expr->IsMonomorphic()) { | 7125 } else if (expr->IsMonomorphic()) { |
| 7126 // The function is on the stack in the unoptimized code during | 7126 // The function is on the stack in the unoptimized code during |
| 7127 // evaluation of the arguments. | 7127 // evaluation of the arguments. |
| 7128 CHECK_ALIVE(VisitForValue(expr->expression())); | 7128 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 7129 HValue* function = Top(); | 7129 HValue* function = Top(); |
| 7130 HGlobalObject* global = Add<HGlobalObject>(); | 7130 HGlobalObject* global = Add<HGlobalObject>(); |
| 7131 HGlobalReceiver* receiver = New<HGlobalReceiver>(global); | 7131 HGlobalReceiver* receiver = New<HGlobalReceiver>(global); |
| 7132 PushAndAdd(receiver); | 7132 PushAndAdd(receiver); |
| 7133 CHECK_ALIVE(VisitExpressions(expr->arguments())); | 7133 CHECK_ALIVE(VisitExpressions(expr->arguments())); |
| 7134 Add<HCheckFunction>(function, expr->target()); | 7134 Add<HCheckValue>(function, expr->target()); |
| 7135 | 7135 |
| 7136 if (TryInlineBuiltinFunctionCall(expr, true)) { // Drop the function. | 7136 if (TryInlineBuiltinFunctionCall(expr, true)) { // Drop the function. |
| 7137 if (FLAG_trace_inlining) { | 7137 if (FLAG_trace_inlining) { |
| 7138 PrintF("Inlining builtin "); | 7138 PrintF("Inlining builtin "); |
| 7139 expr->target()->ShortPrint(); | 7139 expr->target()->ShortPrint(); |
| 7140 PrintF("\n"); | 7140 PrintF("\n"); |
| 7141 } | 7141 } |
| 7142 return; | 7142 return; |
| 7143 } | 7143 } |
| 7144 | 7144 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7187 | 7187 |
| 7188 if (FLAG_inline_construct && | 7188 if (FLAG_inline_construct && |
| 7189 expr->IsMonomorphic() && | 7189 expr->IsMonomorphic() && |
| 7190 IsAllocationInlineable(expr->target())) { | 7190 IsAllocationInlineable(expr->target())) { |
| 7191 // The constructor function is on the stack in the unoptimized code | 7191 // The constructor function is on the stack in the unoptimized code |
| 7192 // during evaluation of the arguments. | 7192 // during evaluation of the arguments. |
| 7193 CHECK_ALIVE(VisitForValue(expr->expression())); | 7193 CHECK_ALIVE(VisitForValue(expr->expression())); |
| 7194 HValue* function = Top(); | 7194 HValue* function = Top(); |
| 7195 CHECK_ALIVE(VisitExpressions(expr->arguments())); | 7195 CHECK_ALIVE(VisitExpressions(expr->arguments())); |
| 7196 Handle<JSFunction> constructor = expr->target(); | 7196 Handle<JSFunction> constructor = expr->target(); |
| 7197 HValue* check = Add<HCheckFunction>(function, constructor); | 7197 HValue* check = Add<HCheckValue>(function, constructor); |
| 7198 | 7198 |
| 7199 // Force completion of inobject slack tracking before generating | 7199 // Force completion of inobject slack tracking before generating |
| 7200 // allocation code to finalize instance size. | 7200 // allocation code to finalize instance size. |
| 7201 if (constructor->shared()->IsInobjectSlackTrackingInProgress()) { | 7201 if (constructor->shared()->IsInobjectSlackTrackingInProgress()) { |
| 7202 constructor->shared()->CompleteInobjectSlackTracking(); | 7202 constructor->shared()->CompleteInobjectSlackTracking(); |
| 7203 } | 7203 } |
| 7204 | 7204 |
| 7205 // Calculate instance size from initial map of constructor. | 7205 // Calculate instance size from initial map of constructor. |
| 7206 ASSERT(constructor->has_initial_map()); | 7206 ASSERT(constructor->has_initial_map()); |
| 7207 Handle<Map> initial_map(constructor->initial_map()); | 7207 Handle<Map> initial_map(constructor->initial_map()); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7279 // The constructor function is both an operand to the instruction and an | 7279 // The constructor function is both an operand to the instruction and an |
| 7280 // argument to the construct call. | 7280 // argument to the construct call. |
| 7281 Handle<JSFunction> array_function( | 7281 Handle<JSFunction> array_function( |
| 7282 isolate()->global_context()->array_function(), isolate()); | 7282 isolate()->global_context()->array_function(), isolate()); |
| 7283 CHECK_ALIVE(VisitArgument(expr->expression())); | 7283 CHECK_ALIVE(VisitArgument(expr->expression())); |
| 7284 HValue* constructor = HPushArgument::cast(Top())->argument(); | 7284 HValue* constructor = HPushArgument::cast(Top())->argument(); |
| 7285 CHECK_ALIVE(VisitArgumentList(expr->arguments())); | 7285 CHECK_ALIVE(VisitArgumentList(expr->arguments())); |
| 7286 HBinaryCall* call; | 7286 HBinaryCall* call; |
| 7287 if (expr->target().is_identical_to(array_function)) { | 7287 if (expr->target().is_identical_to(array_function)) { |
| 7288 Handle<Cell> cell = expr->allocation_info_cell(); | 7288 Handle<Cell> cell = expr->allocation_info_cell(); |
| 7289 Add<HCheckFunction>(constructor, array_function); | 7289 Add<HCheckValue>(constructor, array_function); |
| 7290 call = new(zone()) HCallNewArray(context, constructor, argument_count, | 7290 call = new(zone()) HCallNewArray(context, constructor, argument_count, |
| 7291 cell, expr->elements_kind()); | 7291 cell, expr->elements_kind()); |
| 7292 } else { | 7292 } else { |
| 7293 call = new(zone()) HCallNew(context, constructor, argument_count); | 7293 call = new(zone()) HCallNew(context, constructor, argument_count); |
| 7294 } | 7294 } |
| 7295 Drop(argument_count); | 7295 Drop(argument_count); |
| 7296 call->set_position(expr->position()); | 7296 call->set_position(expr->position()); |
| 7297 return ast_context()->ReturnInstruction(call, expr->id()); | 7297 return ast_context()->ReturnInstruction(call, expr->id()); |
| 7298 } | 7298 } |
| 7299 } | 7299 } |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8106 } | 8106 } |
| 8107 } | 8107 } |
| 8108 | 8108 |
| 8109 // If the target is not null we have found a known global function that is | 8109 // If the target is not null we have found a known global function that is |
| 8110 // assumed to stay the same for this instanceof. | 8110 // assumed to stay the same for this instanceof. |
| 8111 if (target.is_null()) { | 8111 if (target.is_null()) { |
| 8112 HInstanceOf* result = new(zone()) HInstanceOf(context, left, right); | 8112 HInstanceOf* result = new(zone()) HInstanceOf(context, left, right); |
| 8113 result->set_position(expr->position()); | 8113 result->set_position(expr->position()); |
| 8114 return ast_context()->ReturnInstruction(result, expr->id()); | 8114 return ast_context()->ReturnInstruction(result, expr->id()); |
| 8115 } else { | 8115 } else { |
| 8116 Add<HCheckFunction>(right, target); | 8116 Add<HCheckValue>(right, target); |
| 8117 HInstanceOfKnownGlobal* result = | 8117 HInstanceOfKnownGlobal* result = |
| 8118 new(zone()) HInstanceOfKnownGlobal(context, left, target); | 8118 new(zone()) HInstanceOfKnownGlobal(context, left, target); |
| 8119 result->set_position(expr->position()); | 8119 result->set_position(expr->position()); |
| 8120 return ast_context()->ReturnInstruction(result, expr->id()); | 8120 return ast_context()->ReturnInstruction(result, expr->id()); |
| 8121 } | 8121 } |
| 8122 | 8122 |
| 8123 // Code below assumes that we don't fall through. | 8123 // Code below assumes that we don't fall through. |
| 8124 UNREACHABLE(); | 8124 UNREACHABLE(); |
| 8125 } else if (op == Token::IN) { | 8125 } else if (op == Token::IN) { |
| 8126 HValue* function = AddLoadJSBuiltin(Builtins::IN); | 8126 HValue* function = AddLoadJSBuiltin(Builtins::IN); |
| (...skipping 1722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9849 if (ShouldProduceTraceOutput()) { | 9849 if (ShouldProduceTraceOutput()) { |
| 9850 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9850 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9851 } | 9851 } |
| 9852 | 9852 |
| 9853 #ifdef DEBUG | 9853 #ifdef DEBUG |
| 9854 graph_->Verify(false); // No full verify. | 9854 graph_->Verify(false); // No full verify. |
| 9855 #endif | 9855 #endif |
| 9856 } | 9856 } |
| 9857 | 9857 |
| 9858 } } // namespace v8::internal | 9858 } } // namespace v8::internal |
| OLD | NEW |