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

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

Issue 489543002: Revert "Load global object and builtins from activation." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | test/cctest/compiler/test-run-jscalls.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/control-builders.h" 8 #include "src/compiler/control-builders.h"
9 #include "src/compiler/machine-operator.h"
10 #include "src/compiler/node-properties.h" 9 #include "src/compiler/node-properties.h"
11 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
12 #include "src/full-codegen.h" 11 #include "src/full-codegen.h"
13 #include "src/parser.h" 12 #include "src/parser.h"
14 #include "src/scopes.h" 13 #include "src/scopes.h"
15 14
16 namespace v8 { 15 namespace v8 {
17 namespace internal { 16 namespace internal {
18 namespace compiler { 17 namespace compiler {
19 18
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 environment()->Push(value); 730 environment()->Push(value);
732 { 731 {
733 // Test if FILTER_KEY needs to be called. 732 // Test if FILTER_KEY needs to be called.
734 IfBuilder test_should_filter(this); 733 IfBuilder test_should_filter(this);
735 Node* should_filter_cond = 734 Node* should_filter_cond =
736 NewNode(javascript()->StrictEqual(), should_filter, 735 NewNode(javascript()->StrictEqual(), should_filter,
737 jsgraph()->TrueConstant()); 736 jsgraph()->TrueConstant());
738 test_should_filter.If(should_filter_cond); 737 test_should_filter.If(should_filter_cond);
739 test_should_filter.Then(); 738 test_should_filter.Then();
740 value = environment()->Pop(); 739 value = environment()->Pop();
741 Node* builtins = BuildLoadBuiltinsObject(); 740 // TODO(dcarney): Better load from function context.
742 Node* function = BuildLoadObjectField( 741 // See comment in BuildLoadBuiltinsObject.
743 builtins, 742 Handle<JSFunction> function(JSFunction::cast(
744 JSBuiltinsObject::OffsetOfFunctionWithId(Builtins::FILTER_KEY)); 743 info()->context()->builtins()->javascript_builtin(
744 Builtins::FILTER_KEY)));
745 // Callee. 745 // Callee.
746 environment()->Push(function); 746 environment()->Push(jsgraph()->HeapConstant(function));
747 // Receiver. 747 // Receiver.
748 environment()->Push(obj); 748 environment()->Push(obj);
749 // Args. 749 // Args.
750 environment()->Push(value); 750 environment()->Push(value);
751 // result is either the string key or Smi(0) indicating the property 751 // result is either the string key or Smi(0) indicating the property
752 // is gone. 752 // is gone.
753 Node* res = ProcessArguments( 753 Node* res = ProcessArguments(
754 javascript()->Call(3, NO_CALL_FUNCTION_FLAGS), 3); 754 javascript()->Call(3, NO_CALL_FUNCTION_FLAGS), 3);
755 // TODO(jarin): provide real bailout id. 755 // TODO(jarin): provide real bailout id.
756 BuildLazyBailout(res, BailoutId::None()); 756 BuildLazyBailout(res, BailoutId::None());
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 } 868 }
869 869
870 870
871 void AstGraphBuilder::VisitLiteral(Literal* expr) { 871 void AstGraphBuilder::VisitLiteral(Literal* expr) {
872 Node* value = jsgraph()->Constant(expr->value()); 872 Node* value = jsgraph()->Constant(expr->value());
873 ast_context()->ProduceValue(value); 873 ast_context()->ProduceValue(value);
874 } 874 }
875 875
876 876
877 void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { 877 void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
878 Node* closure = GetFunctionClosure(); 878 Handle<JSFunction> closure = info()->closure();
879 879
880 // Create node to materialize a regular expression literal. 880 // Create node to materialize a regular expression literal.
881 Node* literals_array = 881 Node* literals_array = jsgraph()->Constant(handle(closure->literals()));
882 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
883 Node* literal_index = jsgraph()->Constant(expr->literal_index()); 882 Node* literal_index = jsgraph()->Constant(expr->literal_index());
884 Node* pattern = jsgraph()->Constant(expr->pattern()); 883 Node* pattern = jsgraph()->Constant(expr->pattern());
885 Node* flags = jsgraph()->Constant(expr->flags()); 884 Node* flags = jsgraph()->Constant(expr->flags());
886 Operator* op = javascript()->Runtime(Runtime::kMaterializeRegExpLiteral, 4); 885 Operator* op = javascript()->Runtime(Runtime::kMaterializeRegExpLiteral, 4);
887 Node* literal = NewNode(op, literals_array, literal_index, pattern, flags); 886 Node* literal = NewNode(op, literals_array, literal_index, pattern, flags);
888 ast_context()->ProduceValue(literal); 887 ast_context()->ProduceValue(literal);
889 } 888 }
890 889
891 890
892 void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { 891 void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
893 Node* closure = GetFunctionClosure(); 892 Handle<JSFunction> closure = info()->closure();
894 893
895 // Create node to deep-copy the literal boilerplate. 894 // Create node to deep-copy the literal boilerplate.
896 expr->BuildConstantProperties(isolate()); 895 expr->BuildConstantProperties(isolate());
897 Node* literals_array = 896 Node* literals_array = jsgraph()->Constant(handle(closure->literals()));
898 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
899 Node* literal_index = jsgraph()->Constant(expr->literal_index()); 897 Node* literal_index = jsgraph()->Constant(expr->literal_index());
900 Node* constants = jsgraph()->Constant(expr->constant_properties()); 898 Node* constants = jsgraph()->Constant(expr->constant_properties());
901 Node* flags = jsgraph()->Constant(expr->ComputeFlags()); 899 Node* flags = jsgraph()->Constant(expr->ComputeFlags());
902 Operator* op = javascript()->Runtime(Runtime::kCreateObjectLiteral, 4); 900 Operator* op = javascript()->Runtime(Runtime::kCreateObjectLiteral, 4);
903 Node* literal = NewNode(op, literals_array, literal_index, constants, flags); 901 Node* literal = NewNode(op, literals_array, literal_index, constants, flags);
904 902
905 // The object is expected on the operand stack during computation of the 903 // The object is expected on the operand stack during computation of the
906 // property values and is the value of the entire expression. 904 // property values and is the value of the entire expression.
907 environment()->Push(literal); 905 environment()->Push(literal);
908 906
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 if (expr->has_function()) { 991 if (expr->has_function()) {
994 Operator* op = javascript()->Runtime(Runtime::kToFastProperties, 1); 992 Operator* op = javascript()->Runtime(Runtime::kToFastProperties, 1);
995 NewNode(op, literal); 993 NewNode(op, literal);
996 } 994 }
997 995
998 ast_context()->ProduceValue(environment()->Pop()); 996 ast_context()->ProduceValue(environment()->Pop());
999 } 997 }
1000 998
1001 999
1002 void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { 1000 void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
1003 Node* closure = GetFunctionClosure(); 1001 Handle<JSFunction> closure = info()->closure();
1004 1002
1005 // Create node to deep-copy the literal boilerplate. 1003 // Create node to deep-copy the literal boilerplate.
1006 expr->BuildConstantElements(isolate()); 1004 expr->BuildConstantElements(isolate());
1007 Node* literals_array = 1005 Node* literals_array = jsgraph()->Constant(handle(closure->literals()));
1008 BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
1009 Node* literal_index = jsgraph()->Constant(expr->literal_index()); 1006 Node* literal_index = jsgraph()->Constant(expr->literal_index());
1010 Node* constants = jsgraph()->Constant(expr->constant_elements()); 1007 Node* constants = jsgraph()->Constant(expr->constant_elements());
1011 Node* flags = jsgraph()->Constant(expr->ComputeFlags()); 1008 Node* flags = jsgraph()->Constant(expr->ComputeFlags());
1012 Operator* op = javascript()->Runtime(Runtime::kCreateArrayLiteral, 4); 1009 Operator* op = javascript()->Runtime(Runtime::kCreateArrayLiteral, 4);
1013 Node* literal = NewNode(op, literals_array, literal_index, constants, flags); 1010 Node* literal = NewNode(op, literals_array, literal_index, constants, flags);
1014 1011
1015 // The array and the literal index are both expected on the operand stack 1012 // The array and the literal index are both expected on the operand stack
1016 // during computation of the element values. 1013 // during computation of the element values.
1017 environment()->Push(literal); 1014 environment()->Push(literal);
1018 environment()->Push(literal_index); 1015 environment()->Push(literal_index);
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after
1934 // initializations of const declarations. 1931 // initializations of const declarations.
1935 Operator* op = javascript()->Runtime(Runtime::kStoreLookupSlot, 4); 1932 Operator* op = javascript()->Runtime(Runtime::kStoreLookupSlot, 4);
1936 return NewNode(op, value, current_context(), name, strict); 1933 return NewNode(op, value, current_context(), name, strict);
1937 } 1934 }
1938 } 1935 }
1939 UNREACHABLE(); 1936 UNREACHABLE();
1940 return NULL; 1937 return NULL;
1941 } 1938 }
1942 1939
1943 1940
1944 Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) {
1945 // TODO(sigurds) Use simplified load here once it is ready.
1946 MachineOperatorBuilder machine(zone());
1947 Node* field_load = NewNode(machine.Load(kMachAnyTagged), object,
1948 jsgraph_->Int32Constant(offset - kHeapObjectTag));
1949 return field_load;
1950 }
1951
1952
1953 Node* AstGraphBuilder::BuildLoadBuiltinsObject() { 1941 Node* AstGraphBuilder::BuildLoadBuiltinsObject() {
1954 Node* global = BuildLoadGlobalObject(); 1942 // TODO(mstarzinger): Better load from function context, otherwise optimized
1955 Node* builtins = 1943 // code cannot be shared across native contexts.
1956 BuildLoadObjectField(global, JSGlobalObject::kBuiltinsOffset); 1944 return jsgraph()->Constant(handle(info()->context()->builtins()));
1957 return builtins;
1958 } 1945 }
1959 1946
1960 1947
1961 Node* AstGraphBuilder::BuildLoadGlobalObject() { 1948 Node* AstGraphBuilder::BuildLoadGlobalObject() {
1949 #if 0
1962 Node* context = GetFunctionContext(); 1950 Node* context = GetFunctionContext();
1963 Operator* load_op = 1951 // TODO(mstarzinger): Use mid-level operator on FixedArray instead of the
1964 javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true); 1952 // JS-level operator that targets JSObject.
1965 return NewNode(load_op, context); 1953 Node* index = jsgraph()->Constant(Context::GLOBAL_OBJECT_INDEX);
1954 return NewNode(javascript()->LoadProperty(), context, index);
1955 #else
1956 // TODO(mstarzinger): Better load from function context, otherwise optimized
1957 // code cannot be shared across native contexts. See unused code above.
1958 return jsgraph()->Constant(handle(info()->context()->global_object()));
1959 #endif
1966 } 1960 }
1967 1961
1968 1962
1969 Node* AstGraphBuilder::BuildToBoolean(Node* value) { 1963 Node* AstGraphBuilder::BuildToBoolean(Node* value) {
1970 // TODO(mstarzinger): Possible optimization is to NOP for boolean values. 1964 // TODO(mstarzinger): Possible optimization is to NOP for boolean values.
1971 return NewNode(javascript()->ToBoolean(), value); 1965 return NewNode(javascript()->ToBoolean(), value);
1972 } 1966 }
1973 1967
1974 1968
1975 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable) { 1969 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2057 2051
2058 void AstGraphBuilder::BuildLazyBailoutWithPushedNode(Node* node, 2052 void AstGraphBuilder::BuildLazyBailoutWithPushedNode(Node* node,
2059 BailoutId ast_id) { 2053 BailoutId ast_id) {
2060 environment()->Push(node); 2054 environment()->Push(node);
2061 BuildLazyBailout(node, ast_id); 2055 BuildLazyBailout(node, ast_id);
2062 environment()->Pop(); 2056 environment()->Pop();
2063 } 2057 }
2064 } 2058 }
2065 } 2059 }
2066 } // namespace v8::internal::compiler 2060 } // namespace v8::internal::compiler
OLDNEW
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | test/cctest/compiler/test-run-jscalls.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698