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

Side by Side Diff: src/hydrogen.cc

Issue 5753005: Make closures optimizable by Crankshaft compiler. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 10 years 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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 2351 matching lines...) Expand 10 before | Expand all | Expand 10 after
2362 AddInstruction(call->PushArgumentAt(i)); 2362 AddInstruction(call->PushArgumentAt(i));
2363 } 2363 }
2364 } 2364 }
2365 2365
2366 2366
2367 void HGraphBuilder::SetupScope(Scope* scope) { 2367 void HGraphBuilder::SetupScope(Scope* scope) {
2368 // We don't yet handle the function name for named function expressions. 2368 // We don't yet handle the function name for named function expressions.
2369 if (scope->function() != NULL) BAILOUT("named function expression"); 2369 if (scope->function() != NULL) BAILOUT("named function expression");
2370 2370
2371 // We can't handle heap-allocated locals. 2371 // We can't handle heap-allocated locals.
2372 if (scope->num_heap_slots() > 0) BAILOUT("heap allocated locals"); 2372 if (scope->num_heap_slots() > 0) BAILOUT("heap allocated locals");
fschneider 2010/12/13 19:00:18 I think this bailout can go away, too.
antonm 2010/12/13 22:41:04 I am not sure. Apparently it makes us bail out of
2373 2373
2374 HConstant* undefined_constant = 2374 HConstant* undefined_constant =
2375 new HConstant(Factory::undefined_value(), Representation::Tagged()); 2375 new HConstant(Factory::undefined_value(), Representation::Tagged());
2376 AddInstruction(undefined_constant); 2376 AddInstruction(undefined_constant);
2377 graph_->set_undefined_constant(undefined_constant); 2377 graph_->set_undefined_constant(undefined_constant);
2378 2378
2379 // Set the initial values of parameters including "this". "This" has 2379 // Set the initial values of parameters including "this". "This" has
2380 // parameter index 0. 2380 // parameter index 0.
2381 int count = scope->num_parameters() + 1; 2381 int count = scope->num_parameters() + 1;
2382 for (int i = 0; i < count; ++i) { 2382 for (int i = 0; i < count; ++i) {
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
2923 2923
2924 void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { 2924 void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
2925 Variable* variable = expr->AsVariable(); 2925 Variable* variable = expr->AsVariable();
2926 if (variable == NULL) { 2926 if (variable == NULL) {
2927 BAILOUT("reference to rewritten variable"); 2927 BAILOUT("reference to rewritten variable");
2928 } else if (variable->IsStackAllocated()) { 2928 } else if (variable->IsStackAllocated()) {
2929 if (environment()->Lookup(variable)->CheckFlag(HValue::kIsArguments)) { 2929 if (environment()->Lookup(variable)->CheckFlag(HValue::kIsArguments)) {
2930 BAILOUT("unsupported context for arguments object"); 2930 BAILOUT("unsupported context for arguments object");
2931 } 2931 }
2932 ast_context()->ReturnValue(environment()->Lookup(variable)); 2932 ast_context()->ReturnValue(environment()->Lookup(variable));
2933 } else if (variable->AsSlot() != NULL &&
2934 variable->AsSlot()->type() == Slot::CONTEXT) {
fschneider 2010/12/13 19:00:18 Indentation.
antonm 2010/12/13 22:41:04 Done.
2935 if (variable->mode() == Variable::CONST) {
2936 BAILOUT("reference to const context slot");
2937 }
2938 Slot* slot = variable->AsSlot();
2939 CompilationInfo* info = graph()->info();
2940 int context_chain_length = info->function()->scope()->
2941 ContextChainLength(slot->var()->scope());
2942 ASSERT(context_chain_length >= 0);
2943 Handle<JSFunction> closure = info->closure();
2944 Context* context = closure->context();
2945 for (int i = 0; i < context_chain_length; i++) {
2946 context = context->closure()->context();
2947 }
2948 // TODO(antonm): if slot's value is not modified by closures, instead
2949 // of reading it out of context, we could just embed the value as
2950 // a constant.
2951 HLoadContextSlot* instr =
2952 new HLoadContextSlot(Handle<Context>(context), slot->index());
2953 ast_context()->ReturnInstruction(instr, expr->id());
2933 } else if (variable->is_global()) { 2954 } else if (variable->is_global()) {
2934 LookupResult lookup; 2955 LookupResult lookup;
2935 LookupGlobalPropertyCell(variable, &lookup, false); 2956 LookupGlobalPropertyCell(variable, &lookup, false);
2936 CHECK_BAILOUT; 2957 CHECK_BAILOUT;
2937 2958
2938 Handle<GlobalObject> global(graph()->info()->global_object()); 2959 Handle<GlobalObject> global(graph()->info()->global_object());
2939 // TODO(3039103): Handle global property load through an IC call when access 2960 // TODO(3039103): Handle global property load through an IC call when access
2940 // checks are enabled. 2961 // checks are enabled.
2941 if (global->IsAccessCheckNeeded()) { 2962 if (global->IsAccessCheckNeeded()) {
2942 BAILOUT("global object requires access check"); 2963 BAILOUT("global object requires access check");
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
3434 3455
3435 if (expr->is_compound()) { 3456 if (expr->is_compound()) {
3436 HandleCompoundAssignment(expr); 3457 HandleCompoundAssignment(expr);
3437 return; 3458 return;
3438 } 3459 }
3439 3460
3440 if (var != NULL) { 3461 if (var != NULL) {
3441 if (proxy->IsArguments()) BAILOUT("assignment to arguments"); 3462 if (proxy->IsArguments()) BAILOUT("assignment to arguments");
3442 3463
3443 // Handle the assignment. 3464 // Handle the assignment.
3465 if (var->AsSlot() != NULL && var->AsSlot()->type() == Slot::CONTEXT) {
3466 BAILOUT("context slot assignment");
3467 }
3444 if (var->is_global()) { 3468 if (var->is_global()) {
3445 VISIT_FOR_VALUE(expr->value()); 3469 VISIT_FOR_VALUE(expr->value());
3446 HandleGlobalVariableAssignment(var, Top(), expr->position(), expr->id()); 3470 HandleGlobalVariableAssignment(var, Top(), expr->position(), expr->id());
3447 } else { 3471 } else {
3448 // We allow reference to the arguments object only in assignemtns 3472 // We allow reference to the arguments object only in assignemtns
3449 // to local variables to make sure that the arguments object does 3473 // to local variables to make sure that the arguments object does
3450 // not escape and is not modified. 3474 // not escape and is not modified.
3451 VariableProxy* rhs = expr->value()->AsVariableProxy(); 3475 VariableProxy* rhs = expr->value()->AsVariableProxy();
3452 if (rhs != NULL && 3476 if (rhs != NULL &&
3453 rhs->var()->IsStackAllocated() && 3477 rhs->var()->IsStackAllocated() &&
(...skipping 2211 matching lines...) Expand 10 before | Expand all | Expand 10 after
5665 } 5689 }
5666 5690
5667 #ifdef DEBUG 5691 #ifdef DEBUG
5668 if (graph_ != NULL) graph_->Verify(); 5692 if (graph_ != NULL) graph_->Verify();
5669 if (chunk_ != NULL) chunk_->Verify(); 5693 if (chunk_ != NULL) chunk_->Verify();
5670 if (allocator_ != NULL) allocator_->Verify(); 5694 if (allocator_ != NULL) allocator_->Verify();
5671 #endif 5695 #endif
5672 } 5696 }
5673 5697
5674 } } // namespace v8::internal 5698 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698