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

Side by Side Diff: src/full-codegen.cc

Issue 7134014: Stop using with explicitly to implement try/catch. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 6 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
« no previous file with comments | « src/ast.cc ('k') | src/hydrogen.cc » ('j') | src/parser.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 180
181 181
182 void BreakableStatementChecker::VisitObjectLiteral(ObjectLiteral* expr) { 182 void BreakableStatementChecker::VisitObjectLiteral(ObjectLiteral* expr) {
183 } 183 }
184 184
185 185
186 void BreakableStatementChecker::VisitArrayLiteral(ArrayLiteral* expr) { 186 void BreakableStatementChecker::VisitArrayLiteral(ArrayLiteral* expr) {
187 } 187 }
188 188
189 189
190 void BreakableStatementChecker::VisitCatchExtensionObject(
191 CatchExtensionObject* expr) {
192 }
193
194
195 void BreakableStatementChecker::VisitAssignment(Assignment* expr) { 190 void BreakableStatementChecker::VisitAssignment(Assignment* expr) {
196 // If assigning to a property (including a global property) the assignment is 191 // If assigning to a property (including a global property) the assignment is
197 // breakable. 192 // breakable.
198 Variable* var = expr->target()->AsVariableProxy()->AsVariable(); 193 Variable* var = expr->target()->AsVariableProxy()->AsVariable();
199 Property* prop = expr->target()->AsProperty(); 194 Property* prop = expr->target()->AsProperty();
200 if (prop != NULL || (var != NULL && var->is_global())) { 195 if (prop != NULL || (var != NULL && var->is_global())) {
201 is_breakable_ = true; 196 is_breakable_ = true;
202 return; 197 return;
203 } 198 }
204 199
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 950
956 EmitReturnSequence(); 951 EmitReturnSequence();
957 } 952 }
958 953
959 954
960 void FullCodeGenerator::VisitWithEnterStatement(WithEnterStatement* stmt) { 955 void FullCodeGenerator::VisitWithEnterStatement(WithEnterStatement* stmt) {
961 Comment cmnt(masm_, "[ WithEnterStatement"); 956 Comment cmnt(masm_, "[ WithEnterStatement");
962 SetStatementPosition(stmt); 957 SetStatementPosition(stmt);
963 958
964 VisitForStackValue(stmt->expression()); 959 VisitForStackValue(stmt->expression());
965 if (stmt->is_catch_block()) { 960 __ CallRuntime(Runtime::kPushContext, 1);
966 __ CallRuntime(Runtime::kPushCatchContext, 1);
967 } else {
968 __ CallRuntime(Runtime::kPushContext, 1);
969 }
970 // Both runtime calls return the new context in both the context and the
971 // result registers.
972
973 // Update local stack frame context field.
974 StoreToFrameField(StandardFrameConstants::kContextOffset, context_register()); 961 StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
975 } 962 }
976 963
977 964
978 void FullCodeGenerator::VisitWithExitStatement(WithExitStatement* stmt) { 965 void FullCodeGenerator::VisitWithExitStatement(WithExitStatement* stmt) {
979 Comment cmnt(masm_, "[ WithExitStatement"); 966 Comment cmnt(masm_, "[ WithExitStatement");
980 SetStatementPosition(stmt); 967 SetStatementPosition(stmt);
981 968
982 // Pop context. 969 // Pop context.
983 LoadContextField(context_register(), Context::PREVIOUS_INDEX); 970 LoadContextField(context_register(), Context::PREVIOUS_INDEX);
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1110 // At this point, the exception is in a register, and store it in 1097 // At this point, the exception is in a register, and store it in
1111 // the temporary local variable (prints as ".catch-var") before 1098 // the temporary local variable (prints as ".catch-var") before
1112 // executing the catch block. The catch block has been rewritten 1099 // executing the catch block. The catch block has been rewritten
1113 // to introduce a new scope to bind the catch variable and to remove 1100 // to introduce a new scope to bind the catch variable and to remove
1114 // that scope again afterwards. 1101 // that scope again afterwards.
1115 1102
1116 Label try_handler_setup, catch_entry, done; 1103 Label try_handler_setup, catch_entry, done;
1117 __ Call(&try_handler_setup); 1104 __ Call(&try_handler_setup);
1118 // Try handler code, exception in result register. 1105 // Try handler code, exception in result register.
1119 1106
1120 // Store exception in local .catch variable before executing catch block. 1107 // Extend the context before executing the catch block.
1121 { 1108 { Comment cmnt(masm_, "[ Extend catch context");
1122 // The catch variable is *always* a variable proxy for a local variable. 1109 __ push(stmt->name());
1123 Variable* catch_var = stmt->catch_var()->AsVariableProxy()->AsVariable(); 1110 __ push(result_register());
1124 ASSERT_NOT_NULL(catch_var); 1111 __ CallRuntime(Runtime::kCreateCatchExtensionObject, 2);
1125 Slot* variable_slot = catch_var->AsSlot(); 1112 __ push(result_register());
1126 ASSERT_NOT_NULL(variable_slot); 1113 __ CallRuntime(Runtime::kPushCatchContext, 1);
1127 ASSERT_EQ(Slot::LOCAL, variable_slot->type()); 1114 StoreToFrameField(StandardFrameConstants::kContextOffset,
1128 StoreToFrameField(SlotOffset(variable_slot), result_register()); 1115 context_register());
1129 } 1116 }
1130 1117
1131 Visit(stmt->catch_block()); 1118 Visit(stmt->catch_block());
1132 __ jmp(&done); 1119 __ jmp(&done);
1133 1120
1134 // Try block code. Sets up the exception handler chain. 1121 // Try block code. Sets up the exception handler chain.
1135 __ bind(&try_handler_setup); 1122 __ bind(&try_handler_setup);
1136 { 1123 {
1137 TryCatch try_block(this, &catch_entry); 1124 TryCatch try_block(this, &catch_entry);
1138 __ PushTryHandler(IN_JAVASCRIPT, TRY_CATCH_HANDLER); 1125 __ PushTryHandler(IN_JAVASCRIPT, TRY_CATCH_HANDLER);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1274 } 1261 }
1275 1262
1276 1263
1277 void FullCodeGenerator::VisitSharedFunctionInfoLiteral( 1264 void FullCodeGenerator::VisitSharedFunctionInfoLiteral(
1278 SharedFunctionInfoLiteral* expr) { 1265 SharedFunctionInfoLiteral* expr) {
1279 Comment cmnt(masm_, "[ SharedFunctionInfoLiteral"); 1266 Comment cmnt(masm_, "[ SharedFunctionInfoLiteral");
1280 EmitNewClosure(expr->shared_function_info(), false); 1267 EmitNewClosure(expr->shared_function_info(), false);
1281 } 1268 }
1282 1269
1283 1270
1284 void FullCodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* expr) {
1285 // Call runtime routine to allocate the catch extension object and
1286 // assign the exception value to the catch variable.
1287 Comment cmnt(masm_, "[ CatchExtensionObject");
1288 VisitForStackValue(expr->key());
1289 VisitForStackValue(expr->value());
1290 // Create catch extension object.
1291 __ CallRuntime(Runtime::kCreateCatchExtensionObject, 2);
1292 context()->Plug(result_register());
1293 }
1294
1295
1296 void FullCodeGenerator::VisitThrow(Throw* expr) { 1271 void FullCodeGenerator::VisitThrow(Throw* expr) {
1297 Comment cmnt(masm_, "[ Throw"); 1272 Comment cmnt(masm_, "[ Throw");
1298 VisitForStackValue(expr->exception()); 1273 VisitForStackValue(expr->exception());
1299 __ CallRuntime(Runtime::kThrow, 1); 1274 __ CallRuntime(Runtime::kThrow, 1);
1300 // Never returns here. 1275 // Never returns here.
1301 } 1276 }
1302 1277
1303 1278
1304 int FullCodeGenerator::TryFinally::Exit(int stack_depth) { 1279 int FullCodeGenerator::TryFinally::Exit(int stack_depth) {
1305 // The macros used here must preserve the result register. 1280 // The macros used here must preserve the result register.
1306 __ Drop(stack_depth); 1281 __ Drop(stack_depth);
1307 __ PopTryHandler(); 1282 __ PopTryHandler();
1308 __ Call(finally_entry_); 1283 __ Call(finally_entry_);
1309 return 0; 1284 return 0;
1310 } 1285 }
1311 1286
1312 1287
1313 int FullCodeGenerator::TryCatch::Exit(int stack_depth) { 1288 int FullCodeGenerator::TryCatch::Exit(int stack_depth) {
1314 // The macros used here must preserve the result register. 1289 // The macros used here must preserve the result register.
1315 __ Drop(stack_depth); 1290 __ Drop(stack_depth);
1316 __ PopTryHandler(); 1291 __ PopTryHandler();
1317 return 0; 1292 return 0;
1318 } 1293 }
1319 1294
1320 1295
1321 #undef __ 1296 #undef __
1322 1297
1323 1298
1324 } } // namespace v8::internal 1299 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ast.cc ('k') | src/hydrogen.cc » ('j') | src/parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698