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

Side by Side Diff: src/objects.cc

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: fixed gcmole issue Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 13400 matching lines...) Expand 10 before | Expand all | Expand 10 after
13411 } else { 13411 } else {
13412 DCHECK(src_obj->IsString()); 13412 DCHECK(src_obj->IsString());
13413 Handle<String> src(String::cast(src_obj), isolate); 13413 Handle<String> src(String::cast(src_obj), isolate);
13414 Handle<FixedArray> array = String::CalculateLineEnds(src, true); 13414 Handle<FixedArray> array = String::CalculateLineEnds(src, true);
13415 script->set_line_ends(*array); 13415 script->set_line_ends(*array);
13416 } 13416 }
13417 13417
13418 DCHECK(script->line_ends()->IsFixedArray()); 13418 DCHECK(script->line_ends()->IsFixedArray());
13419 } 13419 }
13420 13420
13421 bool Script::GetPositionInfo(Handle<Script> script, int position,
13422 PositionInfo* info, OffsetFlag offset_flag) {
13423 InitLineEnds(script);
13424 return script->GetPositionInfo(position, info, offset_flag);
13425 }
13426
13427 namespace {
13428 bool GetPositionInfoSlow(const Script* script, int position,
13429 Script::PositionInfo* info) {
13430 if (!script->source()->IsString()) return false;
13431 if (position < 0) position = 0;
13432
13433 String* source_string = String::cast(script->source());
13434 int line = 0;
13435 int line_start = 0;
13436 int len = source_string->length();
13437 for (int pos = 0; pos <= len; ++pos) {
13438 if (pos == len || source_string->Get(pos) == '\n') {
13439 if (position <= pos) {
13440 info->line = line;
13441 info->column = position - line_start;
13442 info->line_start = line_start;
13443 info->line_end = pos;
13444 return true;
13445 }
13446 line++;
13447 line_start = pos + 1;
13448 }
13449 }
13450 return false;
13451 }
13452 } // namespace
13453
13421 #define SMI_VALUE(x) (Smi::cast(x)->value()) 13454 #define SMI_VALUE(x) (Smi::cast(x)->value())
13422 bool Script::GetPositionInfo(int position, PositionInfo* info, 13455 bool Script::GetPositionInfo(int position, PositionInfo* info,
13423 OffsetFlag offset_flag) { 13456 OffsetFlag offset_flag) const {
13424 Handle<Script> script(this);
13425 InitLineEnds(script);
13426
13427 DisallowHeapAllocation no_allocation; 13457 DisallowHeapAllocation no_allocation;
13428 13458
13429 DCHECK(script->line_ends()->IsFixedArray()); 13459 if (line_ends()->IsUndefined(GetIsolate())) {
13430 FixedArray* ends = FixedArray::cast(script->line_ends()); 13460 // Slow mode: we do not have line_ends. We have to iterate through source.
13461 if (!GetPositionInfoSlow(this, position, info)) return false;
13462 } else {
13463 DCHECK(line_ends()->IsFixedArray());
13464 FixedArray* ends = FixedArray::cast(line_ends());
13431 13465
13432 const int ends_len = ends->length(); 13466 const int ends_len = ends->length();
13433 if (ends_len == 0) return false; 13467 if (ends_len == 0) return false;
13434 13468
13435 // Return early on invalid positions. Negative positions behave as if 0 was 13469 // Return early on invalid positions. Negative positions behave as if 0 was
13436 // passed, and positions beyond the end of the script return as failure. 13470 // passed, and positions beyond the end of the script return as failure.
13437 if (position < 0) { 13471 if (position < 0) {
13438 position = 0; 13472 position = 0;
13439 } else if (position > SMI_VALUE(ends->get(ends_len - 1))) { 13473 } else if (position > SMI_VALUE(ends->get(ends_len - 1))) {
13440 return false; 13474 return false;
13441 } 13475 }
13442 13476
13443 // Determine line number by doing a binary search on the line ends array. 13477 // Determine line number by doing a binary search on the line ends array.
13444 if (SMI_VALUE(ends->get(0)) >= position) { 13478 if (SMI_VALUE(ends->get(0)) >= position) {
13445 info->line = 0; 13479 info->line = 0;
13446 info->line_start = 0; 13480 info->line_start = 0;
13447 info->column = position; 13481 info->column = position;
13448 } else { 13482 } else {
13449 int left = 0; 13483 int left = 0;
13450 int right = ends_len - 1; 13484 int right = ends_len - 1;
13451 13485
13452 while (right > 0) { 13486 while (right > 0) {
13453 DCHECK_LE(left, right); 13487 DCHECK_LE(left, right);
13454 const int mid = (left + right) / 2; 13488 const int mid = (left + right) / 2;
13455 if (position > SMI_VALUE(ends->get(mid))) { 13489 if (position > SMI_VALUE(ends->get(mid))) {
13456 left = mid + 1; 13490 left = mid + 1;
13457 } else if (position <= SMI_VALUE(ends->get(mid - 1))) { 13491 } else if (position <= SMI_VALUE(ends->get(mid - 1))) {
13458 right = mid - 1; 13492 right = mid - 1;
13459 } else { 13493 } else {
13460 info->line = mid; 13494 info->line = mid;
13461 break; 13495 break;
13496 }
13462 } 13497 }
13498 DCHECK(SMI_VALUE(ends->get(info->line)) >= position &&
13499 SMI_VALUE(ends->get(info->line - 1)) < position);
13500 info->line_start = SMI_VALUE(ends->get(info->line - 1)) + 1;
13501 info->column = position - info->line_start;
13463 } 13502 }
13464 DCHECK(SMI_VALUE(ends->get(info->line)) >= position &&
13465 SMI_VALUE(ends->get(info->line - 1)) < position);
13466 info->line_start = SMI_VALUE(ends->get(info->line - 1)) + 1;
13467 info->column = position - info->line_start;
13468 }
13469 13503
13470 // Line end is position of the linebreak character. 13504 // Line end is position of the linebreak character.
13471 info->line_end = SMI_VALUE(ends->get(info->line)); 13505 info->line_end = SMI_VALUE(ends->get(info->line));
13472 if (info->line_end > 0) { 13506 if (info->line_end > 0) {
13473 DCHECK(script->source()->IsString()); 13507 DCHECK(source()->IsString());
13474 Handle<String> src(String::cast(script->source())); 13508 String* src = String::cast(source());
13475 if (src->length() >= info->line_end && 13509 if (src->length() >= info->line_end &&
13476 src->Get(info->line_end - 1) == '\r') { 13510 src->Get(info->line_end - 1) == '\r') {
13477 info->line_end--; 13511 info->line_end--;
13512 }
13478 } 13513 }
13479 } 13514 }
13480 13515
13481 // Add offsets if requested. 13516 // Add offsets if requested.
13482 if (offset_flag == WITH_OFFSET) { 13517 if (offset_flag == WITH_OFFSET) {
13483 if (info->line == 0) { 13518 if (info->line == 0) {
13484 info->column += script->column_offset(); 13519 info->column += column_offset();
13485 } 13520 }
13486 info->line += script->line_offset(); 13521 info->line += line_offset();
13487 } 13522 }
13488 13523
13489 return true; 13524 return true;
13490 } 13525 }
13491 #undef SMI_VALUE 13526 #undef SMI_VALUE
13492 13527
13493 int Script::GetColumnNumber(Handle<Script> script, int code_pos) { 13528 int Script::GetColumnNumber(Handle<Script> script, int code_pos) {
13494 PositionInfo info; 13529 PositionInfo info;
13495 if (!script->GetPositionInfo(code_pos, &info, WITH_OFFSET)) { 13530 GetPositionInfo(script, code_pos, &info, WITH_OFFSET);
13496 return -1;
13497 }
13498
13499 return info.column; 13531 return info.column;
13500 } 13532 }
13501 13533
13502 int Script::GetLineNumberWithArray(int code_pos) { 13534 int Script::GetColumnNumber(int code_pos) const {
13503 PositionInfo info; 13535 PositionInfo info;
13504 if (!GetPositionInfo(code_pos, &info, WITH_OFFSET)) { 13536 GetPositionInfo(code_pos, &info, WITH_OFFSET);
13505 return -1; 13537 return info.column;
13506 } 13538 }
13507 13539
13540 int Script::GetLineNumber(Handle<Script> script, int code_pos) {
13541 PositionInfo info;
13542 GetPositionInfo(script, code_pos, &info, WITH_OFFSET);
13508 return info.line; 13543 return info.line;
13509 } 13544 }
13510 13545
13511 13546 int Script::GetLineNumber(int code_pos) const {
13512 int Script::GetLineNumber(Handle<Script> script, int code_pos) { 13547 PositionInfo info;
13513 InitLineEnds(script); 13548 GetPositionInfo(code_pos, &info, WITH_OFFSET);
13514 return script->GetLineNumberWithArray(code_pos); 13549 return info.line;
13515 } 13550 }
13516 13551
13517
13518 int Script::GetLineNumber(int code_pos) {
13519 DisallowHeapAllocation no_allocation;
13520 if (!line_ends()->IsUndefined(GetIsolate())) {
13521 return GetLineNumberWithArray(code_pos);
13522 }
13523
13524 // Slow mode: we do not have line_ends. We have to iterate through source.
13525 if (!source()->IsString()) return -1;
13526
13527 String* source_string = String::cast(source());
13528 int line = 0;
13529 int len = source_string->length();
13530 for (int pos = 0; pos < len; pos++) {
13531 if (pos == code_pos) break;
13532 if (source_string->Get(pos) == '\n') line++;
13533 }
13534 return line;
13535 }
13536
13537
13538 Handle<Object> Script::GetNameOrSourceURL(Handle<Script> script) { 13552 Handle<Object> Script::GetNameOrSourceURL(Handle<Script> script) {
13539 Isolate* isolate = script->GetIsolate(); 13553 Isolate* isolate = script->GetIsolate();
13540 13554
13541 // Keep in sync with ScriptNameOrSourceURL in messages.js. 13555 // Keep in sync with ScriptNameOrSourceURL in messages.js.
13542 13556
13543 if (!script->source_url()->IsUndefined(isolate)) { 13557 if (!script->source_url()->IsUndefined(isolate)) {
13544 return handle(script->source_url(), isolate); 13558 return handle(script->source_url(), isolate);
13545 } 13559 }
13546 return handle(script->name(), isolate); 13560 return handle(script->name(), isolate);
13547 } 13561 }
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
14283 } 14297 }
14284 } 14298 }
14285 14299
14286 int AbstractCode::SourcePosition(int offset) { 14300 int AbstractCode::SourcePosition(int offset) {
14287 int position = 0; 14301 int position = 0;
14288 // Subtract one because the current PC is one instruction after the call site. 14302 // Subtract one because the current PC is one instruction after the call site.
14289 if (IsCode()) offset--; 14303 if (IsCode()) offset--;
14290 for (SourcePositionTableIterator iterator(source_position_table()); 14304 for (SourcePositionTableIterator iterator(source_position_table());
14291 !iterator.done() && iterator.code_offset() <= offset; 14305 !iterator.done() && iterator.code_offset() <= offset;
14292 iterator.Advance()) { 14306 iterator.Advance()) {
14293 position = iterator.source_position(); 14307 position = iterator.source_position().ScriptOffset();
14294 } 14308 }
14295 return position; 14309 return position;
14296 } 14310 }
14297 14311
14298 int AbstractCode::SourceStatementPosition(int offset) { 14312 int AbstractCode::SourceStatementPosition(int offset) {
14299 // First find the closest position. 14313 // First find the closest position.
14300 int position = SourcePosition(offset); 14314 int position = SourcePosition(offset);
14301 // Now find the closest statement position before the position. 14315 // Now find the closest statement position before the position.
14302 int statement_position = 0; 14316 int statement_position = 0;
14303 for (SourcePositionTableIterator it(source_position_table()); !it.done(); 14317 for (SourcePositionTableIterator it(source_position_table()); !it.done();
14304 it.Advance()) { 14318 it.Advance()) {
14305 if (it.is_statement()) { 14319 if (it.is_statement()) {
14306 int p = it.source_position(); 14320 int p = it.source_position().ScriptOffset();
14307 if (statement_position < p && p <= position) { 14321 if (statement_position < p && p <= position) {
14308 statement_position = p; 14322 statement_position = p;
14309 } 14323 }
14310 } 14324 }
14311 } 14325 }
14312 return statement_position; 14326 return statement_position;
14313 } 14327 }
14314 14328
14315 void JSFunction::ClearTypeFeedbackInfo() { 14329 void JSFunction::ClearTypeFeedbackInfo() {
14316 feedback_vector()->ClearSlots(shared()); 14330 feedback_vector()->ClearSlots(shared());
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
14514 UNREACHABLE(); 14528 UNREACHABLE();
14515 break; 14529 break;
14516 } 14530 }
14517 return NULL; 14531 return NULL;
14518 } 14532 }
14519 14533
14520 14534
14521 void Code::PrintDeoptLocation(FILE* out, Address pc) { 14535 void Code::PrintDeoptLocation(FILE* out, Address pc) {
14522 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(this, pc); 14536 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(this, pc);
14523 class SourcePosition pos = info.position; 14537 class SourcePosition pos = info.position;
14524 if (info.deopt_reason != DeoptimizeReason::kNoReason || !pos.IsUnknown()) { 14538 if (info.deopt_reason != DeoptimizeReason::kNoReason || pos.IsKnown()) {
14525 if (FLAG_hydrogen_track_positions) { 14539 if (FLAG_hydrogen_track_positions) {
14526 PrintF(out, " ;;; deoptimize at %d_%d: %s\n", 14540 PrintF(out, " ;;; deoptimize at %d_%d: %s\n", pos.InliningId(),
14527 pos.inlining_id(), pos.position(), 14541 pos.ScriptOffset(), DeoptimizeReasonToString(info.deopt_reason));
14528 DeoptimizeReasonToString(info.deopt_reason));
14529 } else { 14542 } else {
14530 PrintF(out, " ;;; deoptimize at %d: %s\n", pos.raw(), 14543 PrintF(out, " ;;; deoptimize at ");
14531 DeoptimizeReasonToString(info.deopt_reason)); 14544 OFStream outstr(out);
14545 pos.Print(outstr, this);
14546 PrintF(out, ", %s\n", DeoptimizeReasonToString(info.deopt_reason));
14532 } 14547 }
14533 } 14548 }
14534 } 14549 }
14535 14550
14536 14551
14537 bool Code::CanDeoptAt(Address pc) { 14552 bool Code::CanDeoptAt(Address pc) {
14538 DeoptimizationInputData* deopt_data = 14553 DeoptimizationInputData* deopt_data =
14539 DeoptimizationInputData::cast(deoptimization_data()); 14554 DeoptimizationInputData::cast(deoptimization_data());
14540 Address code_start_address = instruction_start(); 14555 Address code_start_address = instruction_start();
14541 for (int i = 0; i < deopt_data->DeoptCount(); i++) { 14556 for (int i = 0; i < deopt_data->DeoptCount(); i++) {
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
14960 } 14975 }
14961 } 14976 }
14962 } 14977 }
14963 os << "\n"; 14978 os << "\n";
14964 14979
14965 SourcePositionTableIterator it(source_position_table()); 14980 SourcePositionTableIterator it(source_position_table());
14966 if (!it.done()) { 14981 if (!it.done()) {
14967 os << "Source positions:\n pc offset position\n"; 14982 os << "Source positions:\n pc offset position\n";
14968 for (; !it.done(); it.Advance()) { 14983 for (; !it.done(); it.Advance()) {
14969 os << std::setw(10) << it.code_offset() << std::setw(10) 14984 os << std::setw(10) << it.code_offset() << std::setw(10)
14970 << it.source_position() << (it.is_statement() ? " statement" : "") 14985 << it.source_position().ScriptOffset()
14971 << "\n"; 14986 << (it.is_statement() ? " statement" : "") << "\n";
14972 } 14987 }
14973 os << "\n"; 14988 os << "\n";
14974 } 14989 }
14975 14990
14976 if (kind() == FUNCTION) { 14991 if (kind() == FUNCTION) {
14977 DeoptimizationOutputData* data = 14992 DeoptimizationOutputData* data =
14978 DeoptimizationOutputData::cast(this->deoptimization_data()); 14993 DeoptimizationOutputData::cast(this->deoptimization_data());
14979 data->DeoptimizationOutputDataPrint(os); 14994 data->DeoptimizationOutputDataPrint(os);
14980 } else if (kind() == OPTIMIZED_FUNCTION) { 14995 } else if (kind() == OPTIMIZED_FUNCTION) {
14981 DeoptimizationInputData* data = 14996 DeoptimizationInputData* data =
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
15063 os << "Parameter count " << parameter_count() << "\n"; 15078 os << "Parameter count " << parameter_count() << "\n";
15064 os << "Frame size " << frame_size() << "\n"; 15079 os << "Frame size " << frame_size() << "\n";
15065 15080
15066 const uint8_t* base_address = GetFirstBytecodeAddress(); 15081 const uint8_t* base_address = GetFirstBytecodeAddress();
15067 SourcePositionTableIterator source_positions(source_position_table()); 15082 SourcePositionTableIterator source_positions(source_position_table());
15068 15083
15069 interpreter::BytecodeArrayIterator iterator(handle(this)); 15084 interpreter::BytecodeArrayIterator iterator(handle(this));
15070 while (!iterator.done()) { 15085 while (!iterator.done()) {
15071 if (!source_positions.done() && 15086 if (!source_positions.done() &&
15072 iterator.current_offset() == source_positions.code_offset()) { 15087 iterator.current_offset() == source_positions.code_offset()) {
15073 os << std::setw(5) << source_positions.source_position(); 15088 os << std::setw(5) << source_positions.source_position().ScriptOffset();
15074 os << (source_positions.is_statement() ? " S> " : " E> "); 15089 os << (source_positions.is_statement() ? " S> " : " E> ");
15075 source_positions.Advance(); 15090 source_positions.Advance();
15076 } else { 15091 } else {
15077 os << " "; 15092 os << " ";
15078 } 15093 }
15079 const uint8_t* current_address = base_address + iterator.current_offset(); 15094 const uint8_t* current_address = base_address + iterator.current_offset();
15080 os << reinterpret_cast<const void*>(current_address) << " @ " 15095 os << reinterpret_cast<const void*>(current_address) << " @ "
15081 << std::setw(4) << iterator.current_offset() << " : "; 15096 << std::setw(4) << iterator.current_offset() << " : ";
15082 interpreter::BytecodeDecoder::Decode(os, current_address, 15097 interpreter::BytecodeDecoder::Decode(os, current_address,
15083 parameter_count()); 15098 parameter_count());
(...skipping 4320 matching lines...) Expand 10 before | Expand all | Expand 10 after
19404 19419
19405 } // namespace 19420 } // namespace
19406 19421
19407 int JSMessageObject::GetLineNumber() const { 19422 int JSMessageObject::GetLineNumber() const {
19408 if (start_position() == -1) return Message::kNoLineNumberInfo; 19423 if (start_position() == -1) return Message::kNoLineNumberInfo;
19409 19424
19410 Handle<Script> the_script = handle(ScriptFromJSValue(script())); 19425 Handle<Script> the_script = handle(ScriptFromJSValue(script()));
19411 19426
19412 Script::PositionInfo info; 19427 Script::PositionInfo info;
19413 const Script::OffsetFlag offset_flag = Script::WITH_OFFSET; 19428 const Script::OffsetFlag offset_flag = Script::WITH_OFFSET;
19414 if (!the_script->GetPositionInfo(start_position(), &info, offset_flag)) { 19429 if (!Script::GetPositionInfo(the_script, start_position(), &info,
19430 offset_flag)) {
19415 return Message::kNoLineNumberInfo; 19431 return Message::kNoLineNumberInfo;
19416 } 19432 }
19417 19433
19418 return info.line + 1; 19434 return info.line + 1;
19419 } 19435 }
19420 19436
19421 int JSMessageObject::GetColumnNumber() const { 19437 int JSMessageObject::GetColumnNumber() const {
19422 if (start_position() == -1) return -1; 19438 if (start_position() == -1) return -1;
19423 19439
19424 Handle<Script> the_script = handle(ScriptFromJSValue(script())); 19440 Handle<Script> the_script = handle(ScriptFromJSValue(script()));
19425 19441
19426 Script::PositionInfo info; 19442 Script::PositionInfo info;
19427 const Script::OffsetFlag offset_flag = Script::WITH_OFFSET; 19443 const Script::OffsetFlag offset_flag = Script::WITH_OFFSET;
19428 if (!the_script->GetPositionInfo(start_position(), &info, offset_flag)) { 19444 if (!Script::GetPositionInfo(the_script, start_position(), &info,
19445 offset_flag)) {
19429 return -1; 19446 return -1;
19430 } 19447 }
19431 19448
19432 return info.column; // Note: No '+1' in contrast to GetLineNumber. 19449 return info.column; // Note: No '+1' in contrast to GetLineNumber.
19433 } 19450 }
19434 19451
19435 Handle<String> JSMessageObject::GetSourceLine() const { 19452 Handle<String> JSMessageObject::GetSourceLine() const {
19436 Handle<Script> the_script = handle(ScriptFromJSValue(script())); 19453 Handle<Script> the_script = handle(ScriptFromJSValue(script()));
19437 19454
19438 Isolate* isolate = the_script->GetIsolate(); 19455 Isolate* isolate = the_script->GetIsolate();
19439 if (the_script->type() == Script::TYPE_WASM) { 19456 if (the_script->type() == Script::TYPE_WASM) {
19440 return isolate->factory()->empty_string(); 19457 return isolate->factory()->empty_string();
19441 } 19458 }
19442 19459
19443 Script::PositionInfo info; 19460 Script::PositionInfo info;
19444 const Script::OffsetFlag offset_flag = Script::WITH_OFFSET; 19461 const Script::OffsetFlag offset_flag = Script::WITH_OFFSET;
19445 if (!the_script->GetPositionInfo(start_position(), &info, offset_flag)) { 19462 if (!Script::GetPositionInfo(the_script, start_position(), &info,
19463 offset_flag)) {
19446 return isolate->factory()->empty_string(); 19464 return isolate->factory()->empty_string();
19447 } 19465 }
19448 19466
19449 Handle<String> src = handle(String::cast(the_script->source()), isolate); 19467 Handle<String> src = handle(String::cast(the_script->source()), isolate);
19450 return isolate->factory()->NewSubString(src, info.line_start, info.line_end); 19468 return isolate->factory()->NewSubString(src, info.line_start, info.line_end);
19451 } 19469 }
19452 19470
19453 void JSArrayBuffer::Neuter() { 19471 void JSArrayBuffer::Neuter() {
19454 CHECK(is_neuterable()); 19472 CHECK(is_neuterable());
19455 CHECK(is_external()); 19473 CHECK(is_external());
(...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after
20340 // Check if the accessor uses a cached property. 20358 // Check if the accessor uses a cached property.
20341 if (!fti->cached_property_name()->IsTheHole(isolate)) { 20359 if (!fti->cached_property_name()->IsTheHole(isolate)) {
20342 return handle(Name::cast(fti->cached_property_name())); 20360 return handle(Name::cast(fti->cached_property_name()));
20343 } 20361 }
20344 } 20362 }
20345 return MaybeHandle<Name>(); 20363 return MaybeHandle<Name>();
20346 } 20364 }
20347 20365
20348 } // namespace internal 20366 } // namespace internal
20349 } // namespace v8 20367 } // namespace v8
OLDNEW
« src/crankshaft/hydrogen.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698