OLD | NEW |
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/control-builders.h" | 8 #include "src/compiler/control-builders.h" |
9 #include "src/compiler/machine-operator.h" | 9 #include "src/compiler/machine-operator.h" |
10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 Node* inner = BuildLocalFunctionContext(outer, closure); | 68 Node* inner = BuildLocalFunctionContext(outer, closure); |
69 | 69 |
70 // Push top-level function scope for the function body. | 70 // Push top-level function scope for the function body. |
71 ContextScope top_context(this, scope, inner); | 71 ContextScope top_context(this, scope, inner); |
72 | 72 |
73 // Build the arguments object if it is used. | 73 // Build the arguments object if it is used. |
74 BuildArgumentsObject(scope->arguments()); | 74 BuildArgumentsObject(scope->arguments()); |
75 | 75 |
76 // Emit tracing call if requested to do so. | 76 // Emit tracing call if requested to do so. |
77 if (FLAG_trace) { | 77 if (FLAG_trace) { |
78 NewNode(javascript()->Runtime(Runtime::kTraceEnter, 0)); | 78 NewNode(javascript()->CallRuntime(Runtime::kTraceEnter, 0)); |
79 } | 79 } |
80 | 80 |
81 // Visit implicit declaration of the function name. | 81 // Visit implicit declaration of the function name. |
82 if (scope->is_function_scope() && scope->function() != NULL) { | 82 if (scope->is_function_scope() && scope->function() != NULL) { |
83 VisitVariableDeclaration(scope->function()); | 83 VisitVariableDeclaration(scope->function()); |
84 } | 84 } |
85 | 85 |
86 // Visit declarations within the function scope. | 86 // Visit declarations within the function scope. |
87 VisitDeclarations(scope->declarations()); | 87 VisitDeclarations(scope->declarations()); |
88 | 88 |
89 // TODO(mstarzinger): This should do an inlined stack check. | 89 // TODO(mstarzinger): This should do an inlined stack check. |
90 Node* node = NewNode(javascript()->Runtime(Runtime::kStackGuard, 0)); | 90 Node* node = NewNode(javascript()->CallRuntime(Runtime::kStackGuard, 0)); |
91 PrepareFrameState(node, BailoutId::FunctionEntry()); | 91 PrepareFrameState(node, BailoutId::FunctionEntry()); |
92 | 92 |
93 // Visit statements in the function body. | 93 // Visit statements in the function body. |
94 VisitStatements(info()->function()->body()); | 94 VisitStatements(info()->function()->body()); |
95 if (HasStackOverflow()) return false; | 95 if (HasStackOverflow()) return false; |
96 | 96 |
97 // Emit tracing call if requested to do so. | 97 // Emit tracing call if requested to do so. |
98 if (FLAG_trace) { | 98 if (FLAG_trace) { |
99 // TODO(mstarzinger): Only traces implicit return. | 99 // TODO(mstarzinger): Only traces implicit return. |
100 Node* return_value = jsgraph()->UndefinedConstant(); | 100 Node* return_value = jsgraph()->UndefinedConstant(); |
101 NewNode(javascript()->Runtime(Runtime::kTraceExit, 1), return_value); | 101 NewNode(javascript()->CallRuntime(Runtime::kTraceExit, 1), return_value); |
102 } | 102 } |
103 | 103 |
104 // Return 'undefined' in case we can fall off the end. | 104 // Return 'undefined' in case we can fall off the end. |
105 Node* control = NewNode(common()->Return(), jsgraph()->UndefinedConstant()); | 105 Node* control = NewNode(common()->Return(), jsgraph()->UndefinedConstant()); |
106 UpdateControlDependencyToLeaveFunction(control); | 106 UpdateControlDependencyToLeaveFunction(control); |
107 | 107 |
108 // Finish the basic structure of the graph. | 108 // Finish the basic structure of the graph. |
109 environment()->UpdateControlDependency(exit_control()); | 109 environment()->UpdateControlDependency(exit_control()); |
110 graph()->SetEnd(NewNode(common()->End())); | 110 graph()->SetEnd(NewNode(common()->End())); |
111 | 111 |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 is_null.If(is_null_cond); | 636 is_null.If(is_null_cond); |
637 is_null.Then(); | 637 is_null.Then(); |
638 is_null.Else(); | 638 is_null.Else(); |
639 // Convert object to jsobject. | 639 // Convert object to jsobject. |
640 // PrepareForBailoutForId(stmt->PrepareId(), TOS_REG); | 640 // PrepareForBailoutForId(stmt->PrepareId(), TOS_REG); |
641 obj = NewNode(javascript()->ToObject(), obj); | 641 obj = NewNode(javascript()->ToObject(), obj); |
642 environment()->Push(obj); | 642 environment()->Push(obj); |
643 // TODO(dcarney): should do a fast enum cache check here to skip runtime. | 643 // TODO(dcarney): should do a fast enum cache check here to skip runtime. |
644 environment()->Push(obj); | 644 environment()->Push(obj); |
645 Node* cache_type = ProcessArguments( | 645 Node* cache_type = ProcessArguments( |
646 javascript()->Runtime(Runtime::kGetPropertyNamesFast, 1), 1); | 646 javascript()->CallRuntime(Runtime::kGetPropertyNamesFast, 1), 1); |
647 // TODO(dcarney): these next runtime calls should be removed in favour of | 647 // TODO(dcarney): these next runtime calls should be removed in favour of |
648 // a few simplified instructions. | 648 // a few simplified instructions. |
649 environment()->Push(obj); | 649 environment()->Push(obj); |
650 environment()->Push(cache_type); | 650 environment()->Push(cache_type); |
651 Node* cache_pair = | 651 Node* cache_pair = |
652 ProcessArguments(javascript()->Runtime(Runtime::kForInInit, 2), 2); | 652 ProcessArguments(javascript()->CallRuntime(Runtime::kForInInit, 2), 2); |
653 // cache_type may have been replaced. | 653 // cache_type may have been replaced. |
654 Node* cache_array = NewNode(common()->Projection(0), cache_pair); | 654 Node* cache_array = NewNode(common()->Projection(0), cache_pair); |
655 cache_type = NewNode(common()->Projection(1), cache_pair); | 655 cache_type = NewNode(common()->Projection(1), cache_pair); |
656 environment()->Push(cache_type); | 656 environment()->Push(cache_type); |
657 environment()->Push(cache_array); | 657 environment()->Push(cache_array); |
658 Node* cache_length = ProcessArguments( | 658 Node* cache_length = ProcessArguments( |
659 javascript()->Runtime(Runtime::kForInCacheArrayLength, 2), 2); | 659 javascript()->CallRuntime(Runtime::kForInCacheArrayLength, 2), 2); |
660 { | 660 { |
661 // TODO(dcarney): this check is actually supposed to be for the | 661 // TODO(dcarney): this check is actually supposed to be for the |
662 // empty enum case only. | 662 // empty enum case only. |
663 IfBuilder have_no_properties(this); | 663 IfBuilder have_no_properties(this); |
664 Node* empty_array_cond = NewNode(javascript()->StrictEqual(), | 664 Node* empty_array_cond = NewNode(javascript()->StrictEqual(), |
665 cache_length, jsgraph()->ZeroConstant()); | 665 cache_length, jsgraph()->ZeroConstant()); |
666 have_no_properties.If(empty_array_cond); | 666 have_no_properties.If(empty_array_cond); |
667 have_no_properties.Then(); | 667 have_no_properties.Then(); |
668 // Pop obj and skip loop. | 668 // Pop obj and skip loop. |
669 environment()->Pop(); | 669 environment()->Pop(); |
(...skipping 15 matching lines...) Expand all Loading... |
685 PrepareFrameState(exit_cond, BailoutId::None()); | 685 PrepareFrameState(exit_cond, BailoutId::None()); |
686 for_loop.BreakUnless(exit_cond); | 686 for_loop.BreakUnless(exit_cond); |
687 // TODO(dcarney): this runtime call should be a handful of | 687 // TODO(dcarney): this runtime call should be a handful of |
688 // simplified instructions that | 688 // simplified instructions that |
689 // basically produce | 689 // basically produce |
690 // value = array[index] | 690 // value = array[index] |
691 environment()->Push(obj); | 691 environment()->Push(obj); |
692 environment()->Push(cache_array); | 692 environment()->Push(cache_array); |
693 environment()->Push(cache_type); | 693 environment()->Push(cache_type); |
694 environment()->Push(index); | 694 environment()->Push(index); |
695 Node* pair = | 695 Node* pair = ProcessArguments( |
696 ProcessArguments(javascript()->Runtime(Runtime::kForInNext, 4), 4); | 696 javascript()->CallRuntime(Runtime::kForInNext, 4), 4); |
697 Node* value = NewNode(common()->Projection(0), pair); | 697 Node* value = NewNode(common()->Projection(0), pair); |
698 Node* should_filter = NewNode(common()->Projection(1), pair); | 698 Node* should_filter = NewNode(common()->Projection(1), pair); |
699 environment()->Push(value); | 699 environment()->Push(value); |
700 { | 700 { |
701 // Test if FILTER_KEY needs to be called. | 701 // Test if FILTER_KEY needs to be called. |
702 IfBuilder test_should_filter(this); | 702 IfBuilder test_should_filter(this); |
703 Node* should_filter_cond = | 703 Node* should_filter_cond = |
704 NewNode(javascript()->StrictEqual(), should_filter, | 704 NewNode(javascript()->StrictEqual(), should_filter, |
705 jsgraph()->TrueConstant()); | 705 jsgraph()->TrueConstant()); |
706 test_should_filter.If(should_filter_cond); | 706 test_should_filter.If(should_filter_cond); |
707 test_should_filter.Then(); | 707 test_should_filter.Then(); |
708 value = environment()->Pop(); | 708 value = environment()->Pop(); |
709 Node* builtins = BuildLoadBuiltinsObject(); | 709 Node* builtins = BuildLoadBuiltinsObject(); |
710 Node* function = BuildLoadObjectField( | 710 Node* function = BuildLoadObjectField( |
711 builtins, | 711 builtins, |
712 JSBuiltinsObject::OffsetOfFunctionWithId(Builtins::FILTER_KEY)); | 712 JSBuiltinsObject::OffsetOfFunctionWithId(Builtins::FILTER_KEY)); |
713 // Callee. | 713 // Callee. |
714 environment()->Push(function); | 714 environment()->Push(function); |
715 // Receiver. | 715 // Receiver. |
716 environment()->Push(obj); | 716 environment()->Push(obj); |
717 // Args. | 717 // Args. |
718 environment()->Push(value); | 718 environment()->Push(value); |
719 // result is either the string key or Smi(0) indicating the property | 719 // result is either the string key or Smi(0) indicating the property |
720 // is gone. | 720 // is gone. |
721 Node* res = ProcessArguments( | 721 Node* res = ProcessArguments( |
722 javascript()->Call(3, NO_CALL_FUNCTION_FLAGS), 3); | 722 javascript()->CallFunction(3, NO_CALL_FUNCTION_FLAGS), 3); |
723 // TODO(jarin): provide real bailout id. | 723 // TODO(jarin): provide real bailout id. |
724 PrepareFrameState(res, BailoutId::None()); | 724 PrepareFrameState(res, BailoutId::None()); |
725 Node* property_missing = NewNode(javascript()->StrictEqual(), res, | 725 Node* property_missing = NewNode(javascript()->StrictEqual(), res, |
726 jsgraph()->ZeroConstant()); | 726 jsgraph()->ZeroConstant()); |
727 { | 727 { |
728 IfBuilder is_property_missing(this); | 728 IfBuilder is_property_missing(this); |
729 is_property_missing.If(property_missing); | 729 is_property_missing.If(property_missing); |
730 is_property_missing.Then(); | 730 is_property_missing.Then(); |
731 // Inc counter and continue. | 731 // Inc counter and continue. |
732 Node* index_inc = | 732 Node* index_inc = |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 } | 778 } |
779 | 779 |
780 | 780 |
781 void AstGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) { | 781 void AstGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
782 UNREACHABLE(); | 782 UNREACHABLE(); |
783 } | 783 } |
784 | 784 |
785 | 785 |
786 void AstGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { | 786 void AstGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { |
787 // TODO(turbofan): Do we really need a separate reloc-info for this? | 787 // TODO(turbofan): Do we really need a separate reloc-info for this? |
788 Node* node = NewNode(javascript()->Runtime(Runtime::kDebugBreak, 0)); | 788 Node* node = NewNode(javascript()->CallRuntime(Runtime::kDebugBreak, 0)); |
789 PrepareFrameState(node, stmt->DebugBreakId()); | 789 PrepareFrameState(node, stmt->DebugBreakId()); |
790 } | 790 } |
791 | 791 |
792 | 792 |
793 void AstGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { | 793 void AstGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
794 Node* context = current_context(); | 794 Node* context = current_context(); |
795 | 795 |
796 // Build a new shared function info if we cannot find one in the baseline | 796 // Build a new shared function info if we cannot find one in the baseline |
797 // code. We also have a stack overflow if the recursive compilation did. | 797 // code. We also have a stack overflow if the recursive compilation did. |
798 Handle<SharedFunctionInfo> shared_info = | 798 Handle<SharedFunctionInfo> shared_info = |
799 SearchSharedFunctionInfo(info()->shared_info()->code(), expr); | 799 SearchSharedFunctionInfo(info()->shared_info()->code(), expr); |
800 if (shared_info.is_null()) { | 800 if (shared_info.is_null()) { |
801 shared_info = Compiler::BuildFunctionInfo(expr, info()->script(), info()); | 801 shared_info = Compiler::BuildFunctionInfo(expr, info()->script(), info()); |
802 CHECK(!shared_info.is_null()); // TODO(mstarzinger): Set stack overflow? | 802 CHECK(!shared_info.is_null()); // TODO(mstarzinger): Set stack overflow? |
803 } | 803 } |
804 | 804 |
805 // Create node to instantiate a new closure. | 805 // Create node to instantiate a new closure. |
806 Node* info = jsgraph()->Constant(shared_info); | 806 Node* info = jsgraph()->Constant(shared_info); |
807 Node* pretenure = expr->pretenure() ? jsgraph()->TrueConstant() | 807 Node* pretenure = expr->pretenure() ? jsgraph()->TrueConstant() |
808 : jsgraph()->FalseConstant(); | 808 : jsgraph()->FalseConstant(); |
809 const Operator* op = javascript()->Runtime(Runtime::kNewClosure, 3); | 809 const Operator* op = javascript()->CallRuntime(Runtime::kNewClosure, 3); |
810 Node* value = NewNode(op, context, info, pretenure); | 810 Node* value = NewNode(op, context, info, pretenure); |
811 ast_context()->ProduceValue(value); | 811 ast_context()->ProduceValue(value); |
812 } | 812 } |
813 | 813 |
814 | 814 |
815 void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) { | 815 void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) { |
816 // TODO(arv): Implement. | 816 // TODO(arv): Implement. |
817 UNREACHABLE(); | 817 UNREACHABLE(); |
818 } | 818 } |
819 | 819 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
852 void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { | 852 void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
853 Node* closure = GetFunctionClosure(); | 853 Node* closure = GetFunctionClosure(); |
854 | 854 |
855 // Create node to materialize a regular expression literal. | 855 // Create node to materialize a regular expression literal. |
856 Node* literals_array = | 856 Node* literals_array = |
857 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); | 857 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); |
858 Node* literal_index = jsgraph()->Constant(expr->literal_index()); | 858 Node* literal_index = jsgraph()->Constant(expr->literal_index()); |
859 Node* pattern = jsgraph()->Constant(expr->pattern()); | 859 Node* pattern = jsgraph()->Constant(expr->pattern()); |
860 Node* flags = jsgraph()->Constant(expr->flags()); | 860 Node* flags = jsgraph()->Constant(expr->flags()); |
861 const Operator* op = | 861 const Operator* op = |
862 javascript()->Runtime(Runtime::kMaterializeRegExpLiteral, 4); | 862 javascript()->CallRuntime(Runtime::kMaterializeRegExpLiteral, 4); |
863 Node* literal = NewNode(op, literals_array, literal_index, pattern, flags); | 863 Node* literal = NewNode(op, literals_array, literal_index, pattern, flags); |
864 PrepareFrameState(literal, expr->id(), ast_context()->GetStateCombine()); | 864 PrepareFrameState(literal, expr->id(), ast_context()->GetStateCombine()); |
865 ast_context()->ProduceValue(literal); | 865 ast_context()->ProduceValue(literal); |
866 } | 866 } |
867 | 867 |
868 | 868 |
869 void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { | 869 void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
870 Node* closure = GetFunctionClosure(); | 870 Node* closure = GetFunctionClosure(); |
871 | 871 |
872 // Create node to deep-copy the literal boilerplate. | 872 // Create node to deep-copy the literal boilerplate. |
873 expr->BuildConstantProperties(isolate()); | 873 expr->BuildConstantProperties(isolate()); |
874 Node* literals_array = | 874 Node* literals_array = |
875 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); | 875 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); |
876 Node* literal_index = jsgraph()->Constant(expr->literal_index()); | 876 Node* literal_index = jsgraph()->Constant(expr->literal_index()); |
877 Node* constants = jsgraph()->Constant(expr->constant_properties()); | 877 Node* constants = jsgraph()->Constant(expr->constant_properties()); |
878 Node* flags = jsgraph()->Constant(expr->ComputeFlags()); | 878 Node* flags = jsgraph()->Constant(expr->ComputeFlags()); |
879 const Operator* op = javascript()->Runtime(Runtime::kCreateObjectLiteral, 4); | 879 const Operator* op = |
| 880 javascript()->CallRuntime(Runtime::kCreateObjectLiteral, 4); |
880 Node* literal = NewNode(op, literals_array, literal_index, constants, flags); | 881 Node* literal = NewNode(op, literals_array, literal_index, constants, flags); |
881 | 882 |
882 // The object is expected on the operand stack during computation of the | 883 // The object is expected on the operand stack during computation of the |
883 // property values and is the value of the entire expression. | 884 // property values and is the value of the entire expression. |
884 environment()->Push(literal); | 885 environment()->Push(literal); |
885 | 886 |
886 // Mark all computed expressions that are bound to a key that is shadowed by | 887 // Mark all computed expressions that are bound to a key that is shadowed by |
887 // a later occurrence of the same key. For the marked expressions, no store | 888 // a later occurrence of the same key. For the marked expressions, no store |
888 // code is emitted. | 889 // code is emitted. |
889 expr->CalculateEmitStore(zone()); | 890 expr->CalculateEmitStore(zone()); |
(...skipping 28 matching lines...) Expand all Loading... |
918 break; | 919 break; |
919 } | 920 } |
920 environment()->Push(literal); // Duplicate receiver. | 921 environment()->Push(literal); // Duplicate receiver. |
921 VisitForValue(property->key()); | 922 VisitForValue(property->key()); |
922 VisitForValue(property->value()); | 923 VisitForValue(property->value()); |
923 Node* value = environment()->Pop(); | 924 Node* value = environment()->Pop(); |
924 Node* key = environment()->Pop(); | 925 Node* key = environment()->Pop(); |
925 Node* receiver = environment()->Pop(); | 926 Node* receiver = environment()->Pop(); |
926 if (property->emit_store()) { | 927 if (property->emit_store()) { |
927 Node* strict = jsgraph()->Constant(SLOPPY); | 928 Node* strict = jsgraph()->Constant(SLOPPY); |
928 const Operator* op = javascript()->Runtime(Runtime::kSetProperty, 4); | 929 const Operator* op = |
| 930 javascript()->CallRuntime(Runtime::kSetProperty, 4); |
929 NewNode(op, receiver, key, value, strict); | 931 NewNode(op, receiver, key, value, strict); |
930 } | 932 } |
931 break; | 933 break; |
932 } | 934 } |
933 case ObjectLiteral::Property::PROTOTYPE: { | 935 case ObjectLiteral::Property::PROTOTYPE: { |
934 environment()->Push(literal); // Duplicate receiver. | 936 environment()->Push(literal); // Duplicate receiver. |
935 VisitForValue(property->value()); | 937 VisitForValue(property->value()); |
936 Node* value = environment()->Pop(); | 938 Node* value = environment()->Pop(); |
937 Node* receiver = environment()->Pop(); | 939 Node* receiver = environment()->Pop(); |
938 if (property->emit_store()) { | 940 if (property->emit_store()) { |
939 const Operator* op = javascript()->Runtime(Runtime::kSetPrototype, 2); | 941 const Operator* op = |
| 942 javascript()->CallRuntime(Runtime::kSetPrototype, 2); |
940 NewNode(op, receiver, value); | 943 NewNode(op, receiver, value); |
941 } | 944 } |
942 break; | 945 break; |
943 } | 946 } |
944 case ObjectLiteral::Property::GETTER: | 947 case ObjectLiteral::Property::GETTER: |
945 accessor_table.lookup(key)->second->getter = property->value(); | 948 accessor_table.lookup(key)->second->getter = property->value(); |
946 break; | 949 break; |
947 case ObjectLiteral::Property::SETTER: | 950 case ObjectLiteral::Property::SETTER: |
948 accessor_table.lookup(key)->second->setter = property->value(); | 951 accessor_table.lookup(key)->second->setter = property->value(); |
949 break; | 952 break; |
950 } | 953 } |
951 } | 954 } |
952 | 955 |
953 // Create nodes to define accessors, using only a single call to the runtime | 956 // Create nodes to define accessors, using only a single call to the runtime |
954 // for each pair of corresponding getters and setters. | 957 // for each pair of corresponding getters and setters. |
955 for (AccessorTable::Iterator it = accessor_table.begin(); | 958 for (AccessorTable::Iterator it = accessor_table.begin(); |
956 it != accessor_table.end(); ++it) { | 959 it != accessor_table.end(); ++it) { |
957 VisitForValue(it->first); | 960 VisitForValue(it->first); |
958 VisitForValueOrNull(it->second->getter); | 961 VisitForValueOrNull(it->second->getter); |
959 VisitForValueOrNull(it->second->setter); | 962 VisitForValueOrNull(it->second->setter); |
960 Node* setter = environment()->Pop(); | 963 Node* setter = environment()->Pop(); |
961 Node* getter = environment()->Pop(); | 964 Node* getter = environment()->Pop(); |
962 Node* name = environment()->Pop(); | 965 Node* name = environment()->Pop(); |
963 Node* attr = jsgraph()->Constant(NONE); | 966 Node* attr = jsgraph()->Constant(NONE); |
964 const Operator* op = | 967 const Operator* op = |
965 javascript()->Runtime(Runtime::kDefineAccessorPropertyUnchecked, 5); | 968 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
966 Node* call = NewNode(op, literal, name, getter, setter, attr); | 969 Node* call = NewNode(op, literal, name, getter, setter, attr); |
967 PrepareFrameState(call, it->first->id()); | 970 PrepareFrameState(call, it->first->id()); |
968 } | 971 } |
969 | 972 |
970 // Transform literals that contain functions to fast properties. | 973 // Transform literals that contain functions to fast properties. |
971 if (expr->has_function()) { | 974 if (expr->has_function()) { |
972 const Operator* op = javascript()->Runtime(Runtime::kToFastProperties, 1); | 975 const Operator* op = |
| 976 javascript()->CallRuntime(Runtime::kToFastProperties, 1); |
973 NewNode(op, literal); | 977 NewNode(op, literal); |
974 } | 978 } |
975 | 979 |
976 ast_context()->ProduceValue(environment()->Pop()); | 980 ast_context()->ProduceValue(environment()->Pop()); |
977 } | 981 } |
978 | 982 |
979 | 983 |
980 void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { | 984 void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
981 Node* closure = GetFunctionClosure(); | 985 Node* closure = GetFunctionClosure(); |
982 | 986 |
983 // Create node to deep-copy the literal boilerplate. | 987 // Create node to deep-copy the literal boilerplate. |
984 expr->BuildConstantElements(isolate()); | 988 expr->BuildConstantElements(isolate()); |
985 Node* literals_array = | 989 Node* literals_array = |
986 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); | 990 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); |
987 Node* literal_index = jsgraph()->Constant(expr->literal_index()); | 991 Node* literal_index = jsgraph()->Constant(expr->literal_index()); |
988 Node* constants = jsgraph()->Constant(expr->constant_elements()); | 992 Node* constants = jsgraph()->Constant(expr->constant_elements()); |
989 Node* flags = jsgraph()->Constant(expr->ComputeFlags()); | 993 Node* flags = jsgraph()->Constant(expr->ComputeFlags()); |
990 const Operator* op = javascript()->Runtime(Runtime::kCreateArrayLiteral, 4); | 994 const Operator* op = |
| 995 javascript()->CallRuntime(Runtime::kCreateArrayLiteral, 4); |
991 Node* literal = NewNode(op, literals_array, literal_index, constants, flags); | 996 Node* literal = NewNode(op, literals_array, literal_index, constants, flags); |
992 | 997 |
993 // The array and the literal index are both expected on the operand stack | 998 // The array and the literal index are both expected on the operand stack |
994 // during computation of the element values. | 999 // during computation of the element values. |
995 environment()->Push(literal); | 1000 environment()->Push(literal); |
996 environment()->Push(literal_index); | 1001 environment()->Push(literal_index); |
997 | 1002 |
998 // Create nodes to evaluate all the non-constant subexpressions and to store | 1003 // Create nodes to evaluate all the non-constant subexpressions and to store |
999 // them into the newly cloned array. | 1004 // them into the newly cloned array. |
1000 for (int i = 0; i < expr->values()->length(); i++) { | 1005 for (int i = 0; i < expr->values()->length(); i++) { |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 environment()->Pop(); | 1164 environment()->Pop(); |
1160 environment()->Pop(); | 1165 environment()->Pop(); |
1161 // TODO(turbofan): VisitYield | 1166 // TODO(turbofan): VisitYield |
1162 ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); | 1167 ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
1163 } | 1168 } |
1164 | 1169 |
1165 | 1170 |
1166 void AstGraphBuilder::VisitThrow(Throw* expr) { | 1171 void AstGraphBuilder::VisitThrow(Throw* expr) { |
1167 VisitForValue(expr->exception()); | 1172 VisitForValue(expr->exception()); |
1168 Node* exception = environment()->Pop(); | 1173 Node* exception = environment()->Pop(); |
1169 const Operator* op = javascript()->Runtime(Runtime::kThrow, 1); | 1174 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); |
1170 Node* value = NewNode(op, exception); | 1175 Node* value = NewNode(op, exception); |
1171 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 1176 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
1172 ast_context()->ProduceValue(value); | 1177 ast_context()->ProduceValue(value); |
1173 } | 1178 } |
1174 | 1179 |
1175 | 1180 |
1176 void AstGraphBuilder::VisitProperty(Property* expr) { | 1181 void AstGraphBuilder::VisitProperty(Property* expr) { |
1177 Node* value; | 1182 Node* value; |
1178 if (expr->key()->IsPropertyName()) { | 1183 if (expr->key()->IsPropertyName()) { |
1179 VisitForValue(expr->obj()); | 1184 VisitForValue(expr->obj()); |
(...skipping 26 matching lines...) Expand all Loading... |
1206 case Call::GLOBAL_CALL: { | 1211 case Call::GLOBAL_CALL: { |
1207 Variable* variable = callee->AsVariableProxy()->var(); | 1212 Variable* variable = callee->AsVariableProxy()->var(); |
1208 callee_value = BuildVariableLoad(variable, expr->expression()->id()); | 1213 callee_value = BuildVariableLoad(variable, expr->expression()->id()); |
1209 receiver_value = jsgraph()->UndefinedConstant(); | 1214 receiver_value = jsgraph()->UndefinedConstant(); |
1210 break; | 1215 break; |
1211 } | 1216 } |
1212 case Call::LOOKUP_SLOT_CALL: { | 1217 case Call::LOOKUP_SLOT_CALL: { |
1213 Variable* variable = callee->AsVariableProxy()->var(); | 1218 Variable* variable = callee->AsVariableProxy()->var(); |
1214 DCHECK(variable->location() == Variable::LOOKUP); | 1219 DCHECK(variable->location() == Variable::LOOKUP); |
1215 Node* name = jsgraph()->Constant(variable->name()); | 1220 Node* name = jsgraph()->Constant(variable->name()); |
1216 const Operator* op = javascript()->Runtime(Runtime::kLoadLookupSlot, 2); | 1221 const Operator* op = |
| 1222 javascript()->CallRuntime(Runtime::kLoadLookupSlot, 2); |
1217 Node* pair = NewNode(op, current_context(), name); | 1223 Node* pair = NewNode(op, current_context(), name); |
1218 callee_value = NewNode(common()->Projection(0), pair); | 1224 callee_value = NewNode(common()->Projection(0), pair); |
1219 receiver_value = NewNode(common()->Projection(1), pair); | 1225 receiver_value = NewNode(common()->Projection(1), pair); |
1220 | 1226 |
1221 PrepareFrameState(pair, expr->EvalOrLookupId(), | 1227 PrepareFrameState(pair, expr->EvalOrLookupId(), |
1222 OutputFrameStateCombine::Push()); | 1228 OutputFrameStateCombine::Push()); |
1223 break; | 1229 break; |
1224 } | 1230 } |
1225 case Call::PROPERTY_CALL: { | 1231 case Call::PROPERTY_CALL: { |
1226 Property* property = callee->AsProperty(); | 1232 Property* property = callee->AsProperty(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1271 // Extract callee and source string from the environment. | 1277 // Extract callee and source string from the environment. |
1272 Node* callee = environment()->Peek(arg_count + 1); | 1278 Node* callee = environment()->Peek(arg_count + 1); |
1273 Node* source = environment()->Peek(arg_count - 1); | 1279 Node* source = environment()->Peek(arg_count - 1); |
1274 | 1280 |
1275 // Create node to ask for help resolving potential eval call. This will | 1281 // Create node to ask for help resolving potential eval call. This will |
1276 // provide a fully resolved callee and the corresponding receiver. | 1282 // provide a fully resolved callee and the corresponding receiver. |
1277 Node* receiver = environment()->Lookup(info()->scope()->receiver()); | 1283 Node* receiver = environment()->Lookup(info()->scope()->receiver()); |
1278 Node* strict = jsgraph()->Constant(strict_mode()); | 1284 Node* strict = jsgraph()->Constant(strict_mode()); |
1279 Node* position = jsgraph()->Constant(info()->scope()->start_position()); | 1285 Node* position = jsgraph()->Constant(info()->scope()->start_position()); |
1280 const Operator* op = | 1286 const Operator* op = |
1281 javascript()->Runtime(Runtime::kResolvePossiblyDirectEval, 5); | 1287 javascript()->CallRuntime(Runtime::kResolvePossiblyDirectEval, 5); |
1282 Node* pair = NewNode(op, callee, source, receiver, strict, position); | 1288 Node* pair = NewNode(op, callee, source, receiver, strict, position); |
1283 PrepareFrameState(pair, expr->EvalOrLookupId(), | 1289 PrepareFrameState(pair, expr->EvalOrLookupId(), |
1284 OutputFrameStateCombine::PokeAt(arg_count + 1)); | 1290 OutputFrameStateCombine::PokeAt(arg_count + 1)); |
1285 Node* new_callee = NewNode(common()->Projection(0), pair); | 1291 Node* new_callee = NewNode(common()->Projection(0), pair); |
1286 Node* new_receiver = NewNode(common()->Projection(1), pair); | 1292 Node* new_receiver = NewNode(common()->Projection(1), pair); |
1287 | 1293 |
1288 // Patch callee and receiver on the environment. | 1294 // Patch callee and receiver on the environment. |
1289 environment()->Poke(arg_count + 1, new_callee); | 1295 environment()->Poke(arg_count + 1, new_callee); |
1290 environment()->Poke(arg_count + 0, new_receiver); | 1296 environment()->Poke(arg_count + 0, new_receiver); |
1291 } | 1297 } |
1292 | 1298 |
1293 // Create node to perform the function call. | 1299 // Create node to perform the function call. |
1294 const Operator* call = javascript()->Call(args->length() + 2, flags); | 1300 const Operator* call = javascript()->CallFunction(args->length() + 2, flags); |
1295 Node* value = ProcessArguments(call, args->length() + 2); | 1301 Node* value = ProcessArguments(call, args->length() + 2); |
1296 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 1302 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
1297 ast_context()->ProduceValue(value); | 1303 ast_context()->ProduceValue(value); |
1298 } | 1304 } |
1299 | 1305 |
1300 | 1306 |
1301 void AstGraphBuilder::VisitCallNew(CallNew* expr) { | 1307 void AstGraphBuilder::VisitCallNew(CallNew* expr) { |
1302 VisitForValue(expr->expression()); | 1308 VisitForValue(expr->expression()); |
1303 | 1309 |
1304 // Evaluate all arguments to the construct call. | 1310 // Evaluate all arguments to the construct call. |
1305 ZoneList<Expression*>* args = expr->arguments(); | 1311 ZoneList<Expression*>* args = expr->arguments(); |
1306 VisitForValues(args); | 1312 VisitForValues(args); |
1307 | 1313 |
1308 // Create node to perform the construct call. | 1314 // Create node to perform the construct call. |
1309 const Operator* call = javascript()->CallNew(args->length() + 1); | 1315 const Operator* call = javascript()->CallConstruct(args->length() + 1); |
1310 Node* value = ProcessArguments(call, args->length() + 1); | 1316 Node* value = ProcessArguments(call, args->length() + 1); |
1311 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 1317 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
1312 ast_context()->ProduceValue(value); | 1318 ast_context()->ProduceValue(value); |
1313 } | 1319 } |
1314 | 1320 |
1315 | 1321 |
1316 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { | 1322 void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { |
1317 Handle<String> name = expr->name(); | 1323 Handle<String> name = expr->name(); |
1318 | 1324 |
1319 // The callee and the receiver both have to be pushed onto the operand stack | 1325 // The callee and the receiver both have to be pushed onto the operand stack |
1320 // before arguments are being evaluated. | 1326 // before arguments are being evaluated. |
1321 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; | 1327 CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; |
1322 Node* receiver_value = BuildLoadBuiltinsObject(); | 1328 Node* receiver_value = BuildLoadBuiltinsObject(); |
1323 Unique<String> unique = MakeUnique(name); | 1329 Unique<String> unique = MakeUnique(name); |
1324 Node* callee_value = NewNode(javascript()->LoadNamed(unique), receiver_value); | 1330 Node* callee_value = NewNode(javascript()->LoadNamed(unique), receiver_value); |
1325 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft | 1331 // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft |
1326 // refuses to optimize functions with jsruntime calls). | 1332 // refuses to optimize functions with jsruntime calls). |
1327 PrepareFrameState(callee_value, BailoutId::None(), | 1333 PrepareFrameState(callee_value, BailoutId::None(), |
1328 OutputFrameStateCombine::Push()); | 1334 OutputFrameStateCombine::Push()); |
1329 environment()->Push(callee_value); | 1335 environment()->Push(callee_value); |
1330 environment()->Push(receiver_value); | 1336 environment()->Push(receiver_value); |
1331 | 1337 |
1332 // Evaluate all arguments to the JS runtime call. | 1338 // Evaluate all arguments to the JS runtime call. |
1333 ZoneList<Expression*>* args = expr->arguments(); | 1339 ZoneList<Expression*>* args = expr->arguments(); |
1334 VisitForValues(args); | 1340 VisitForValues(args); |
1335 | 1341 |
1336 // Create node to perform the JS runtime call. | 1342 // Create node to perform the JS runtime call. |
1337 const Operator* call = javascript()->Call(args->length() + 2, flags); | 1343 const Operator* call = javascript()->CallFunction(args->length() + 2, flags); |
1338 Node* value = ProcessArguments(call, args->length() + 2); | 1344 Node* value = ProcessArguments(call, args->length() + 2); |
1339 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 1345 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
1340 ast_context()->ProduceValue(value); | 1346 ast_context()->ProduceValue(value); |
1341 } | 1347 } |
1342 | 1348 |
1343 | 1349 |
1344 void AstGraphBuilder::VisitCallRuntime(CallRuntime* expr) { | 1350 void AstGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
1345 const Runtime::Function* function = expr->function(); | 1351 const Runtime::Function* function = expr->function(); |
1346 | 1352 |
1347 // Handle calls to runtime functions implemented in JavaScript separately as | 1353 // Handle calls to runtime functions implemented in JavaScript separately as |
1348 // the call follows JavaScript ABI and the callee is statically unknown. | 1354 // the call follows JavaScript ABI and the callee is statically unknown. |
1349 if (expr->is_jsruntime()) { | 1355 if (expr->is_jsruntime()) { |
1350 DCHECK(function == NULL && expr->name()->length() > 0); | 1356 DCHECK(function == NULL && expr->name()->length() > 0); |
1351 return VisitCallJSRuntime(expr); | 1357 return VisitCallJSRuntime(expr); |
1352 } | 1358 } |
1353 | 1359 |
1354 // Evaluate all arguments to the runtime call. | 1360 // Evaluate all arguments to the runtime call. |
1355 ZoneList<Expression*>* args = expr->arguments(); | 1361 ZoneList<Expression*>* args = expr->arguments(); |
1356 VisitForValues(args); | 1362 VisitForValues(args); |
1357 | 1363 |
1358 // Create node to perform the runtime call. | 1364 // Create node to perform the runtime call. |
1359 Runtime::FunctionId functionId = function->function_id; | 1365 Runtime::FunctionId functionId = function->function_id; |
1360 const Operator* call = javascript()->Runtime(functionId, args->length()); | 1366 const Operator* call = javascript()->CallRuntime(functionId, args->length()); |
1361 Node* value = ProcessArguments(call, args->length()); | 1367 Node* value = ProcessArguments(call, args->length()); |
1362 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | 1368 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
1363 ast_context()->ProduceValue(value); | 1369 ast_context()->ProduceValue(value); |
1364 } | 1370 } |
1365 | 1371 |
1366 | 1372 |
1367 void AstGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { | 1373 void AstGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
1368 switch (expr->op()) { | 1374 switch (expr->op()) { |
1369 case Token::DELETE: | 1375 case Token::DELETE: |
1370 return VisitDelete(expr); | 1376 return VisitDelete(expr); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 AstVisitor::VisitDeclarations(declarations); | 1570 AstVisitor::VisitDeclarations(declarations); |
1565 if (globals()->is_empty()) return; | 1571 if (globals()->is_empty()) return; |
1566 Handle<FixedArray> data = | 1572 Handle<FixedArray> data = |
1567 isolate()->factory()->NewFixedArray(globals()->length(), TENURED); | 1573 isolate()->factory()->NewFixedArray(globals()->length(), TENURED); |
1568 for (int i = 0; i < globals()->length(); ++i) data->set(i, *globals()->at(i)); | 1574 for (int i = 0; i < globals()->length(); ++i) data->set(i, *globals()->at(i)); |
1569 int encoded_flags = DeclareGlobalsEvalFlag::encode(info()->is_eval()) | | 1575 int encoded_flags = DeclareGlobalsEvalFlag::encode(info()->is_eval()) | |
1570 DeclareGlobalsNativeFlag::encode(info()->is_native()) | | 1576 DeclareGlobalsNativeFlag::encode(info()->is_native()) | |
1571 DeclareGlobalsStrictMode::encode(strict_mode()); | 1577 DeclareGlobalsStrictMode::encode(strict_mode()); |
1572 Node* flags = jsgraph()->Constant(encoded_flags); | 1578 Node* flags = jsgraph()->Constant(encoded_flags); |
1573 Node* pairs = jsgraph()->Constant(data); | 1579 Node* pairs = jsgraph()->Constant(data); |
1574 const Operator* op = javascript()->Runtime(Runtime::kDeclareGlobals, 3); | 1580 const Operator* op = javascript()->CallRuntime(Runtime::kDeclareGlobals, 3); |
1575 NewNode(op, current_context(), pairs, flags); | 1581 NewNode(op, current_context(), pairs, flags); |
1576 globals()->Rewind(0); | 1582 globals()->Rewind(0); |
1577 } | 1583 } |
1578 | 1584 |
1579 | 1585 |
1580 void AstGraphBuilder::VisitIfNotNull(Statement* stmt) { | 1586 void AstGraphBuilder::VisitIfNotNull(Statement* stmt) { |
1581 if (stmt == NULL) return; | 1587 if (stmt == NULL) return; |
1582 Visit(stmt); | 1588 Visit(stmt); |
1583 } | 1589 } |
1584 | 1590 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1673 environment()->Pop(); | 1679 environment()->Pop(); |
1674 Visit(expr->right()); | 1680 Visit(expr->right()); |
1675 } else if (ast_context()->IsEffect()) { | 1681 } else if (ast_context()->IsEffect()) { |
1676 environment()->Pop(); | 1682 environment()->Pop(); |
1677 } | 1683 } |
1678 compare_if.End(); | 1684 compare_if.End(); |
1679 ast_context()->ReplaceValue(); | 1685 ast_context()->ReplaceValue(); |
1680 } | 1686 } |
1681 | 1687 |
1682 | 1688 |
| 1689 StrictMode AstGraphBuilder::strict_mode() const { |
| 1690 return info()->strict_mode(); |
| 1691 } |
| 1692 |
| 1693 |
1683 Node* AstGraphBuilder::ProcessArguments(const Operator* op, int arity) { | 1694 Node* AstGraphBuilder::ProcessArguments(const Operator* op, int arity) { |
1684 DCHECK(environment()->stack_height() >= arity); | 1695 DCHECK(environment()->stack_height() >= arity); |
1685 Node** all = info()->zone()->NewArray<Node*>(arity); | 1696 Node** all = info()->zone()->NewArray<Node*>(arity); |
1686 for (int i = arity - 1; i >= 0; --i) { | 1697 for (int i = arity - 1; i >= 0; --i) { |
1687 all[i] = environment()->Pop(); | 1698 all[i] = environment()->Pop(); |
1688 } | 1699 } |
1689 Node* value = NewNode(op, arity, all); | 1700 Node* value = NewNode(op, arity, all); |
1690 return value; | 1701 return value; |
1691 } | 1702 } |
1692 | 1703 |
(...skipping 24 matching lines...) Expand all Loading... |
1717 | 1728 |
1718 return local_context; | 1729 return local_context; |
1719 } | 1730 } |
1720 | 1731 |
1721 | 1732 |
1722 Node* AstGraphBuilder::BuildArgumentsObject(Variable* arguments) { | 1733 Node* AstGraphBuilder::BuildArgumentsObject(Variable* arguments) { |
1723 if (arguments == NULL) return NULL; | 1734 if (arguments == NULL) return NULL; |
1724 | 1735 |
1725 // Allocate and initialize a new arguments object. | 1736 // Allocate and initialize a new arguments object. |
1726 Node* callee = GetFunctionClosure(); | 1737 Node* callee = GetFunctionClosure(); |
1727 const Operator* op = javascript()->Runtime(Runtime::kNewArguments, 1); | 1738 const Operator* op = javascript()->CallRuntime(Runtime::kNewArguments, 1); |
1728 Node* object = NewNode(op, callee); | 1739 Node* object = NewNode(op, callee); |
1729 | 1740 |
1730 // Assign the object to the arguments variable. | 1741 // Assign the object to the arguments variable. |
1731 DCHECK(arguments->IsContextSlot() || arguments->IsStackAllocated()); | 1742 DCHECK(arguments->IsContextSlot() || arguments->IsStackAllocated()); |
1732 // This should never lazy deopt, so it is fine to send invalid bailout id. | 1743 // This should never lazy deopt, so it is fine to send invalid bailout id. |
1733 BuildVariableAssignment(arguments, object, Token::ASSIGN, BailoutId::None()); | 1744 BuildVariableAssignment(arguments, object, Token::ASSIGN, BailoutId::None()); |
1734 | 1745 |
1735 return object; | 1746 return object; |
1736 } | 1747 } |
1737 | 1748 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 } | 1835 } |
1825 return value; | 1836 return value; |
1826 } | 1837 } |
1827 case Variable::LOOKUP: { | 1838 case Variable::LOOKUP: { |
1828 // Dynamic lookup of context variable (anywhere in the chain). | 1839 // Dynamic lookup of context variable (anywhere in the chain). |
1829 Node* name = jsgraph()->Constant(variable->name()); | 1840 Node* name = jsgraph()->Constant(variable->name()); |
1830 Runtime::FunctionId function_id = | 1841 Runtime::FunctionId function_id = |
1831 (contextual_mode == CONTEXTUAL) | 1842 (contextual_mode == CONTEXTUAL) |
1832 ? Runtime::kLoadLookupSlot | 1843 ? Runtime::kLoadLookupSlot |
1833 : Runtime::kLoadLookupSlotNoReferenceError; | 1844 : Runtime::kLoadLookupSlotNoReferenceError; |
1834 const Operator* op = javascript()->Runtime(function_id, 2); | 1845 const Operator* op = javascript()->CallRuntime(function_id, 2); |
1835 Node* pair = NewNode(op, current_context(), name); | 1846 Node* pair = NewNode(op, current_context(), name); |
1836 PrepareFrameState(pair, bailout_id, OutputFrameStateCombine::Push(1)); | 1847 PrepareFrameState(pair, bailout_id, OutputFrameStateCombine::Push(1)); |
1837 return NewNode(common()->Projection(0), pair); | 1848 return NewNode(common()->Projection(0), pair); |
1838 } | 1849 } |
1839 } | 1850 } |
1840 UNREACHABLE(); | 1851 UNREACHABLE(); |
1841 return NULL; | 1852 return NULL; |
1842 } | 1853 } |
1843 | 1854 |
1844 | 1855 |
(...skipping 12 matching lines...) Expand all Loading... |
1857 } | 1868 } |
1858 case Variable::PARAMETER: | 1869 case Variable::PARAMETER: |
1859 case Variable::LOCAL: | 1870 case Variable::LOCAL: |
1860 case Variable::CONTEXT: | 1871 case Variable::CONTEXT: |
1861 // Local var, const, or let variable or context variable. | 1872 // Local var, const, or let variable or context variable. |
1862 return variable->is_this() ? jsgraph()->TrueConstant() | 1873 return variable->is_this() ? jsgraph()->TrueConstant() |
1863 : jsgraph()->FalseConstant(); | 1874 : jsgraph()->FalseConstant(); |
1864 case Variable::LOOKUP: { | 1875 case Variable::LOOKUP: { |
1865 // Dynamic lookup of context variable (anywhere in the chain). | 1876 // Dynamic lookup of context variable (anywhere in the chain). |
1866 Node* name = jsgraph()->Constant(variable->name()); | 1877 Node* name = jsgraph()->Constant(variable->name()); |
1867 const Operator* op = javascript()->Runtime(Runtime::kDeleteLookupSlot, 2); | 1878 const Operator* op = |
| 1879 javascript()->CallRuntime(Runtime::kDeleteLookupSlot, 2); |
1868 Node* result = NewNode(op, current_context(), name); | 1880 Node* result = NewNode(op, current_context(), name); |
1869 PrepareFrameState(result, bailout_id, state_combine); | 1881 PrepareFrameState(result, bailout_id, state_combine); |
1870 return result; | 1882 return result; |
1871 } | 1883 } |
1872 } | 1884 } |
1873 UNREACHABLE(); | 1885 UNREACHABLE(); |
1874 return NULL; | 1886 return NULL; |
1875 } | 1887 } |
1876 | 1888 |
1877 | 1889 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1943 } | 1955 } |
1944 const Operator* op = javascript()->StoreContext(depth, variable->index()); | 1956 const Operator* op = javascript()->StoreContext(depth, variable->index()); |
1945 return NewNode(op, current_context(), value); | 1957 return NewNode(op, current_context(), value); |
1946 } | 1958 } |
1947 case Variable::LOOKUP: { | 1959 case Variable::LOOKUP: { |
1948 // Dynamic lookup of context variable (anywhere in the chain). | 1960 // Dynamic lookup of context variable (anywhere in the chain). |
1949 Node* name = jsgraph()->Constant(variable->name()); | 1961 Node* name = jsgraph()->Constant(variable->name()); |
1950 Node* strict = jsgraph()->Constant(strict_mode()); | 1962 Node* strict = jsgraph()->Constant(strict_mode()); |
1951 // TODO(mstarzinger): Use Runtime::kInitializeLegacyConstLookupSlot for | 1963 // TODO(mstarzinger): Use Runtime::kInitializeLegacyConstLookupSlot for |
1952 // initializations of const declarations. | 1964 // initializations of const declarations. |
1953 const Operator* op = javascript()->Runtime(Runtime::kStoreLookupSlot, 4); | 1965 const Operator* op = |
| 1966 javascript()->CallRuntime(Runtime::kStoreLookupSlot, 4); |
1954 Node* store = NewNode(op, value, current_context(), name, strict); | 1967 Node* store = NewNode(op, value, current_context(), name, strict); |
1955 PrepareFrameState(store, bailout_id); | 1968 PrepareFrameState(store, bailout_id); |
1956 return store; | 1969 return store; |
1957 } | 1970 } |
1958 } | 1971 } |
1959 UNREACHABLE(); | 1972 UNREACHABLE(); |
1960 return NULL; | 1973 return NULL; |
1961 } | 1974 } |
1962 | 1975 |
1963 | 1976 |
(...skipping 24 matching lines...) Expand all Loading... |
1988 Node* AstGraphBuilder::BuildToBoolean(Node* value) { | 2001 Node* AstGraphBuilder::BuildToBoolean(Node* value) { |
1989 // TODO(mstarzinger): Possible optimization is to NOP for boolean values. | 2002 // TODO(mstarzinger): Possible optimization is to NOP for boolean values. |
1990 return NewNode(javascript()->ToBoolean(), value); | 2003 return NewNode(javascript()->ToBoolean(), value); |
1991 } | 2004 } |
1992 | 2005 |
1993 | 2006 |
1994 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, | 2007 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, |
1995 BailoutId bailout_id) { | 2008 BailoutId bailout_id) { |
1996 // TODO(mstarzinger): Should be unified with the VisitThrow implementation. | 2009 // TODO(mstarzinger): Should be unified with the VisitThrow implementation. |
1997 Node* variable_name = jsgraph()->Constant(variable->name()); | 2010 Node* variable_name = jsgraph()->Constant(variable->name()); |
1998 const Operator* op = javascript()->Runtime(Runtime::kThrowReferenceError, 1); | 2011 const Operator* op = |
| 2012 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1); |
1999 Node* call = NewNode(op, variable_name); | 2013 Node* call = NewNode(op, variable_name); |
2000 PrepareFrameState(call, bailout_id); | 2014 PrepareFrameState(call, bailout_id); |
2001 return call; | 2015 return call; |
2002 } | 2016 } |
2003 | 2017 |
2004 | 2018 |
2005 Node* AstGraphBuilder::BuildBinaryOp(Node* left, Node* right, Token::Value op) { | 2019 Node* AstGraphBuilder::BuildBinaryOp(Node* left, Node* right, Token::Value op) { |
2006 const Operator* js_op; | 2020 const Operator* js_op; |
2007 switch (op) { | 2021 switch (op) { |
2008 case Token::BIT_OR: | 2022 case Token::BIT_OR: |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == | 2066 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == |
2053 IrOpcode::kDead); | 2067 IrOpcode::kDead); |
2054 NodeProperties::ReplaceFrameStateInput( | 2068 NodeProperties::ReplaceFrameStateInput( |
2055 node, environment()->Checkpoint(ast_id, combine)); | 2069 node, environment()->Checkpoint(ast_id, combine)); |
2056 } | 2070 } |
2057 } | 2071 } |
2058 | 2072 |
2059 } | 2073 } |
2060 } | 2074 } |
2061 } // namespace v8::internal::compiler | 2075 } // namespace v8::internal::compiler |
OLD | NEW |