1 // Copyright 2018 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_INTL_SUPPORT 6 #error Internationalization is expected to be enabled. 7 #endif // V8_INTL_SUPPORT 8 9 #ifndef V8_OBJECTS_JS_COLLATOR_H_ 10 #define V8_OBJECTS_JS_COLLATOR_H_ 11 12 #include "src/heap/factory.h" 13 #include "src/isolate.h" 14 #include "src/objects.h" 15 #include "src/objects/intl-objects.h" 16 #include "src/objects/managed.h" 17 18 // Has to be the last include (doesn't have include guards): 19 #include "src/objects/object-macros.h" 20 21 namespace v8 { 22 namespace internal { 23 24 class JSCollator : public JSObject { 25 public: 26 // ecma402/#sec-initializecollator 27 V8_WARN_UNUSED_RESULT static MaybeHandle<JSCollator> InitializeCollator( 28 Isolate* isolate, Handle<JSCollator> collator, Handle<Object> locales, 29 Handle<Object> options); 30 31 // ecma402/#sec-intl.collator.prototype.resolvedoptions 32 static Handle<JSObject> ResolvedOptions(Isolate* isolate, 33 Handle<JSCollator> collator); 34 35 DECL_CAST(JSCollator) 36 DECL_PRINTER(JSCollator) 37 DECL_VERIFIER(JSCollator) 38 39 // [[Usage]] is one of the values "sort" or "search", identifying 40 // the collator usage. 41 enum class Usage { 42 SORT, 43 SEARCH, 44 45 COUNT 46 }; 47 inline void set_usage(Usage usage); 48 inline Usage usage() const; 49 static const char* UsageToString(Usage usage); 50 51 // Layout description. 52 #define JS_COLLATOR_FIELDS(V) \ 53 V(kICUCollatorOffset, kPointerSize) \ 54 V(kFlagsOffset, kPointerSize) \ 55 V(kBoundCompareOffset, kPointerSize) \ 56 /* Total size. */ \ 57 V(kSize, 0) 58 59 DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize, JS_COLLATOR_FIELDS) 60 #undef JS_COLLATOR_FIELDS 61 62 // ContextSlot defines the context structure for the bound 63 // Collator.prototype.compare function. 64 enum ContextSlot { 65 // The collator instance that the function holding this context is bound to. 66 kCollator = Context::MIN_CONTEXT_SLOTS, 67 kLength 68 }; 69 70 // Bit positions in |flags|. 71 #define FLAGS_BIT_FIELDS(V, _) V(UsageBits, Usage, 1, _) 72 73 DEFINE_BIT_FIELDS(FLAGS_BIT_FIELDS) 74 #undef FLAGS_BIT_FIELDS 75 76 STATIC_ASSERT(Usage::SORT <= UsageBits::kMax); 77 STATIC_ASSERT(Usage::SEARCH <= UsageBits::kMax); 78 79 DECL_ACCESSORS(icu_collator, Managed<icu::Collator>) 80 DECL_ACCESSORS(bound_compare, Object); 81 DECL_INT_ACCESSORS(flags) 82 83 private: 84 DISALLOW_IMPLICIT_CONSTRUCTORS(JSCollator); 85 }; 86 87 } // namespace internal 88 } // namespace v8 89 90 #include "src/objects/object-macros-undef.h" 91 92 #endif // V8_OBJECTS_JS_COLLATOR_H_ 93