| 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/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 1870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1881 // Runtime_CreateObjectLiteralBoilerplate. The second "dynamic" part starts | 1881 // Runtime_CreateObjectLiteralBoilerplate. The second "dynamic" part starts |
| 1882 // with the first computed property name and continues with all properties to | 1882 // with the first computed property name and continues with all properties to |
| 1883 // its right. All the code from above initializes the static component of the | 1883 // its right. All the code from above initializes the static component of the |
| 1884 // object literal, and arranges for the map of the result to reflect the | 1884 // object literal, and arranges for the map of the result to reflect the |
| 1885 // static order in which the keys appear. For the dynamic properties, we | 1885 // static order in which the keys appear. For the dynamic properties, we |
| 1886 // compile them into a series of "SetOwnProperty" runtime calls. This will | 1886 // compile them into a series of "SetOwnProperty" runtime calls. This will |
| 1887 // preserve insertion order. | 1887 // preserve insertion order. |
| 1888 for (; property_index < expr->properties()->length(); property_index++) { | 1888 for (; property_index < expr->properties()->length(); property_index++) { |
| 1889 ObjectLiteral::Property* property = expr->properties()->at(property_index); | 1889 ObjectLiteral::Property* property = expr->properties()->at(property_index); |
| 1890 | 1890 |
| 1891 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { |
| 1892 environment()->Push(literal); // Duplicate receiver. |
| 1893 VisitForValue(property->value()); |
| 1894 Node* value = environment()->Pop(); |
| 1895 Node* receiver = environment()->Pop(); |
| 1896 const Operator* op = |
| 1897 javascript()->CallRuntime(Runtime::kInternalSetPrototype, 2); |
| 1898 Node* call = NewNode(op, receiver, value); |
| 1899 PrepareFrameState(call, BailoutId::None()); |
| 1900 continue; |
| 1901 } |
| 1902 |
| 1891 environment()->Push(literal); // Duplicate receiver. | 1903 environment()->Push(literal); // Duplicate receiver. |
| 1892 VisitForValue(property->key()); | 1904 VisitForValue(property->key()); |
| 1893 Node* name = BuildToName(environment()->Pop(), | 1905 Node* name = BuildToName(environment()->Pop(), |
| 1894 expr->GetIdForProperty(property_index)); | 1906 expr->GetIdForProperty(property_index)); |
| 1895 environment()->Push(name); | 1907 environment()->Push(name); |
| 1896 // TODO(mstarzinger): For ObjectLiteral::Property::PROTOTYPE the key should | |
| 1897 // not be on the operand stack while the value is being evaluated. Come up | |
| 1898 // with a repro for this and fix it. Also find a nice way to do so. :) | |
| 1899 VisitForValue(property->value()); | 1908 VisitForValue(property->value()); |
| 1900 Node* value = environment()->Pop(); | 1909 Node* value = environment()->Pop(); |
| 1901 Node* key = environment()->Pop(); | 1910 Node* key = environment()->Pop(); |
| 1902 Node* receiver = environment()->Pop(); | 1911 Node* receiver = environment()->Pop(); |
| 1903 BuildSetHomeObject(value, receiver, property->value()); | 1912 BuildSetHomeObject(value, receiver, property->value()); |
| 1904 | 1913 |
| 1905 switch (property->kind()) { | 1914 switch (property->kind()) { |
| 1906 case ObjectLiteral::Property::CONSTANT: | 1915 case ObjectLiteral::Property::CONSTANT: |
| 1907 case ObjectLiteral::Property::COMPUTED: | 1916 case ObjectLiteral::Property::COMPUTED: |
| 1908 case ObjectLiteral::Property::MATERIALIZED_LITERAL: { | 1917 case ObjectLiteral::Property::MATERIALIZED_LITERAL: { |
| 1909 Node* attr = jsgraph()->Constant(NONE); | 1918 Node* attr = jsgraph()->Constant(NONE); |
| 1910 const Operator* op = | 1919 const Operator* op = |
| 1911 javascript()->CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); | 1920 javascript()->CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); |
| 1912 Node* call = NewNode(op, receiver, key, value, attr); | 1921 Node* call = NewNode(op, receiver, key, value, attr); |
| 1913 PrepareFrameState(call, BailoutId::None()); | 1922 PrepareFrameState(call, BailoutId::None()); |
| 1914 break; | 1923 break; |
| 1915 } | 1924 } |
| 1916 case ObjectLiteral::Property::PROTOTYPE: { | 1925 case ObjectLiteral::Property::PROTOTYPE: |
| 1917 const Operator* op = | 1926 UNREACHABLE(); // Handled specially above. |
| 1918 javascript()->CallRuntime(Runtime::kInternalSetPrototype, 2); | |
| 1919 Node* call = NewNode(op, receiver, value); | |
| 1920 PrepareFrameState(call, BailoutId::None()); | |
| 1921 break; | 1927 break; |
| 1922 } | |
| 1923 case ObjectLiteral::Property::GETTER: { | 1928 case ObjectLiteral::Property::GETTER: { |
| 1924 Node* attr = jsgraph()->Constant(NONE); | 1929 Node* attr = jsgraph()->Constant(NONE); |
| 1925 const Operator* op = javascript()->CallRuntime( | 1930 const Operator* op = javascript()->CallRuntime( |
| 1926 Runtime::kDefineGetterPropertyUnchecked, 4); | 1931 Runtime::kDefineGetterPropertyUnchecked, 4); |
| 1927 Node* call = NewNode(op, receiver, key, value, attr); | 1932 Node* call = NewNode(op, receiver, key, value, attr); |
| 1928 PrepareFrameState(call, BailoutId::None()); | 1933 PrepareFrameState(call, BailoutId::None()); |
| 1929 break; | 1934 break; |
| 1930 } | 1935 } |
| 1931 case ObjectLiteral::Property::SETTER: { | 1936 case ObjectLiteral::Property::SETTER: { |
| 1932 Node* attr = jsgraph()->Constant(NONE); | 1937 Node* attr = jsgraph()->Constant(NONE); |
| (...skipping 1845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3778 // Phi does not exist yet, introduce one. | 3783 // Phi does not exist yet, introduce one. |
| 3779 value = NewPhi(inputs, value, control); | 3784 value = NewPhi(inputs, value, control); |
| 3780 value->ReplaceInput(inputs - 1, other); | 3785 value->ReplaceInput(inputs - 1, other); |
| 3781 } | 3786 } |
| 3782 return value; | 3787 return value; |
| 3783 } | 3788 } |
| 3784 | 3789 |
| 3785 } // namespace compiler | 3790 } // namespace compiler |
| 3786 } // namespace internal | 3791 } // namespace internal |
| 3787 } // namespace v8 | 3792 } // namespace v8 |
| OLD | NEW |