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

Side by Side Diff: src/objects.h

Issue 1552473002: Revert of [runtime] Introduce dedicated JSBoundFunction to represent bound functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@FunctionConstructor
Patch Set: Created 4 years, 12 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/mips64/macro-assembler-mips64.cc ('k') | src/objects.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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_OBJECTS_H_ 5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_ 6 #define V8_OBJECTS_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 // - Object 44 // - Object
45 // - Smi (immediate small integer) 45 // - Smi (immediate small integer)
46 // - HeapObject (superclass for everything allocated in the heap) 46 // - HeapObject (superclass for everything allocated in the heap)
47 // - JSReceiver (suitable for property access) 47 // - JSReceiver (suitable for property access)
48 // - JSObject 48 // - JSObject
49 // - JSArray 49 // - JSArray
50 // - JSArrayBuffer 50 // - JSArrayBuffer
51 // - JSArrayBufferView 51 // - JSArrayBufferView
52 // - JSTypedArray 52 // - JSTypedArray
53 // - JSDataView 53 // - JSDataView
54 // - JSBoundFunction
55 // - JSCollection 54 // - JSCollection
56 // - JSSet 55 // - JSSet
57 // - JSMap 56 // - JSMap
58 // - JSSetIterator 57 // - JSSetIterator
59 // - JSMapIterator 58 // - JSMapIterator
60 // - JSWeakCollection 59 // - JSWeakCollection
61 // - JSWeakMap 60 // - JSWeakMap
62 // - JSWeakSet 61 // - JSWeakSet
63 // - JSRegExp 62 // - JSRegExp
64 // - JSFunction 63 // - JSFunction
65 // - JSGeneratorObject 64 // - JSGeneratorObject
66 // - JSModule 65 // - JSModule
67 // - JSGlobalObject 66 // - JSGlobalObject
68 // - JSGlobalProxy 67 // - JSGlobalProxy
69 // - JSValue 68 // - JSValue
70 // - JSDate 69 // - JSDate
71 // - JSMessageObject 70 // - JSMessageObject
72 // - JSProxy 71 // - JSProxy
73 // - FixedArrayBase 72 // - FixedArrayBase
74 // - ByteArray 73 // - ByteArray
75 // - BytecodeArray 74 // - BytecodeArray
76 // - FixedArray 75 // - FixedArray
77 // - DescriptorArray 76 // - DescriptorArray
78 // - LiteralsArray 77 // - LiteralsArray
78 // - BindingsArray
79 // - HashTable 79 // - HashTable
80 // - Dictionary 80 // - Dictionary
81 // - StringTable 81 // - StringTable
82 // - CompilationCacheTable 82 // - CompilationCacheTable
83 // - CodeCacheHashTable 83 // - CodeCacheHashTable
84 // - MapCache 84 // - MapCache
85 // - OrderedHashTable 85 // - OrderedHashTable
86 // - OrderedHashSet 86 // - OrderedHashSet
87 // - OrderedHashMap 87 // - OrderedHashMap
88 // - Context 88 // - Context
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 V(JS_SET_TYPE) \ 430 V(JS_SET_TYPE) \
431 V(JS_MAP_TYPE) \ 431 V(JS_MAP_TYPE) \
432 V(JS_SET_ITERATOR_TYPE) \ 432 V(JS_SET_ITERATOR_TYPE) \
433 V(JS_MAP_ITERATOR_TYPE) \ 433 V(JS_MAP_ITERATOR_TYPE) \
434 V(JS_ITERATOR_RESULT_TYPE) \ 434 V(JS_ITERATOR_RESULT_TYPE) \
435 V(JS_WEAK_MAP_TYPE) \ 435 V(JS_WEAK_MAP_TYPE) \
436 V(JS_WEAK_SET_TYPE) \ 436 V(JS_WEAK_SET_TYPE) \
437 V(JS_PROMISE_TYPE) \ 437 V(JS_PROMISE_TYPE) \
438 V(JS_REGEXP_TYPE) \ 438 V(JS_REGEXP_TYPE) \
439 \ 439 \
440 V(JS_BOUND_FUNCTION_TYPE) \
441 V(JS_FUNCTION_TYPE) \ 440 V(JS_FUNCTION_TYPE) \
442 V(DEBUG_INFO_TYPE) \ 441 V(DEBUG_INFO_TYPE) \
443 V(BREAK_POINT_INFO_TYPE) 442 V(BREAK_POINT_INFO_TYPE)
444 443
445 444
446 // Since string types are not consecutive, this macro is used to 445 // Since string types are not consecutive, this macro is used to
447 // iterate over them. 446 // iterate over them.
448 #define STRING_TYPE_LIST(V) \ 447 #define STRING_TYPE_LIST(V) \
449 V(STRING_TYPE, kVariableSizeSentinel, string, String) \ 448 V(STRING_TYPE, kVariableSizeSentinel, string, String) \
450 V(ONE_BYTE_STRING_TYPE, kVariableSizeSentinel, one_byte_string, \ 449 V(ONE_BYTE_STRING_TYPE, kVariableSizeSentinel, one_byte_string, \
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 JS_DATA_VIEW_TYPE, 725 JS_DATA_VIEW_TYPE,
727 JS_SET_TYPE, 726 JS_SET_TYPE,
728 JS_MAP_TYPE, 727 JS_MAP_TYPE,
729 JS_SET_ITERATOR_TYPE, 728 JS_SET_ITERATOR_TYPE,
730 JS_MAP_ITERATOR_TYPE, 729 JS_MAP_ITERATOR_TYPE,
731 JS_ITERATOR_RESULT_TYPE, 730 JS_ITERATOR_RESULT_TYPE,
732 JS_WEAK_MAP_TYPE, 731 JS_WEAK_MAP_TYPE,
733 JS_WEAK_SET_TYPE, 732 JS_WEAK_SET_TYPE,
734 JS_PROMISE_TYPE, 733 JS_PROMISE_TYPE,
735 JS_REGEXP_TYPE, 734 JS_REGEXP_TYPE,
736 JS_BOUND_FUNCTION_TYPE,
737 JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE 735 JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE
738 736
739 // Pseudo-types 737 // Pseudo-types
740 FIRST_TYPE = 0x0, 738 FIRST_TYPE = 0x0,
741 LAST_TYPE = JS_FUNCTION_TYPE, 739 LAST_TYPE = JS_FUNCTION_TYPE,
742 FIRST_NAME_TYPE = FIRST_TYPE, 740 FIRST_NAME_TYPE = FIRST_TYPE,
743 LAST_NAME_TYPE = SYMBOL_TYPE, 741 LAST_NAME_TYPE = SYMBOL_TYPE,
744 FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE, 742 FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE,
745 LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE, 743 LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE,
746 FIRST_NONSTRING_TYPE = SYMBOL_TYPE, 744 FIRST_NONSTRING_TYPE = SYMBOL_TYPE,
747 FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE, 745 FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE,
748 LAST_PRIMITIVE_TYPE = ODDBALL_TYPE, 746 LAST_PRIMITIVE_TYPE = ODDBALL_TYPE,
749 FIRST_FUNCTION_TYPE = JS_BOUND_FUNCTION_TYPE,
750 LAST_FUNCTION_TYPE = JS_FUNCTION_TYPE,
751 // Boundaries for testing for a fixed typed array. 747 // Boundaries for testing for a fixed typed array.
752 FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE, 748 FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE,
753 LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_UINT8_CLAMPED_ARRAY_TYPE, 749 LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_UINT8_CLAMPED_ARRAY_TYPE,
754 // Boundary for promotion to old space. 750 // Boundary for promotion to old space.
755 LAST_DATA_TYPE = FILLER_TYPE, 751 LAST_DATA_TYPE = FILLER_TYPE,
756 // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy). 752 // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy).
757 // Note that there is no range for JSObject or JSProxy, since their subtypes 753 // Note that there is no range for JSObject or JSProxy, since their subtypes
758 // are not continuous in this enum! The enum ranges instead reflect the 754 // are not continuous in this enum! The enum ranges instead reflect the
759 // external class names, where proxies are treated as either ordinary objects, 755 // external class names, where proxies are treated as either ordinary objects,
760 // or functions. 756 // or functions.
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 V(BytecodeArray) \ 923 V(BytecodeArray) \
928 V(FreeSpace) \ 924 V(FreeSpace) \
929 V(JSReceiver) \ 925 V(JSReceiver) \
930 V(JSObject) \ 926 V(JSObject) \
931 V(JSContextExtensionObject) \ 927 V(JSContextExtensionObject) \
932 V(JSGeneratorObject) \ 928 V(JSGeneratorObject) \
933 V(JSModule) \ 929 V(JSModule) \
934 V(LayoutDescriptor) \ 930 V(LayoutDescriptor) \
935 V(Map) \ 931 V(Map) \
936 V(DescriptorArray) \ 932 V(DescriptorArray) \
933 V(BindingsArray) \
937 V(TransitionArray) \ 934 V(TransitionArray) \
938 V(LiteralsArray) \ 935 V(LiteralsArray) \
939 V(TypeFeedbackMetadata) \ 936 V(TypeFeedbackMetadata) \
940 V(TypeFeedbackVector) \ 937 V(TypeFeedbackVector) \
941 V(DeoptimizationInputData) \ 938 V(DeoptimizationInputData) \
942 V(DeoptimizationOutputData) \ 939 V(DeoptimizationOutputData) \
943 V(DependentCode) \ 940 V(DependentCode) \
944 V(HandlerTable) \ 941 V(HandlerTable) \
945 V(FixedArray) \ 942 V(FixedArray) \
946 V(FixedDoubleArray) \ 943 V(FixedDoubleArray) \
947 V(WeakFixedArray) \ 944 V(WeakFixedArray) \
948 V(ArrayList) \ 945 V(ArrayList) \
949 V(Context) \ 946 V(Context) \
950 V(ScriptContextTable) \ 947 V(ScriptContextTable) \
951 V(NativeContext) \ 948 V(NativeContext) \
952 V(ScopeInfo) \ 949 V(ScopeInfo) \
953 V(JSBoundFunction) \
954 V(JSFunction) \ 950 V(JSFunction) \
955 V(Code) \ 951 V(Code) \
956 V(Oddball) \ 952 V(Oddball) \
957 V(SharedFunctionInfo) \ 953 V(SharedFunctionInfo) \
958 V(JSValue) \ 954 V(JSValue) \
959 V(JSDate) \ 955 V(JSDate) \
960 V(JSMessageObject) \ 956 V(JSMessageObject) \
961 V(StringWrapper) \ 957 V(StringWrapper) \
962 V(Foreign) \ 958 V(Foreign) \
963 V(Boolean) \ 959 V(Boolean) \
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 1043
1048 INLINE(bool IsStruct() const); 1044 INLINE(bool IsStruct() const);
1049 #define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \ 1045 #define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \
1050 INLINE(bool Is##Name() const); 1046 INLINE(bool Is##Name() const);
1051 STRUCT_LIST(DECLARE_STRUCT_PREDICATE) 1047 STRUCT_LIST(DECLARE_STRUCT_PREDICATE)
1052 #undef DECLARE_STRUCT_PREDICATE 1048 #undef DECLARE_STRUCT_PREDICATE
1053 1049
1054 // ES6, section 7.2.2 IsArray. NOT to be confused with %_IsArray. 1050 // ES6, section 7.2.2 IsArray. NOT to be confused with %_IsArray.
1055 MUST_USE_RESULT static Maybe<bool> IsArray(Handle<Object> object); 1051 MUST_USE_RESULT static Maybe<bool> IsArray(Handle<Object> object);
1056 1052
1057 // Test for JSBoundFunction or JSFunction.
1058 INLINE(bool IsFunction() const);
1059
1060 // ES6, section 7.2.3 IsCallable. 1053 // ES6, section 7.2.3 IsCallable.
1061 INLINE(bool IsCallable() const); 1054 INLINE(bool IsCallable() const);
1062 1055
1063 // ES6, section 7.2.4 IsConstructor. 1056 // ES6, section 7.2.4 IsConstructor.
1064 INLINE(bool IsConstructor() const); 1057 INLINE(bool IsConstructor() const);
1065 1058
1066 INLINE(bool IsTemplateInfo()) const; 1059 INLINE(bool IsTemplateInfo()) const;
1067 INLINE(bool IsNameDictionary() const); 1060 INLINE(bool IsNameDictionary() const);
1068 INLINE(bool IsGlobalDictionary() const); 1061 INLINE(bool IsGlobalDictionary() const);
1069 INLINE(bool IsSeededNumberDictionary() const); 1062 INLINE(bool IsSeededNumberDictionary() const);
(...skipping 3594 matching lines...) Expand 10 before | Expand all | Expand 10 after
4664 DECLARE_CAST(LiteralsArray) 4657 DECLARE_CAST(LiteralsArray)
4665 4658
4666 private: 4659 private:
4667 inline Object* get(int index) const; 4660 inline Object* get(int index) const;
4668 inline void set(int index, Object* value); 4661 inline void set(int index, Object* value);
4669 inline void set(int index, Smi* value); 4662 inline void set(int index, Smi* value);
4670 inline void set(int index, Object* value, WriteBarrierMode mode); 4663 inline void set(int index, Object* value, WriteBarrierMode mode);
4671 }; 4664 };
4672 4665
4673 4666
4667 // A bindings array contains the bindings for a bound function. It also holds
4668 // the type feedback vector.
4669 class BindingsArray : public FixedArray {
4670 public:
4671 inline TypeFeedbackVector* feedback_vector() const;
4672 inline void set_feedback_vector(TypeFeedbackVector* vector);
4673
4674 inline JSReceiver* bound_function() const;
4675 inline void set_bound_function(JSReceiver* function);
4676 inline Object* bound_this() const;
4677 inline void set_bound_this(Object* bound_this);
4678
4679 inline Object* binding(int binding_index) const;
4680 inline void set_binding(int binding_index, Object* binding);
4681 inline int bindings_count() const;
4682
4683 static Handle<BindingsArray> New(Isolate* isolate,
4684 Handle<TypeFeedbackVector> vector,
4685 Handle<JSReceiver> bound_function,
4686 Handle<Object> bound_this,
4687 int number_of_bindings);
4688
4689 static Handle<JSArray> CreateBoundArguments(Handle<BindingsArray> bindings);
4690 static Handle<JSArray> CreateRuntimeBindings(Handle<BindingsArray> bindings);
4691
4692 DECLARE_CAST(BindingsArray)
4693
4694 private:
4695 static const int kVectorIndex = 0;
4696 static const int kBoundFunctionIndex = 1;
4697 static const int kBoundThisIndex = 2;
4698 static const int kFirstBindingIndex = 3;
4699
4700 inline Object* get(int index) const;
4701 inline void set(int index, Object* value);
4702 inline void set(int index, Smi* value);
4703 inline void set(int index, Object* value, WriteBarrierMode mode);
4704
4705 inline int length() const;
4706 };
4707
4708
4674 // HandlerTable is a fixed array containing entries for exception handlers in 4709 // HandlerTable is a fixed array containing entries for exception handlers in
4675 // the code object it is associated with. The tables comes in two flavors: 4710 // the code object it is associated with. The tables comes in two flavors:
4676 // 1) Based on ranges: Used for unoptimized code. Contains one entry per 4711 // 1) Based on ranges: Used for unoptimized code. Contains one entry per
4677 // exception handler and a range representing the try-block covered by that 4712 // exception handler and a range representing the try-block covered by that
4678 // handler. Layout looks as follows: 4713 // handler. Layout looks as follows:
4679 // [ range-start , range-end , handler-offset , stack-depth ] 4714 // [ range-start , range-end , handler-offset , stack-depth ]
4680 // 2) Based on return addresses: Used for turbofanned code. Contains one entry 4715 // 2) Based on return addresses: Used for turbofanned code. Contains one entry
4681 // per call-site that could throw an exception. Layout looks as follows: 4716 // per call-site that could throw an exception. Layout looks as follows:
4682 // [ return-address-offset , handler-offset ] 4717 // [ return-address-offset , handler-offset ]
4683 class HandlerTable : public FixedArray { 4718 class HandlerTable : public FixedArray {
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after
5522 // Tells whether the object in the prototype property will be used 5557 // Tells whether the object in the prototype property will be used
5523 // for instances created from this function. If the prototype 5558 // for instances created from this function. If the prototype
5524 // property is set to a value that is not a JSObject, the prototype 5559 // property is set to a value that is not a JSObject, the prototype
5525 // property will not be used to create instances of the function. 5560 // property will not be used to create instances of the function.
5526 // See ECMA-262, 13.2.2. 5561 // See ECMA-262, 13.2.2.
5527 inline void set_non_instance_prototype(bool value); 5562 inline void set_non_instance_prototype(bool value);
5528 inline bool has_non_instance_prototype(); 5563 inline bool has_non_instance_prototype();
5529 5564
5530 // Tells whether the instance has a [[Construct]] internal method. 5565 // Tells whether the instance has a [[Construct]] internal method.
5531 // This property is implemented according to ES6, section 7.2.4. 5566 // This property is implemented according to ES6, section 7.2.4.
5532 inline void set_is_constructor(); 5567 inline void set_is_constructor(bool value);
5533 inline bool is_constructor() const; 5568 inline bool is_constructor() const;
5534 5569
5535 // Tells whether the instance with this map should be ignored by the 5570 // Tells whether the instance with this map should be ignored by the
5536 // Object.getPrototypeOf() function and the __proto__ accessor. 5571 // Object.getPrototypeOf() function and the __proto__ accessor.
5537 inline void set_is_hidden_prototype(); 5572 inline void set_is_hidden_prototype();
5538 inline bool is_hidden_prototype() const; 5573 inline bool is_hidden_prototype() const;
5539 5574
5540 // Records and queries whether the instance has a named interceptor. 5575 // Records and queries whether the instance has a named interceptor.
5541 inline void set_has_named_interceptor(); 5576 inline void set_has_named_interceptor();
5542 inline bool has_named_interceptor(); 5577 inline bool has_named_interceptor();
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after
6697 6732
6698 // Indicate that this function should always be inlined in optimized code. 6733 // Indicate that this function should always be inlined in optimized code.
6699 DECL_BOOLEAN_ACCESSORS(force_inline) 6734 DECL_BOOLEAN_ACCESSORS(force_inline)
6700 6735
6701 // Indicates that the function was created by the Function function. 6736 // Indicates that the function was created by the Function function.
6702 // Though it's anonymous, toString should treat it as if it had the name 6737 // Though it's anonymous, toString should treat it as if it had the name
6703 // "anonymous". We don't set the name itself so that the system does not 6738 // "anonymous". We don't set the name itself so that the system does not
6704 // see a binding for it. 6739 // see a binding for it.
6705 DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous) 6740 DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous)
6706 6741
6742 // Indicates whether the function is a bound function created using
6743 // the bind function.
6744 DECL_BOOLEAN_ACCESSORS(bound)
6745
6707 // Indicates that the function is anonymous (the name field can be set 6746 // Indicates that the function is anonymous (the name field can be set
6708 // through the API, which does not change this flag). 6747 // through the API, which does not change this flag).
6709 DECL_BOOLEAN_ACCESSORS(is_anonymous) 6748 DECL_BOOLEAN_ACCESSORS(is_anonymous)
6710 6749
6711 // Is this a function or top-level/eval code. 6750 // Is this a function or top-level/eval code.
6712 DECL_BOOLEAN_ACCESSORS(is_function) 6751 DECL_BOOLEAN_ACCESSORS(is_function)
6713 6752
6714 // Indicates that code for this function cannot be compiled with Crankshaft. 6753 // Indicates that code for this function cannot be compiled with Crankshaft.
6715 DECL_BOOLEAN_ACCESSORS(dont_crankshaft) 6754 DECL_BOOLEAN_ACCESSORS(dont_crankshaft)
6716 6755
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
6986 kAllowLazyCompilationWithoutContext, 7025 kAllowLazyCompilationWithoutContext,
6987 kOptimizationDisabled, 7026 kOptimizationDisabled,
6988 kNative, 7027 kNative,
6989 kStrictModeFunction, 7028 kStrictModeFunction,
6990 kStrongModeFunction, 7029 kStrongModeFunction,
6991 kUsesArguments, 7030 kUsesArguments,
6992 kNeedsHomeObject, 7031 kNeedsHomeObject,
6993 // byte 1 7032 // byte 1
6994 kHasDuplicateParameters, 7033 kHasDuplicateParameters,
6995 kForceInline, 7034 kForceInline,
6996 kIsAsmFunction, 7035 kBoundFunction,
6997 kIsAnonymous, 7036 kIsAnonymous,
6998 kNameShouldPrintAsAnonymous, 7037 kNameShouldPrintAsAnonymous,
6999 kIsFunction, 7038 kIsFunction,
7000 kDontCrankshaft, 7039 kDontCrankshaft,
7001 kDontFlush, 7040 kDontFlush,
7002 // byte 2 7041 // byte 2
7003 kFunctionKind, 7042 kFunctionKind,
7004 kIsArrow = kFunctionKind, 7043 kIsArrow = kFunctionKind,
7005 kIsGenerator, 7044 kIsGenerator,
7006 kIsConciseMethod, 7045 kIsConciseMethod,
7007 kIsAccessorFunction, 7046 kIsAccessorFunction,
7008 kIsDefaultConstructor, 7047 kIsDefaultConstructor,
7009 kIsSubclassConstructor, 7048 kIsSubclassConstructor,
7010 kIsBaseConstructor, 7049 kIsBaseConstructor,
7011 kIsInObjectLiteral, 7050 kIsInObjectLiteral,
7012 // byte 3 7051 // byte 3
7052 kIsAsmFunction,
7013 kDeserialized, 7053 kDeserialized,
7014 kNeverCompiled, 7054 kNeverCompiled,
7015 kCompilerHintsCount, // Pseudo entry 7055 kCompilerHintsCount, // Pseudo entry
7016 }; 7056 };
7017 // Add hints for other modes when they're added. 7057 // Add hints for other modes when they're added.
7018 STATIC_ASSERT(LANGUAGE_END == 3); 7058 STATIC_ASSERT(LANGUAGE_END == 3);
7019 // kFunctionKind has to be byte-aligned 7059 // kFunctionKind has to be byte-aligned
7020 STATIC_ASSERT((kFunctionKind % kBitsPerByte) == 0); 7060 STATIC_ASSERT((kFunctionKind % kBitsPerByte) == 0);
7021 // Make sure that FunctionKind and byte 2 are in sync: 7061 // Make sure that FunctionKind and byte 2 are in sync:
7022 #define ASSERT_FUNCTION_KIND_ORDER(functionKind, compilerFunctionKind) \ 7062 #define ASSERT_FUNCTION_KIND_ORDER(functionKind, compilerFunctionKind) \
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
7056 SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte); 7096 SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte);
7057 7097
7058 public: 7098 public:
7059 // Constants for optimizing codegen for strict mode function and 7099 // Constants for optimizing codegen for strict mode function and
7060 // native tests when using integer-width instructions. 7100 // native tests when using integer-width instructions.
7061 static const int kStrictModeBit = 7101 static const int kStrictModeBit =
7062 kStrictModeFunction + kCompilerHintsSmiTagSize; 7102 kStrictModeFunction + kCompilerHintsSmiTagSize;
7063 static const int kStrongModeBit = 7103 static const int kStrongModeBit =
7064 kStrongModeFunction + kCompilerHintsSmiTagSize; 7104 kStrongModeFunction + kCompilerHintsSmiTagSize;
7065 static const int kNativeBit = kNative + kCompilerHintsSmiTagSize; 7105 static const int kNativeBit = kNative + kCompilerHintsSmiTagSize;
7106 static const int kBoundBit = kBoundFunction + kCompilerHintsSmiTagSize;
7066 7107
7067 static const int kClassConstructorBits = 7108 static const int kClassConstructorBits =
7068 FunctionKind::kClassConstructor 7109 FunctionKind::kClassConstructor
7069 << (kFunctionKind + kCompilerHintsSmiTagSize); 7110 << (kFunctionKind + kCompilerHintsSmiTagSize);
7070 7111
7071 // Constants for optimizing codegen for strict mode function and 7112 // Constants for optimizing codegen for strict mode function and
7072 // native tests. 7113 // native tests.
7073 // Allows to use byte-width instructions. 7114 // Allows to use byte-width instructions.
7074 static const int kStrictModeBitWithinByte = kStrictModeBit % kBitsPerByte; 7115 static const int kStrictModeBitWithinByte = kStrictModeBit % kBitsPerByte;
7075 static const int kStrongModeBitWithinByte = kStrongModeBit % kBitsPerByte; 7116 static const int kStrongModeBitWithinByte = kStrongModeBit % kBitsPerByte;
7076 static const int kNativeBitWithinByte = kNativeBit % kBitsPerByte; 7117 static const int kNativeBitWithinByte = kNativeBit % kBitsPerByte;
7118 static const int kBoundBitWithinByte = kBoundBit % kBitsPerByte;
7077 7119
7078 static const int kClassConstructorBitsWithinByte = 7120 static const int kClassConstructorBitsWithinByte =
7079 FunctionKind::kClassConstructor << kCompilerHintsSmiTagSize; 7121 FunctionKind::kClassConstructor << kCompilerHintsSmiTagSize;
7080 STATIC_ASSERT(kClassConstructorBitsWithinByte < (1 << kBitsPerByte)); 7122 STATIC_ASSERT(kClassConstructorBitsWithinByte < (1 << kBitsPerByte));
7081 7123
7082 #if defined(V8_TARGET_LITTLE_ENDIAN) 7124 #if defined(V8_TARGET_LITTLE_ENDIAN)
7083 #define BYTE_OFFSET(compiler_hint) \ 7125 #define BYTE_OFFSET(compiler_hint) \
7084 kCompilerHintsOffset + \ 7126 kCompilerHintsOffset + \
7085 (compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte 7127 (compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte
7086 #elif defined(V8_TARGET_BIG_ENDIAN) 7128 #elif defined(V8_TARGET_BIG_ENDIAN)
7087 #define BYTE_OFFSET(compiler_hint) \ 7129 #define BYTE_OFFSET(compiler_hint) \
7088 kCompilerHintsOffset + (kCompilerHintsSize - 1) - \ 7130 kCompilerHintsOffset + (kCompilerHintsSize - 1) - \
7089 ((compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte) 7131 ((compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte)
7090 #else 7132 #else
7091 #error Unknown byte ordering 7133 #error Unknown byte ordering
7092 #endif 7134 #endif
7093 static const int kStrictModeByteOffset = BYTE_OFFSET(kStrictModeFunction); 7135 static const int kStrictModeByteOffset = BYTE_OFFSET(kStrictModeFunction);
7094 static const int kStrongModeByteOffset = BYTE_OFFSET(kStrongModeFunction); 7136 static const int kStrongModeByteOffset = BYTE_OFFSET(kStrongModeFunction);
7095 static const int kNativeByteOffset = BYTE_OFFSET(kNative); 7137 static const int kNativeByteOffset = BYTE_OFFSET(kNative);
7138 static const int kBoundByteOffset = BYTE_OFFSET(kBoundFunction);
7096 static const int kFunctionKindByteOffset = BYTE_OFFSET(kFunctionKind); 7139 static const int kFunctionKindByteOffset = BYTE_OFFSET(kFunctionKind);
7097 #undef BYTE_OFFSET 7140 #undef BYTE_OFFSET
7098 7141
7099 private: 7142 private:
7100 // Returns entry from optimized code map for specified context and OSR entry. 7143 // Returns entry from optimized code map for specified context and OSR entry.
7101 // The result is either kNotFound, kSharedCodeIndex for context-independent 7144 // The result is either kNotFound, kSharedCodeIndex for context-independent
7102 // entry or a start index of the context-dependent entry. 7145 // entry or a start index of the context-dependent entry.
7103 int SearchOptimizedCodeMapEntry(Context* native_context, 7146 int SearchOptimizedCodeMapEntry(Context* native_context,
7104 BailoutId osr_ast_id); 7147 BailoutId osr_ast_id);
7105 7148
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
7195 // Layout description. 7238 // Layout description.
7196 static const int kContextOffset = JSObject::kHeaderSize; 7239 static const int kContextOffset = JSObject::kHeaderSize;
7197 static const int kScopeInfoOffset = kContextOffset + kPointerSize; 7240 static const int kScopeInfoOffset = kContextOffset + kPointerSize;
7198 static const int kSize = kScopeInfoOffset + kPointerSize; 7241 static const int kSize = kScopeInfoOffset + kPointerSize;
7199 7242
7200 private: 7243 private:
7201 DISALLOW_IMPLICIT_CONSTRUCTORS(JSModule); 7244 DISALLOW_IMPLICIT_CONSTRUCTORS(JSModule);
7202 }; 7245 };
7203 7246
7204 7247
7205 // JSBoundFunction describes a bound function exotic object.
7206 class JSBoundFunction : public JSObject {
7207 public:
7208 // [length]: The bound function "length" property.
7209 DECL_ACCESSORS(length, Object)
7210
7211 // [name]: The bound function "name" property.
7212 DECL_ACCESSORS(name, Object)
7213
7214 // [bound_target_function]: The wrapped function object.
7215 DECL_ACCESSORS(bound_target_function, JSReceiver)
7216
7217 // [bound_this]: The value that is always passed as the this value when
7218 // calling the wrapped function.
7219 DECL_ACCESSORS(bound_this, Object)
7220
7221 // [bound_arguments]: A list of values whose elements are used as the first
7222 // arguments to any call to the wrapped function.
7223 DECL_ACCESSORS(bound_arguments, FixedArray)
7224
7225 // [creation_context]: The native context in which the function was bound.
7226 // TODO(bmeurer, verwaest): Can we (mis)use (unused) constructor field in
7227 // the Map instead of putting this into the object? Only required for
7228 // JSReceiver::GetCreationContext() anyway.
7229 DECL_ACCESSORS(creation_context, Context)
7230
7231 static MaybeHandle<Context> GetFunctionRealm(
7232 Handle<JSBoundFunction> function);
7233
7234 DECLARE_CAST(JSBoundFunction)
7235
7236 // Dispatched behavior.
7237 DECLARE_PRINTER(JSBoundFunction)
7238 DECLARE_VERIFIER(JSBoundFunction)
7239
7240 // The bound function's string representation implemented according
7241 // to ES6 section 19.2.3.5 Function.prototype.toString ( ).
7242 static Handle<String> ToString(Handle<JSBoundFunction> function);
7243
7244 // Layout description.
7245 static const int kBoundTargetFunctionOffset = JSObject::kHeaderSize;
7246 static const int kBoundThisOffset = kBoundTargetFunctionOffset + kPointerSize;
7247 static const int kBoundArgumentsOffset = kBoundThisOffset + kPointerSize;
7248 static const int kCreationContextOffset =
7249 kBoundArgumentsOffset + kPointerSize;
7250 static const int kLengthOffset = kCreationContextOffset + kPointerSize;
7251 static const int kNameOffset = kLengthOffset + kPointerSize;
7252 static const int kSize = kNameOffset + kPointerSize;
7253
7254 // Indices of in-object properties.
7255 static const int kLengthIndex = 0;
7256 static const int kNameIndex = 1;
7257
7258 private:
7259 DISALLOW_IMPLICIT_CONSTRUCTORS(JSBoundFunction);
7260 };
7261
7262
7263 // JSFunction describes JavaScript functions. 7248 // JSFunction describes JavaScript functions.
7264 class JSFunction: public JSObject { 7249 class JSFunction: public JSObject {
7265 public: 7250 public:
7266 // [prototype_or_initial_map]: 7251 // [prototype_or_initial_map]:
7267 DECL_ACCESSORS(prototype_or_initial_map, Object) 7252 DECL_ACCESSORS(prototype_or_initial_map, Object)
7268 7253
7269 // [shared]: The information about the function that 7254 // [shared]: The information about the function that
7270 // can be shared by instances. 7255 // can be shared by instances.
7271 DECL_ACCESSORS(shared, SharedFunctionInfo) 7256 DECL_ACCESSORS(shared, SharedFunctionInfo)
7272 7257
(...skipping 29 matching lines...) Expand all
7302 // recompilation. 7287 // recompilation.
7303 inline bool IsMarkedForOptimization(); 7288 inline bool IsMarkedForOptimization();
7304 inline bool IsMarkedForConcurrentOptimization(); 7289 inline bool IsMarkedForConcurrentOptimization();
7305 7290
7306 // Tells whether or not the function is on the concurrent recompilation queue. 7291 // Tells whether or not the function is on the concurrent recompilation queue.
7307 inline bool IsInOptimizationQueue(); 7292 inline bool IsInOptimizationQueue();
7308 7293
7309 // Completes inobject slack tracking on initial map if it is active. 7294 // Completes inobject slack tracking on initial map if it is active.
7310 inline void CompleteInobjectSlackTrackingIfActive(); 7295 inline void CompleteInobjectSlackTrackingIfActive();
7311 7296
7312 // [literals]: Fixed array holding the materialized literals. 7297 // [literals_or_bindings]: Fixed array holding either
7298 // the materialized literals or the bindings of a bound function.
7313 // 7299 //
7314 // If the function contains object, regexp or array literals, the 7300 // If the function contains object, regexp or array literals, the
7315 // literals array prefix contains the object, regexp, and array 7301 // literals array prefix contains the object, regexp, and array
7316 // function to be used when creating these literals. This is 7302 // function to be used when creating these literals. This is
7317 // necessary so that we do not dynamically lookup the object, regexp 7303 // necessary so that we do not dynamically lookup the object, regexp
7318 // or array functions. Performing a dynamic lookup, we might end up 7304 // or array functions. Performing a dynamic lookup, we might end up
7319 // using the functions from a new context that we should not have 7305 // using the functions from a new context that we should not have
7320 // access to. 7306 // access to.
7321 DECL_ACCESSORS(literals, LiteralsArray) 7307 //
7308 // On bound functions, the array is a (copy-on-write) fixed-array containing
7309 // the function that was bound, bound this-value and any bound
7310 // arguments. Bound functions never contain literals.
7311 DECL_ACCESSORS(literals_or_bindings, FixedArray)
7312
7313 inline LiteralsArray* literals();
7314 inline void set_literals(LiteralsArray* literals);
7315
7316 inline BindingsArray* function_bindings();
7317 inline void set_function_bindings(BindingsArray* bindings);
7322 7318
7323 // The initial map for an object created by this constructor. 7319 // The initial map for an object created by this constructor.
7324 inline Map* initial_map(); 7320 inline Map* initial_map();
7325 static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map, 7321 static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map,
7326 Handle<Object> prototype); 7322 Handle<Object> prototype);
7327 inline bool has_initial_map(); 7323 inline bool has_initial_map();
7328 static void EnsureHasInitialMap(Handle<JSFunction> function); 7324 static void EnsureHasInitialMap(Handle<JSFunction> function);
7329 7325
7330 // Creates a map that matches the constructor's initial map, but with 7326 // Creates a map that matches the constructor's initial map, but with
7331 // [[prototype]] being new.target.prototype. Because new.target can be a 7327 // [[prototype]] being new.target.prototype. Because new.target can be a
(...skipping 3388 matching lines...) Expand 10 before | Expand all | Expand 10 after
10720 } 10716 }
10721 return value; 10717 return value;
10722 } 10718 }
10723 }; 10719 };
10724 10720
10725 10721
10726 } // NOLINT, false-positive due to second-order macros. 10722 } // NOLINT, false-positive due to second-order macros.
10727 } // NOLINT, false-positive due to second-order macros. 10723 } // NOLINT, false-positive due to second-order macros.
10728 10724
10729 #endif // V8_OBJECTS_H_ 10725 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/mips64/macro-assembler-mips64.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698