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

Side by Side Diff: src/compiler/ast-graph-builder.cc

Issue 1238743002: [turbofan] Implement super call support in TurboFan. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@local_turbofan-super-2
Patch Set: Revert "Addressed comments." Created 5 years, 5 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
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/compiler/ast-loop-assignment-analyzer.cc » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/compiler/ast-graph-builder.h" 5 #include "src/compiler/ast-graph-builder.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/compiler/ast-loop-assignment-analyzer.h" 8 #include "src/compiler/ast-loop-assignment-analyzer.h"
9 #include "src/compiler/control-builders.h" 9 #include "src/compiler/control-builders.h"
10 #include "src/compiler/js-type-feedback.h" 10 #include "src/compiler/js-type-feedback.h"
(...skipping 2495 matching lines...) Expand 10 before | Expand all | Expand 10 after
2506 const Operator* op = javascript()->CallRuntime(Runtime::kGetPrototype, 1); 2506 const Operator* op = javascript()->CallRuntime(Runtime::kGetPrototype, 1);
2507 Node* super_function = NewNode(op, this_function); 2507 Node* super_function = NewNode(op, this_function);
2508 // TODO(mstarzinger): This probably needs a proper bailout id. 2508 // TODO(mstarzinger): This probably needs a proper bailout id.
2509 PrepareFrameState(super_function, BailoutId::None()); 2509 PrepareFrameState(super_function, BailoutId::None());
2510 environment()->Push(super_function); 2510 environment()->Push(super_function);
2511 2511
2512 // Evaluate all arguments to the super call. 2512 // Evaluate all arguments to the super call.
2513 ZoneList<Expression*>* args = expr->arguments(); 2513 ZoneList<Expression*>* args = expr->arguments();
2514 VisitForValues(args); 2514 VisitForValues(args);
2515 2515
2516 // Original receiver is loaded from the {new.target} variable. 2516 // Original constructor is loaded from the {new.target} variable.
2517 VisitForValue(super->new_target_var()); 2517 VisitForValue(super->new_target_var());
2518 2518
2519 // Create node to perform the super call. 2519 // Create node to perform the super call.
2520 const Operator* call = javascript()->CallConstruct(args->length() + 2); 2520 const Operator* call = javascript()->CallConstruct(args->length() + 2);
2521 Node* value = ProcessArguments(call, args->length() + 2); 2521 Node* value = ProcessArguments(call, args->length() + 2);
2522 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); 2522 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
2523 2523
2524 // TODO(mstarzinger): It sure would be nice if this were desugared. Also we 2524 // TODO(mstarzinger): It sure would be nice if this were desugared.
2525 // are still missing the hole-check in the assignment below, fix that.
2526 FrameStateBeforeAndAfter states(this, BailoutId::None()); 2525 FrameStateBeforeAndAfter states(this, BailoutId::None());
2527 BuildVariableAssignment(super->this_var()->var(), value, Token::INIT_CONST, 2526 BuildVariableAssignment(super->this_var()->var(), value, Token::INIT_CONST,
2528 VectorSlotPair(), BailoutId::None(), states); 2527 VectorSlotPair(), expr->id(), states);
2529
2530 // TODO(mstarzinger): Remove bailout once lowering is correct.
2531 SetStackOverflow();
2532 2528
2533 ast_context()->ProduceValue(value); 2529 ast_context()->ProduceValue(value);
2534 } 2530 }
2535 2531
2536 2532
2537 void AstGraphBuilder::VisitCallNew(CallNew* expr) { 2533 void AstGraphBuilder::VisitCallNew(CallNew* expr) {
2538 VisitForValue(expr->expression()); 2534 VisitForValue(expr->expression());
2539 2535
2540 // Evaluate all arguments to the construct call. 2536 // Evaluate all arguments to the construct call.
2541 ZoneList<Expression*>* args = expr->arguments(); 2537 ZoneList<Expression*>* args = expr->arguments();
2542 VisitForValues(args); 2538 VisitForValues(args);
2543 2539
2544 // Original receiver is the same as the callee. 2540 // Original constructor is the same as the callee.
2545 environment()->Push(environment()->Peek(args->length())); 2541 environment()->Push(environment()->Peek(args->length()));
2546 2542
2547 // Create node to perform the construct call. 2543 // Create node to perform the construct call.
2548 const Operator* call = javascript()->CallConstruct(args->length() + 2); 2544 const Operator* call = javascript()->CallConstruct(args->length() + 2);
2549 Node* value = ProcessArguments(call, args->length() + 2); 2545 Node* value = ProcessArguments(call, args->length() + 2);
2550 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); 2546 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
2551 ast_context()->ProduceValue(value); 2547 ast_context()->ProduceValue(value);
2552 } 2548 }
2553 2549
2554 2550
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after
3265 3261
3266 Node* AstGraphBuilder::BuildHoleCheckSilent(Node* value, Node* for_hole, 3262 Node* AstGraphBuilder::BuildHoleCheckSilent(Node* value, Node* for_hole,
3267 Node* not_hole) { 3263 Node* not_hole) {
3268 Node* the_hole = jsgraph()->TheHoleConstant(); 3264 Node* the_hole = jsgraph()->TheHoleConstant();
3269 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); 3265 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole);
3270 return NewNode(common()->Select(kMachAnyTagged, BranchHint::kFalse), check, 3266 return NewNode(common()->Select(kMachAnyTagged, BranchHint::kFalse), check,
3271 for_hole, not_hole); 3267 for_hole, not_hole);
3272 } 3268 }
3273 3269
3274 3270
3275 Node* AstGraphBuilder::BuildHoleCheckThrow(Node* value, Variable* variable, 3271 Node* AstGraphBuilder::BuildHoleCheckThenThrow(Node* value, Variable* variable,
3276 Node* not_hole, 3272 Node* not_hole,
3277 BailoutId bailout_id) { 3273 BailoutId bailout_id) {
3278 IfBuilder hole_check(this); 3274 IfBuilder hole_check(this);
3279 Node* the_hole = jsgraph()->TheHoleConstant(); 3275 Node* the_hole = jsgraph()->TheHoleConstant();
3280 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); 3276 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole);
3281 hole_check.If(check); 3277 hole_check.If(check);
3282 hole_check.Then(); 3278 hole_check.Then();
3283 Node* error = BuildThrowReferenceError(variable, bailout_id); 3279 Node* error = BuildThrowReferenceError(variable, bailout_id);
3284 environment()->Push(error); 3280 environment()->Push(error);
3285 hole_check.Else(); 3281 hole_check.Else();
3286 environment()->Push(not_hole); 3282 environment()->Push(not_hole);
3287 hole_check.End(); 3283 hole_check.End();
3288 return environment()->Pop(); 3284 return environment()->Pop();
3289 } 3285 }
3290 3286
3291 3287
3288 Node* AstGraphBuilder::BuildHoleCheckElseThrow(Node* value, Variable* variable,
3289 Node* for_hole,
3290 BailoutId bailout_id) {
3291 IfBuilder hole_check(this);
3292 Node* the_hole = jsgraph()->TheHoleConstant();
3293 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole);
3294 hole_check.If(check);
3295 hole_check.Then();
3296 environment()->Push(for_hole);
3297 hole_check.Else();
3298 Node* error = BuildThrowReferenceError(variable, bailout_id);
3299 environment()->Push(error);
3300 hole_check.End();
3301 return environment()->Pop();
3302 }
3303
3304
3292 Node* AstGraphBuilder::BuildThrowIfStaticPrototype(Node* name, 3305 Node* AstGraphBuilder::BuildThrowIfStaticPrototype(Node* name,
3293 BailoutId bailout_id) { 3306 BailoutId bailout_id) {
3294 IfBuilder prototype_check(this); 3307 IfBuilder prototype_check(this);
3295 Node* prototype_string = 3308 Node* prototype_string =
3296 jsgraph()->Constant(isolate()->factory()->prototype_string()); 3309 jsgraph()->Constant(isolate()->factory()->prototype_string());
3297 Node* check = NewNode(javascript()->StrictEqual(), name, prototype_string); 3310 Node* check = NewNode(javascript()->StrictEqual(), name, prototype_string);
3298 prototype_check.If(check); 3311 prototype_check.If(check);
3299 prototype_check.Then(); 3312 prototype_check.Then();
3300 Node* error = BuildThrowStaticPrototypeError(bailout_id); 3313 Node* error = BuildThrowStaticPrototypeError(bailout_id);
3301 environment()->Push(error); 3314 environment()->Push(error);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3351 value = BuildHoleCheckSilent(value, undefined, value); 3364 value = BuildHoleCheckSilent(value, undefined, value);
3352 } 3365 }
3353 } else if (mode == LET || mode == CONST) { 3366 } else if (mode == LET || mode == CONST) {
3354 // Perform check for uninitialized let/const variables. 3367 // Perform check for uninitialized let/const variables.
3355 // TODO(mstarzinger): For now we cannot use the below optimization for 3368 // TODO(mstarzinger): For now we cannot use the below optimization for
3356 // the {this} parameter, because JSConstructStubForDerived magically 3369 // the {this} parameter, because JSConstructStubForDerived magically
3357 // passes {the_hole} as a receiver. 3370 // passes {the_hole} as a receiver.
3358 if (value->op() == the_hole->op()) { 3371 if (value->op() == the_hole->op()) {
3359 value = BuildThrowReferenceError(variable, bailout_id); 3372 value = BuildThrowReferenceError(variable, bailout_id);
3360 } else if (value->opcode() == IrOpcode::kPhi || variable->is_this()) { 3373 } else if (value->opcode() == IrOpcode::kPhi || variable->is_this()) {
3361 value = BuildHoleCheckThrow(value, variable, value, bailout_id); 3374 value = BuildHoleCheckThenThrow(value, variable, value, bailout_id);
3362 } 3375 }
3363 } 3376 }
3364 return value; 3377 return value;
3365 } 3378 }
3366 case VariableLocation::CONTEXT: { 3379 case VariableLocation::CONTEXT: {
3367 // Context variable (potentially up the context chain). 3380 // Context variable (potentially up the context chain).
3368 int depth = current_scope()->ContextChainLength(variable->scope()); 3381 int depth = current_scope()->ContextChainLength(variable->scope());
3369 bool immutable = variable->maybe_assigned() == kNotAssigned; 3382 bool immutable = variable->maybe_assigned() == kNotAssigned;
3370 const Operator* op = 3383 const Operator* op =
3371 javascript()->LoadContext(depth, variable->index(), immutable); 3384 javascript()->LoadContext(depth, variable->index(), immutable);
3372 Node* value = NewNode(op, current_context()); 3385 Node* value = NewNode(op, current_context());
3373 // TODO(titzer): initialization checks are redundant for already 3386 // TODO(titzer): initialization checks are redundant for already
3374 // initialized immutable context loads, but only specialization knows. 3387 // initialized immutable context loads, but only specialization knows.
3375 // Maybe specializer should be a parameter to the graph builder? 3388 // Maybe specializer should be a parameter to the graph builder?
3376 if (mode == CONST_LEGACY) { 3389 if (mode == CONST_LEGACY) {
3377 // Perform check for uninitialized legacy const variables. 3390 // Perform check for uninitialized legacy const variables.
3378 Node* undefined = jsgraph()->UndefinedConstant(); 3391 Node* undefined = jsgraph()->UndefinedConstant();
3379 value = BuildHoleCheckSilent(value, undefined, value); 3392 value = BuildHoleCheckSilent(value, undefined, value);
3380 } else if (mode == LET || mode == CONST) { 3393 } else if (mode == LET || mode == CONST) {
3381 // Perform check for uninitialized let/const variables. 3394 // Perform check for uninitialized let/const variables.
3382 value = BuildHoleCheckThrow(value, variable, value, bailout_id); 3395 value = BuildHoleCheckThenThrow(value, variable, value, bailout_id);
3383 } 3396 }
3384 return value; 3397 return value;
3385 } 3398 }
3386 case VariableLocation::LOOKUP: { 3399 case VariableLocation::LOOKUP: {
3387 // Dynamic lookup of context variable (anywhere in the chain). 3400 // Dynamic lookup of context variable (anywhere in the chain).
3388 Node* value = jsgraph()->TheHoleConstant(); 3401 Node* value = jsgraph()->TheHoleConstant();
3389 Handle<String> name = variable->name(); 3402 Handle<String> name = variable->name();
3390 if (mode == DYNAMIC_GLOBAL) { 3403 if (mode == DYNAMIC_GLOBAL) {
3391 uint32_t check_bitset = ComputeBitsetForDynamicGlobal(variable); 3404 uint32_t check_bitset = ComputeBitsetForDynamicGlobal(variable);
3392 const Operator* op = javascript()->LoadDynamicGlobal( 3405 const Operator* op = javascript()->LoadDynamicGlobal(
(...skipping 10 matching lines...) Expand all
3403 name, check_bitset, depth, local->index()); 3416 name, check_bitset, depth, local->index());
3404 value = NewNode(op, current_context()); 3417 value = NewNode(op, current_context());
3405 PrepareFrameState(value, bailout_id, combine); 3418 PrepareFrameState(value, bailout_id, combine);
3406 VariableMode local_mode = local->mode(); 3419 VariableMode local_mode = local->mode();
3407 if (local_mode == CONST_LEGACY) { 3420 if (local_mode == CONST_LEGACY) {
3408 // Perform check for uninitialized legacy const variables. 3421 // Perform check for uninitialized legacy const variables.
3409 Node* undefined = jsgraph()->UndefinedConstant(); 3422 Node* undefined = jsgraph()->UndefinedConstant();
3410 value = BuildHoleCheckSilent(value, undefined, value); 3423 value = BuildHoleCheckSilent(value, undefined, value);
3411 } else if (local_mode == LET || local_mode == CONST) { 3424 } else if (local_mode == LET || local_mode == CONST) {
3412 // Perform check for uninitialized let/const variables. 3425 // Perform check for uninitialized let/const variables.
3413 value = BuildHoleCheckThrow(value, local, value, bailout_id); 3426 value = BuildHoleCheckThenThrow(value, local, value, bailout_id);
3414 } 3427 }
3415 } else if (mode == DYNAMIC) { 3428 } else if (mode == DYNAMIC) {
3416 uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired; 3429 uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired;
3417 const Operator* op = javascript()->LoadDynamicGlobal( 3430 const Operator* op = javascript()->LoadDynamicGlobal(
3418 name, check_bitset, feedback, typeof_mode); 3431 name, check_bitset, feedback, typeof_mode);
3419 value = NewNode(op, BuildLoadFeedbackVector(), current_context()); 3432 value = NewNode(op, BuildLoadFeedbackVector(), current_context());
3420 states.AddToNode(value, bailout_id, combine); 3433 states.AddToNode(value, bailout_id, combine);
3421 } 3434 }
3422 return value; 3435 return value;
3423 } 3436 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
3512 return value; 3525 return value;
3513 } else if (mode == LET && op != Token::INIT_LET) { 3526 } else if (mode == LET && op != Token::INIT_LET) {
3514 // Perform an initialization check for let declared variables. 3527 // Perform an initialization check for let declared variables.
3515 // Also note that the dynamic hole-check is only done to ensure that 3528 // Also note that the dynamic hole-check is only done to ensure that
3516 // this does not break in the presence of do-expressions within the 3529 // this does not break in the presence of do-expressions within the
3517 // temporal dead zone of a let declared variable. 3530 // temporal dead zone of a let declared variable.
3518 Node* current = environment()->Lookup(variable); 3531 Node* current = environment()->Lookup(variable);
3519 if (current->op() == the_hole->op()) { 3532 if (current->op() == the_hole->op()) {
3520 value = BuildThrowReferenceError(variable, bailout_id); 3533 value = BuildThrowReferenceError(variable, bailout_id);
3521 } else if (value->opcode() == IrOpcode::kPhi) { 3534 } else if (value->opcode() == IrOpcode::kPhi) {
3522 value = BuildHoleCheckThrow(current, variable, value, bailout_id); 3535 value = BuildHoleCheckThenThrow(current, variable, value, bailout_id);
3536 }
3537 } else if (mode == CONST && op == Token::INIT_CONST) {
3538 // Perform an initialization check for const {this} variables.
3539 // Note that the {this} variable is the only const variable being able
3540 // to trigger bind operations outside the TDZ, via {super} calls.
3541 Node* current = environment()->Lookup(variable);
3542 if (current->op() != the_hole->op() && variable->is_this()) {
3543 value = BuildHoleCheckElseThrow(current, variable, value, bailout_id);
3523 } 3544 }
3524 } else if (mode == CONST && op != Token::INIT_CONST) { 3545 } else if (mode == CONST && op != Token::INIT_CONST) {
3525 // Assignment to const is exception in all modes. 3546 // Assignment to const is exception in all modes.
3526 Node* current = environment()->Lookup(variable); 3547 Node* current = environment()->Lookup(variable);
3527 if (current->op() == the_hole->op()) { 3548 if (current->op() == the_hole->op()) {
3528 return BuildThrowReferenceError(variable, bailout_id); 3549 return BuildThrowReferenceError(variable, bailout_id);
3529 } else if (value->opcode() == IrOpcode::kPhi) { 3550 } else if (value->opcode() == IrOpcode::kPhi) {
3530 BuildHoleCheckThrow(current, variable, value, bailout_id); 3551 BuildHoleCheckThenThrow(current, variable, value, bailout_id);
3531 } 3552 }
3532 return BuildThrowConstAssignError(bailout_id); 3553 return BuildThrowConstAssignError(bailout_id);
3533 } 3554 }
3534 environment()->Bind(variable, value); 3555 environment()->Bind(variable, value);
3535 return value; 3556 return value;
3536 case VariableLocation::CONTEXT: { 3557 case VariableLocation::CONTEXT: {
3537 // Context variable (potentially up the context chain). 3558 // Context variable (potentially up the context chain).
3538 int depth = current_scope()->ContextChainLength(variable->scope()); 3559 int depth = current_scope()->ContextChainLength(variable->scope());
3539 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { 3560 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) {
3540 // Perform an initialization check for legacy const variables. 3561 // Perform an initialization check for legacy const variables.
3541 const Operator* op = 3562 const Operator* op =
3542 javascript()->LoadContext(depth, variable->index(), false); 3563 javascript()->LoadContext(depth, variable->index(), false);
3543 Node* current = NewNode(op, current_context()); 3564 Node* current = NewNode(op, current_context());
3544 value = BuildHoleCheckSilent(current, value, current); 3565 value = BuildHoleCheckSilent(current, value, current);
3545 } else if (mode == CONST_LEGACY && op != Token::INIT_CONST_LEGACY) { 3566 } else if (mode == CONST_LEGACY && op != Token::INIT_CONST_LEGACY) {
3546 // Non-initializing assignment to legacy const is 3567 // Non-initializing assignment to legacy const is
3547 // - exception in strict mode. 3568 // - exception in strict mode.
3548 // - ignored in sloppy mode. 3569 // - ignored in sloppy mode.
3549 if (is_strict(language_mode())) { 3570 if (is_strict(language_mode())) {
3550 return BuildThrowConstAssignError(bailout_id); 3571 return BuildThrowConstAssignError(bailout_id);
3551 } 3572 }
3552 return value; 3573 return value;
3553 } else if (mode == LET && op != Token::INIT_LET) { 3574 } else if (mode == LET && op != Token::INIT_LET) {
3554 // Perform an initialization check for let declared variables. 3575 // Perform an initialization check for let declared variables.
3555 const Operator* op = 3576 const Operator* op =
3556 javascript()->LoadContext(depth, variable->index(), false); 3577 javascript()->LoadContext(depth, variable->index(), false);
3557 Node* current = NewNode(op, current_context()); 3578 Node* current = NewNode(op, current_context());
3558 value = BuildHoleCheckThrow(current, variable, value, bailout_id); 3579 value = BuildHoleCheckThenThrow(current, variable, value, bailout_id);
3580 } else if (mode == CONST && op == Token::INIT_CONST) {
3581 // Perform an initialization check for const {this} variables.
3582 // Note that the {this} variable is the only const variable being able
3583 // to trigger bind operations outside the TDZ, via {super} calls.
3584 if (variable->is_this()) {
3585 const Operator* op =
3586 javascript()->LoadContext(depth, variable->index(), false);
3587 Node* current = NewNode(op, current_context());
3588 value = BuildHoleCheckElseThrow(current, variable, value, bailout_id);
3589 }
3559 } else if (mode == CONST && op != Token::INIT_CONST) { 3590 } else if (mode == CONST && op != Token::INIT_CONST) {
3560 // Assignment to const is exception in all modes. 3591 // Assignment to const is exception in all modes.
3561 const Operator* op = 3592 const Operator* op =
3562 javascript()->LoadContext(depth, variable->index(), false); 3593 javascript()->LoadContext(depth, variable->index(), false);
3563 Node* current = NewNode(op, current_context()); 3594 Node* current = NewNode(op, current_context());
3564 BuildHoleCheckThrow(current, variable, value, bailout_id); 3595 BuildHoleCheckThenThrow(current, variable, value, bailout_id);
3565 return BuildThrowConstAssignError(bailout_id); 3596 return BuildThrowConstAssignError(bailout_id);
3566 } 3597 }
3567 const Operator* op = javascript()->StoreContext(depth, variable->index()); 3598 const Operator* op = javascript()->StoreContext(depth, variable->index());
3568 return NewNode(op, current_context(), value); 3599 return NewNode(op, current_context(), value);
3569 } 3600 }
3570 case VariableLocation::LOOKUP: { 3601 case VariableLocation::LOOKUP: {
3571 // Dynamic lookup of context variable (anywhere in the chain). 3602 // Dynamic lookup of context variable (anywhere in the chain).
3572 Node* name = jsgraph()->Constant(variable->name()); 3603 Node* name = jsgraph()->Constant(variable->name());
3573 Node* language = jsgraph()->Constant(language_mode()); 3604 Node* language = jsgraph()->Constant(language_mode());
3574 // TODO(mstarzinger): Use Runtime::kInitializeLegacyConstLookupSlot for 3605 // TODO(mstarzinger): Use Runtime::kInitializeLegacyConstLookupSlot for
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
4289 // Phi does not exist yet, introduce one. 4320 // Phi does not exist yet, introduce one.
4290 value = NewPhi(inputs, value, control); 4321 value = NewPhi(inputs, value, control);
4291 value->ReplaceInput(inputs - 1, other); 4322 value->ReplaceInput(inputs - 1, other);
4292 } 4323 }
4293 return value; 4324 return value;
4294 } 4325 }
4295 4326
4296 } // namespace compiler 4327 } // namespace compiler
4297 } // namespace internal 4328 } // namespace internal
4298 } // namespace v8 4329 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/compiler/ast-loop-assignment-analyzer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698