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

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

Issue 6685088: Merge isolates to bleeding_edge. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 9 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/full-codegen.h ('k') | src/func-name-inferrer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 } 268 }
269 269
270 270
271 void BreakableStatementChecker::VisitThisFunction(ThisFunction* expr) { 271 void BreakableStatementChecker::VisitThisFunction(ThisFunction* expr) {
272 } 272 }
273 273
274 274
275 #define __ ACCESS_MASM(masm()) 275 #define __ ACCESS_MASM(masm())
276 276
277 bool FullCodeGenerator::MakeCode(CompilationInfo* info) { 277 bool FullCodeGenerator::MakeCode(CompilationInfo* info) {
278 Isolate* isolate = Isolate::Current();
278 Handle<Script> script = info->script(); 279 Handle<Script> script = info->script();
279 if (!script->IsUndefined() && !script->source()->IsUndefined()) { 280 if (!script->IsUndefined() && !script->source()->IsUndefined()) {
280 int len = String::cast(script->source())->length(); 281 int len = String::cast(script->source())->length();
281 Counters::total_full_codegen_source_size.Increment(len); 282 isolate->counters()->total_full_codegen_source_size()->Increment(len);
282 } 283 }
283 if (FLAG_trace_codegen) { 284 if (FLAG_trace_codegen) {
284 PrintF("Full Compiler - "); 285 PrintF("Full Compiler - ");
285 } 286 }
286 CodeGenerator::MakeCodePrologue(info); 287 CodeGenerator::MakeCodePrologue(info);
287 const int kInitialBufferSize = 4 * KB; 288 const int kInitialBufferSize = 4 * KB;
288 MacroAssembler masm(NULL, kInitialBufferSize); 289 MacroAssembler masm(NULL, kInitialBufferSize);
289 #ifdef ENABLE_GDB_JIT_INTERFACE 290 #ifdef ENABLE_GDB_JIT_INTERFACE
290 masm.positions_recorder()->StartGDBJITLineInfoRecording(); 291 masm.positions_recorder()->StartGDBJITLineInfoRecording();
291 #endif 292 #endif
292 293
293 FullCodeGenerator cgen(&masm); 294 FullCodeGenerator cgen(&masm);
294 cgen.Generate(info); 295 cgen.Generate(info);
295 if (cgen.HasStackOverflow()) { 296 if (cgen.HasStackOverflow()) {
296 ASSERT(!Top::has_pending_exception()); 297 ASSERT(!isolate->has_pending_exception());
297 return false; 298 return false;
298 } 299 }
299 unsigned table_offset = cgen.EmitStackCheckTable(); 300 unsigned table_offset = cgen.EmitStackCheckTable();
300 301
301 Code::Flags flags = Code::ComputeFlags(Code::FUNCTION, NOT_IN_LOOP); 302 Code::Flags flags = Code::ComputeFlags(Code::FUNCTION, NOT_IN_LOOP);
302 Handle<Code> code = CodeGenerator::MakeCodeEpilogue(&masm, flags, info); 303 Handle<Code> code = CodeGenerator::MakeCodeEpilogue(&masm, flags, info);
303 code->set_optimizable(info->IsOptimizable()); 304 code->set_optimizable(info->IsOptimizable());
304 cgen.PopulateDeoptimizationData(code); 305 cgen.PopulateDeoptimizationData(code);
305 code->set_has_deoptimization_support(info->HasDeoptimizationSupport()); 306 code->set_has_deoptimization_support(info->HasDeoptimizationSupport());
306 code->set_allow_osr_at_loop_nesting_level(0); 307 code->set_allow_osr_at_loop_nesting_level(0);
(...skipping 29 matching lines...) Expand all
336 return offset; 337 return offset;
337 } 338 }
338 339
339 340
340 void FullCodeGenerator::PopulateDeoptimizationData(Handle<Code> code) { 341 void FullCodeGenerator::PopulateDeoptimizationData(Handle<Code> code) {
341 // Fill in the deoptimization information. 342 // Fill in the deoptimization information.
342 ASSERT(info_->HasDeoptimizationSupport() || bailout_entries_.is_empty()); 343 ASSERT(info_->HasDeoptimizationSupport() || bailout_entries_.is_empty());
343 if (!info_->HasDeoptimizationSupport()) return; 344 if (!info_->HasDeoptimizationSupport()) return;
344 int length = bailout_entries_.length(); 345 int length = bailout_entries_.length();
345 Handle<DeoptimizationOutputData> data = 346 Handle<DeoptimizationOutputData> data =
346 Factory::NewDeoptimizationOutputData(length, TENURED); 347 isolate()->factory()->
348 NewDeoptimizationOutputData(length, TENURED);
347 for (int i = 0; i < length; i++) { 349 for (int i = 0; i < length; i++) {
348 data->SetAstId(i, Smi::FromInt(bailout_entries_[i].id)); 350 data->SetAstId(i, Smi::FromInt(bailout_entries_[i].id));
349 data->SetPcAndState(i, Smi::FromInt(bailout_entries_[i].pc_and_state)); 351 data->SetPcAndState(i, Smi::FromInt(bailout_entries_[i].pc_and_state));
350 } 352 }
351 code->set_deoptimization_data(*data); 353 code->set_deoptimization_data(*data);
352 } 354 }
353 355
354 356
355 void FullCodeGenerator::PrepareForBailout(AstNode* node, State state) { 357 void FullCodeGenerator::PrepareForBailout(AstNode* node, State state) {
356 PrepareForBailoutForId(node->id(), state); 358 PrepareForBailoutForId(node->id(), state);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 VisitDeclaration(decl); 540 VisitDeclaration(decl);
539 } else { 541 } else {
540 // Count global variables and functions for later processing 542 // Count global variables and functions for later processing
541 globals++; 543 globals++;
542 } 544 }
543 } 545 }
544 546
545 // Compute array of global variable and function declarations. 547 // Compute array of global variable and function declarations.
546 // Do nothing in case of no declared global functions or variables. 548 // Do nothing in case of no declared global functions or variables.
547 if (globals > 0) { 549 if (globals > 0) {
548 Handle<FixedArray> array = Factory::NewFixedArray(2 * globals, TENURED); 550 Handle<FixedArray> array =
551 isolate()->factory()->NewFixedArray(2 * globals, TENURED);
549 for (int j = 0, i = 0; i < length; i++) { 552 for (int j = 0, i = 0; i < length; i++) {
550 Declaration* decl = declarations->at(i); 553 Declaration* decl = declarations->at(i);
551 Variable* var = decl->proxy()->var(); 554 Variable* var = decl->proxy()->var();
552 Slot* slot = var->AsSlot(); 555 Slot* slot = var->AsSlot();
553 556
554 if ((slot == NULL || slot->type() != Slot::LOOKUP) && var->is_global()) { 557 if ((slot == NULL || slot->type() != Slot::LOOKUP) && var->is_global()) {
555 array->set(j++, *(var->name())); 558 array->set(j++, *(var->name()));
556 if (decl->fun() == NULL) { 559 if (decl->fun() == NULL) {
557 if (var->mode() == Variable::CONST) { 560 if (var->mode() == Variable::CONST) {
558 // In case this is const property use the hole. 561 // In case this is const property use the hole.
(...skipping 30 matching lines...) Expand all
589 void FullCodeGenerator::SetReturnPosition(FunctionLiteral* fun) { 592 void FullCodeGenerator::SetReturnPosition(FunctionLiteral* fun) {
590 if (FLAG_debug_info) { 593 if (FLAG_debug_info) {
591 CodeGenerator::RecordPositions(masm_, fun->end_position() - 1); 594 CodeGenerator::RecordPositions(masm_, fun->end_position() - 1);
592 } 595 }
593 } 596 }
594 597
595 598
596 void FullCodeGenerator::SetStatementPosition(Statement* stmt) { 599 void FullCodeGenerator::SetStatementPosition(Statement* stmt) {
597 if (FLAG_debug_info) { 600 if (FLAG_debug_info) {
598 #ifdef ENABLE_DEBUGGER_SUPPORT 601 #ifdef ENABLE_DEBUGGER_SUPPORT
599 if (!Debugger::IsDebuggerActive()) { 602 if (!isolate()->debugger()->IsDebuggerActive()) {
600 CodeGenerator::RecordPositions(masm_, stmt->statement_pos()); 603 CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
601 } else { 604 } else {
602 // Check if the statement will be breakable without adding a debug break 605 // Check if the statement will be breakable without adding a debug break
603 // slot. 606 // slot.
604 BreakableStatementChecker checker; 607 BreakableStatementChecker checker;
605 checker.Check(stmt); 608 checker.Check(stmt);
606 // Record the statement position right here if the statement is not 609 // Record the statement position right here if the statement is not
607 // breakable. For breakable statements the actual recording of the 610 // breakable. For breakable statements the actual recording of the
608 // position will be postponed to the breakable code (typically an IC). 611 // position will be postponed to the breakable code (typically an IC).
609 bool position_recorded = CodeGenerator::RecordPositions( 612 bool position_recorded = CodeGenerator::RecordPositions(
610 masm_, stmt->statement_pos(), !checker.is_breakable()); 613 masm_, stmt->statement_pos(), !checker.is_breakable());
611 // If the position recording did record a new position generate a debug 614 // If the position recording did record a new position generate a debug
612 // break slot to make the statement breakable. 615 // break slot to make the statement breakable.
613 if (position_recorded) { 616 if (position_recorded) {
614 Debug::GenerateSlot(masm_); 617 Debug::GenerateSlot(masm_);
615 } 618 }
616 } 619 }
617 #else 620 #else
618 CodeGenerator::RecordPositions(masm_, stmt->statement_pos()); 621 CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
619 #endif 622 #endif
620 } 623 }
621 } 624 }
622 625
623 626
624 void FullCodeGenerator::SetExpressionPosition(Expression* expr, int pos) { 627 void FullCodeGenerator::SetExpressionPosition(Expression* expr, int pos) {
625 if (FLAG_debug_info) { 628 if (FLAG_debug_info) {
626 #ifdef ENABLE_DEBUGGER_SUPPORT 629 #ifdef ENABLE_DEBUGGER_SUPPORT
627 if (!Debugger::IsDebuggerActive()) { 630 if (!isolate()->debugger()->IsDebuggerActive()) {
628 CodeGenerator::RecordPositions(masm_, pos); 631 CodeGenerator::RecordPositions(masm_, pos);
629 } else { 632 } else {
630 // Check if the expression will be breakable without adding a debug break 633 // Check if the expression will be breakable without adding a debug break
631 // slot. 634 // slot.
632 BreakableStatementChecker checker; 635 BreakableStatementChecker checker;
633 checker.Check(expr); 636 checker.Check(expr);
634 // Record a statement position right here if the expression is not 637 // Record a statement position right here if the expression is not
635 // breakable. For breakable expressions the actual recording of the 638 // breakable. For breakable expressions the actual recording of the
636 // position will be postponed to the breakable code (typically an IC). 639 // position will be postponed to the breakable code (typically an IC).
637 // NOTE this will record a statement position for something which might 640 // NOTE this will record a statement position for something which might
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 ASSERT(lookup_index >= 0); 690 ASSERT(lookup_index >= 0);
688 ASSERT(static_cast<size_t>(lookup_index) < 691 ASSERT(static_cast<size_t>(lookup_index) <
689 ARRAY_SIZE(kInlineFunctionGenerators)); 692 ARRAY_SIZE(kInlineFunctionGenerators));
690 return kInlineFunctionGenerators[lookup_index]; 693 return kInlineFunctionGenerators[lookup_index];
691 } 694 }
692 695
693 696
694 void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) { 697 void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) {
695 ZoneList<Expression*>* args = node->arguments(); 698 ZoneList<Expression*>* args = node->arguments();
696 Handle<String> name = node->name(); 699 Handle<String> name = node->name();
697 Runtime::Function* function = node->function(); 700 const Runtime::Function* function = node->function();
698 ASSERT(function != NULL); 701 ASSERT(function != NULL);
699 ASSERT(function->intrinsic_type == Runtime::INLINE); 702 ASSERT(function->intrinsic_type == Runtime::INLINE);
700 InlineFunctionGenerator generator = 703 InlineFunctionGenerator generator =
701 FindInlineFunctionGenerator(function->function_id); 704 FindInlineFunctionGenerator(function->function_id);
702 ((*this).*(generator))(args); 705 ((*this).*(generator))(args);
703 } 706 }
704 707
705 708
706 void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) { 709 void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) {
707 Comment cmnt(masm_, "[ BinaryOperation"); 710 Comment cmnt(masm_, "[ BinaryOperation");
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 __ Drop(stack_depth); 1376 __ Drop(stack_depth);
1374 __ PopTryHandler(); 1377 __ PopTryHandler();
1375 return 0; 1378 return 0;
1376 } 1379 }
1377 1380
1378 1381
1379 #undef __ 1382 #undef __
1380 1383
1381 1384
1382 } } // namespace v8::internal 1385 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/full-codegen.h ('k') | src/func-name-inferrer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698