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

Side by Side Diff: src/runtime.cc

Issue 6469050: Clear exceptions set during attempts to lazily optimize. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge/build-ia32
Patch Set: Created 9 years, 10 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 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 6999 matching lines...) Expand 10 before | Expand all | Expand 10 after
7010 if (FLAG_trace_opt) { 7010 if (FLAG_trace_opt) {
7011 PrintF("[failed to optimize "); 7011 PrintF("[failed to optimize ");
7012 function->PrintName(); 7012 function->PrintName();
7013 PrintF(": is code optimizable: %s, is debugger enabled: %s]\n", 7013 PrintF(": is code optimizable: %s, is debugger enabled: %s]\n",
7014 function->shared()->code()->optimizable() ? "T" : "F", 7014 function->shared()->code()->optimizable() ? "T" : "F",
7015 Debug::has_break_points() ? "T" : "F"); 7015 Debug::has_break_points() ? "T" : "F");
7016 } 7016 }
7017 function->ReplaceCode(function->shared()->code()); 7017 function->ReplaceCode(function->shared()->code());
7018 return function->code(); 7018 return function->code();
7019 } 7019 }
7020 if (CompileOptimized(function, AstNode::kNoNumber)) { 7020 if (CompileOptimized(function, AstNode::kNoNumber, CLEAR_EXCEPTION)) {
7021 return function->code(); 7021 return function->code();
7022 } 7022 }
7023 if (FLAG_trace_opt) { 7023 if (FLAG_trace_opt) {
7024 PrintF("[failed to optimize "); 7024 PrintF("[failed to optimize ");
7025 function->PrintName(); 7025 function->PrintName();
7026 PrintF(": optimized compilation failed]\n"); 7026 PrintF(": optimized compilation failed]\n");
7027 } 7027 }
7028 function->ReplaceCode(function->shared()->code()); 7028 function->ReplaceCode(function->shared()->code());
7029 return Failure::Exception(); 7029 return function->code();
7030 } 7030 }
7031 7031
7032 7032
7033 static MaybeObject* Runtime_NotifyDeoptimized(Arguments args) { 7033 static MaybeObject* Runtime_NotifyDeoptimized(Arguments args) {
7034 HandleScope scope; 7034 HandleScope scope;
7035 ASSERT(args.length() == 1); 7035 ASSERT(args.length() == 1);
7036 RUNTIME_ASSERT(args[0]->IsSmi()); 7036 RUNTIME_ASSERT(args[0]->IsSmi());
7037 Deoptimizer::BailoutType type = 7037 Deoptimizer::BailoutType type =
7038 static_cast<Deoptimizer::BailoutType>(Smi::cast(args[0])->value()); 7038 static_cast<Deoptimizer::BailoutType>(Smi::cast(args[0])->value());
7039 Deoptimizer* deoptimizer = Deoptimizer::Grab(); 7039 Deoptimizer* deoptimizer = Deoptimizer::Grab();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
7179 ASSERT(ast_id != AstNode::kNoNumber); 7179 ASSERT(ast_id != AstNode::kNoNumber);
7180 if (FLAG_trace_osr) { 7180 if (FLAG_trace_osr) {
7181 PrintF("[replacing on-stack at AST id %d in ", ast_id); 7181 PrintF("[replacing on-stack at AST id %d in ", ast_id);
7182 function->PrintName(); 7182 function->PrintName();
7183 PrintF("]\n"); 7183 PrintF("]\n");
7184 } 7184 }
7185 7185
7186 // Try to compile the optimized code. A true return value from 7186 // Try to compile the optimized code. A true return value from
7187 // CompileOptimized means that compilation succeeded, not necessarily 7187 // CompileOptimized means that compilation succeeded, not necessarily
7188 // that optimization succeeded. 7188 // that optimization succeeded.
7189 if (CompileOptimized(function, ast_id) && function->IsOptimized()) { 7189 if (CompileOptimized(function, ast_id, CLEAR_EXCEPTION) &&
7190 function->IsOptimized()) {
7190 DeoptimizationInputData* data = DeoptimizationInputData::cast( 7191 DeoptimizationInputData* data = DeoptimizationInputData::cast(
7191 function->code()->deoptimization_data()); 7192 function->code()->deoptimization_data());
7192 if (data->OsrPcOffset()->value() >= 0) { 7193 if (data->OsrPcOffset()->value() >= 0) {
7193 if (FLAG_trace_osr) { 7194 if (FLAG_trace_osr) {
7194 PrintF("[on-stack replacement offset %d in optimized code]\n", 7195 PrintF("[on-stack replacement offset %d in optimized code]\n",
7195 data->OsrPcOffset()->value()); 7196 data->OsrPcOffset()->value());
7196 } 7197 }
7197 ASSERT(data->OsrAstId()->value() == ast_id); 7198 ASSERT(data->OsrAstId()->value() == ast_id);
7198 } else { 7199 } else {
7199 // We may never generate the desired OSR entry if we emit an 7200 // We may never generate the desired OSR entry if we emit an
(...skipping 22 matching lines...) Expand all
7222 // Allow OSR only at nesting level zero again. 7223 // Allow OSR only at nesting level zero again.
7223 unoptimized->set_allow_osr_at_loop_nesting_level(0); 7224 unoptimized->set_allow_osr_at_loop_nesting_level(0);
7224 7225
7225 // If the optimization attempt succeeded, return the AST id tagged as a 7226 // If the optimization attempt succeeded, return the AST id tagged as a
7226 // smi. This tells the builtin that we need to translate the unoptimized 7227 // smi. This tells the builtin that we need to translate the unoptimized
7227 // frame to an optimized one. 7228 // frame to an optimized one.
7228 if (succeeded) { 7229 if (succeeded) {
7229 ASSERT(function->code()->kind() == Code::OPTIMIZED_FUNCTION); 7230 ASSERT(function->code()->kind() == Code::OPTIMIZED_FUNCTION);
7230 return Smi::FromInt(ast_id); 7231 return Smi::FromInt(ast_id);
7231 } else { 7232 } else {
7233 if (function->IsMarkedForLazyRecompilation()) {
7234 function->ReplaceCode(function->shared()->code());
7235 }
7232 return Smi::FromInt(-1); 7236 return Smi::FromInt(-1);
7233 } 7237 }
7234 } 7238 }
7235 7239
7236 7240
7237 static MaybeObject* Runtime_GetFunctionDelegate(Arguments args) { 7241 static MaybeObject* Runtime_GetFunctionDelegate(Arguments args) {
7238 HandleScope scope; 7242 HandleScope scope;
7239 ASSERT(args.length() == 1); 7243 ASSERT(args.length() == 1);
7240 RUNTIME_ASSERT(!args[0]->IsJSFunction()); 7244 RUNTIME_ASSERT(!args[0]->IsJSFunction());
7241 return *Execution::GetFunctionDelegate(args.at<Object>(0)); 7245 return *Execution::GetFunctionDelegate(args.at<Object>(0));
(...skipping 3976 matching lines...) Expand 10 before | Expand all | Expand 10 after
11218 } else { 11222 } else {
11219 // Handle last resort GC and make sure to allow future allocations 11223 // Handle last resort GC and make sure to allow future allocations
11220 // to grow the heap without causing GCs (if possible). 11224 // to grow the heap without causing GCs (if possible).
11221 Counters::gc_last_resort_from_js.Increment(); 11225 Counters::gc_last_resort_from_js.Increment();
11222 Heap::CollectAllGarbage(false); 11226 Heap::CollectAllGarbage(false);
11223 } 11227 }
11224 } 11228 }
11225 11229
11226 11230
11227 } } // namespace v8::internal 11231 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698