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

Side by Side Diff: include/v8.h

Issue 10857030: Add basic support for Latin1 to the API. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: removed MakeExternal(ExternalLatin1StringResource*) and added counters. Created 8 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 | « no previous file | src/api.cc » ('j') | src/heap-inl.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 * terminator. For WriteUtf8: The number of bytes copied to the buffer 1062 * terminator. For WriteUtf8: The number of bytes copied to the buffer
1063 * including the null terminator (if written). 1063 * including the null terminator (if written).
1064 */ 1064 */
1065 enum WriteOptions { 1065 enum WriteOptions {
1066 NO_OPTIONS = 0, 1066 NO_OPTIONS = 0,
1067 HINT_MANY_WRITES_EXPECTED = 1, 1067 HINT_MANY_WRITES_EXPECTED = 1,
1068 NO_NULL_TERMINATION = 2, 1068 NO_NULL_TERMINATION = 2,
1069 PRESERVE_ASCII_NULL = 4 1069 PRESERVE_ASCII_NULL = 4
1070 }; 1070 };
1071 1071
1072 // 16-bit character codes. 1072
1073 enum StringEncoding {
1074 INVALID_ENCODING = 0,
1075 UTF8_ENCODING = 1,
Erik Corry 2012/08/21 12:21:34 The names are not UTF8 or UTF16, but rather UTF-8
Yang 2012/08/21 13:06:20 Done.
1076 LATIN1_ENCODING = 2,
1077 UTF16_ENCODING = 3,
1078
1079 STRICT_ASCII_HINT = 1 << 16,
Erik Corry 2012/08/21 12:21:34 I think STRICT_ASCII_HINT should just be called AS
Yang 2012/08/21 13:06:20 Done.
1080 NOT_ASCII_HINT = 1 << 17
1081 };
1082
1083 static const int kStringEncodingMask = 3;
1084 static const int kAsciiHintMask =
1085 String::STRICT_ASCII_HINT | String::NOT_ASCII_HINT;
1086
1087 static const int kUndefinedLength = -1;
1088
1089
1090 // 16-bit UTF16 code units.
1073 V8EXPORT int Write(uint16_t* buffer, 1091 V8EXPORT int Write(uint16_t* buffer,
1074 int start = 0, 1092 int start = 0,
1075 int length = -1, 1093 int length = kUndefinedLength,
1076 int options = NO_OPTIONS) const; 1094 int options = NO_OPTIONS) const;
1077 // ASCII characters. 1095 // ASCII characters.
1078 V8EXPORT int WriteAscii(char* buffer, 1096 V8EXPORT int WriteAscii(char* buffer,
1079 int start = 0, 1097 int start = 0,
1080 int length = -1, 1098 int length = kUndefinedLength,
1081 int options = NO_OPTIONS) const; 1099 int options = NO_OPTIONS) const;
1100 // Latin1 characters.
Erik Corry 2012/08/21 12:21:34 This one doesn't support PRESERVE_ASCII_NULL, or r
Yang 2012/08/21 13:06:20 Done.
1101 V8EXPORT int WriteLatin1(char* buffer,
1102 int start = 0,
1103 int length = kUndefinedLength,
1104 int options = NO_OPTIONS) const;
1105
1082 // UTF-8 encoded characters. 1106 // UTF-8 encoded characters.
1083 V8EXPORT int WriteUtf8(char* buffer, 1107 V8EXPORT int WriteUtf8(char* buffer,
1084 int length = -1, 1108 int length = kUndefinedLength,
1085 int* nchars_ref = NULL, 1109 int* nchars_ref = NULL,
1086 int options = NO_OPTIONS) const; 1110 int options = NO_OPTIONS) const;
1087 1111
1088 /** 1112 /**
1089 * A zero length string. 1113 * A zero length string.
1090 */ 1114 */
1091 V8EXPORT static v8::Local<v8::String> Empty(); 1115 V8EXPORT static v8::Local<v8::String> Empty();
1092 inline static v8::Local<v8::String> Empty(Isolate* isolate); 1116 inline static v8::Local<v8::String> Empty(Isolate* isolate);
1093 1117
1094 /** 1118 /**
(...skipping 20 matching lines...) Expand all
1115 * control how allocated external string resources are disposed. 1139 * control how allocated external string resources are disposed.
1116 */ 1140 */
1117 virtual void Dispose() { delete this; } 1141 virtual void Dispose() { delete this; }
1118 1142
1119 private: 1143 private:
1120 // Disallow copying and assigning. 1144 // Disallow copying and assigning.
1121 ExternalStringResourceBase(const ExternalStringResourceBase&); 1145 ExternalStringResourceBase(const ExternalStringResourceBase&);
1122 void operator=(const ExternalStringResourceBase&); 1146 void operator=(const ExternalStringResourceBase&);
1123 1147
1124 friend class v8::internal::Heap; 1148 friend class v8::internal::Heap;
1149 friend class v8::String;
1125 }; 1150 };
1126 1151
1127 /** 1152 /**
1128 * An ExternalStringResource is a wrapper around a two-byte string 1153 * An ExternalStringResource is a wrapper around a two-byte string
1129 * buffer that resides outside V8's heap. Implement an 1154 * buffer that resides outside V8's heap. Implement an
1130 * ExternalStringResource to manage the life cycle of the underlying 1155 * ExternalStringResource to manage the life cycle of the underlying
1131 * buffer. Note that the string data must be immutable. 1156 * buffer. Note that the string data must be immutable.
1132 */ 1157 */
1133 class V8EXPORT ExternalStringResource 1158 class V8EXPORT ExternalStringResource
1134 : public ExternalStringResourceBase { 1159 : public ExternalStringResourceBase {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 virtual ~ExternalAsciiStringResource() {} 1199 virtual ~ExternalAsciiStringResource() {}
1175 /** The string data from the underlying buffer.*/ 1200 /** The string data from the underlying buffer.*/
1176 virtual const char* data() const = 0; 1201 virtual const char* data() const = 0;
1177 /** The number of ASCII characters in the string.*/ 1202 /** The number of ASCII characters in the string.*/
1178 virtual size_t length() const = 0; 1203 virtual size_t length() const = 0;
1179 protected: 1204 protected:
1180 ExternalAsciiStringResource() {} 1205 ExternalAsciiStringResource() {}
1181 }; 1206 };
1182 1207
1183 /** 1208 /**
1209 * An ExternalLatin1StringResource is a wrapper around an Latin1-encoded
1210 * string buffer that resides outside V8's heap. For usage in V8, Latin1
1211 * strings are converted to ASCII or two-byte string depending on whether
Erik Corry 2012/08/21 12:21:34 string -> strings,
Yang 2012/08/21 13:06:20 Done.
1212 * the string contains non-ASCII characters.
1213 */
1214 class V8EXPORT ExternalLatin1StringResource
1215 : public ExternalAsciiStringResource {
1216 };
1217
1218 /**
1184 * Get the ExternalStringResource for an external string. Returns 1219 * Get the ExternalStringResource for an external string. Returns
1185 * NULL if IsExternal() doesn't return true. 1220 * NULL if IsExternal() doesn't return true.
1186 */ 1221 */
1187 inline ExternalStringResource* GetExternalStringResource() const; 1222 inline ExternalStringResource* GetExternalStringResource() const;
1188 1223
1189 /** 1224 /**
1190 * Get the ExternalAsciiStringResource for an external ASCII string. 1225 * Get the ExternalAsciiStringResource for an external ASCII string.
1191 * Returns NULL if IsExternalAscii() doesn't return true. 1226 * Returns NULL if IsExternalAscii() doesn't return true.
1192 */ 1227 */
1193 V8EXPORT const ExternalAsciiStringResource* GetExternalAsciiStringResource() 1228 V8EXPORT const ExternalAsciiStringResource* GetExternalAsciiStringResource()
1194 const; 1229 const;
1195 1230
1231 /**
1232 * If the string is external, return the its encoding (Latin1 or UTF16)
Erik Corry 2012/08/21 12:21:34 the its -> its
Yang 2012/08/21 13:06:20 Done.
1233 * and possibly a hint on whether the content is ASCII.
1234 * Return String::INVALID_ENCODING otherwise.
1235 */
1236 inline int GetExternalStringEncoding() const;
1237
1238
1239 /**
1240 * Return the resource of the external string regardless of encoding.
1241 * Call this only after having made sure that the string is indeed external!
1242 */
1243 inline ExternalStringResourceBase* GetExternalStringResourceBase() const;
1244
1196 static inline String* Cast(v8::Value* obj); 1245 static inline String* Cast(v8::Value* obj);
1197 1246
1198 /** 1247 /**
1199 * Allocates a new string from either UTF-8 encoded or ASCII data. 1248 * Allocates a new string from either UTF-8-, Latin1-encoded data.
Erik Corry 2012/08/21 12:21:34 "-," should be "or "
Yang 2012/08/21 13:06:20 Done.
1200 * The second parameter 'length' gives the buffer length. 1249 * The second parameter 'length' gives the buffer length. If the data is
Erik Corry 2012/08/21 12:21:34 is UTF-8 encoded -> may contain zero bytes
Yang 2012/08/21 13:06:20 Done.
1201 * If the data is UTF-8 encoded, the caller must 1250 * UTF-8 encoded, the caller must be careful to supply the length parameter.
1202 * be careful to supply the length parameter. 1251 * If it is not given, the function calls 'strlen' to determine the buffer
1203 * If it is not given, the function calls 1252 * length, it might be wrong if 'data' contains a null character.
1204 * 'strlen' to determine the buffer length, it might be 1253 * The third parameter specifies the encoding, which may include an hint
1205 * wrong if 'data' contains a null character. 1254 * whether the string contains ASCII characters. In case of Latin1, the
Erik Corry 2012/08/21 12:21:34 In case of -> In the case of
Yang 2012/08/21 13:06:20 Done.
1255 * appropriate internal representation (UTF16 or ASCII) is chosen.
1206 */ 1256 */
1207 V8EXPORT static Local<String> New(const char* data, int length = -1); 1257 V8EXPORT static Local<String> New(const char* data,
1258 int length = kUndefinedLength,
1259 int encoding = UTF8_ENCODING);
Erik Corry 2012/08/21 12:21:34 Surely this should be a StringEncoding and not an
Yang 2012/08/21 13:06:20 The encoding here may additionally contain NOT_ASC
1208 1260
1209 /** Allocates a new string from 16-bit character codes.*/ 1261 /** Allocates a new string from 16-bit UTF16 code units.*/
1210 V8EXPORT static Local<String> New(const uint16_t* data, int length = -1); 1262 V8EXPORT static Local<String> New(const uint16_t* data,
1263 int length = kUndefinedLength);
1211 1264
1212 /** Creates a symbol. Returns one if it exists already.*/ 1265 /** Creates a symbol. Returns one if it exists already.*/
1213 V8EXPORT static Local<String> NewSymbol(const char* data, int length = -1); 1266 V8EXPORT static Local<String> NewSymbol(const char* data,
1267 int length = kUndefinedLength,
1268 int encoding = UTF8_ENCODING);
1214 1269
1215 /** 1270 /**
1216 * Creates a new string by concatenating the left and the right strings 1271 * Creates a new string by concatenating the left and the right strings
1217 * passed in as parameters. 1272 * passed in as parameters.
1218 */ 1273 */
1219 V8EXPORT static Local<String> Concat(Handle<String> left, 1274 V8EXPORT static Local<String> Concat(Handle<String> left,
1220 Handle<String> right); 1275 Handle<String> right);
1221 1276
1222 /** 1277 /**
1223 * Creates a new external string using the data defined in the given 1278 * Creates a new external string using the data defined in the given
(...skipping 16 matching lines...) Expand all
1240 */ 1295 */
1241 V8EXPORT bool MakeExternal(ExternalStringResource* resource); 1296 V8EXPORT bool MakeExternal(ExternalStringResource* resource);
1242 1297
1243 /** 1298 /**
1244 * Creates a new external string using the ASCII data defined in the given 1299 * Creates a new external string using the ASCII data defined in the given
1245 * resource. When the external string is no longer live on V8's heap the 1300 * resource. When the external string is no longer live on V8's heap the
1246 * resource will be disposed by calling its Dispose method. The caller of 1301 * resource will be disposed by calling its Dispose method. The caller of
1247 * this function should not otherwise delete or modify the resource. Neither 1302 * this function should not otherwise delete or modify the resource. Neither
1248 * should the underlying buffer be deallocated or modified except through the 1303 * should the underlying buffer be deallocated or modified except through the
1249 * destructor of the external string resource. 1304 * destructor of the external string resource.
1250 */ V8EXPORT static Local<String> NewExternal( 1305 */
1306 V8EXPORT static Local<String> NewExternal(
1251 ExternalAsciiStringResource* resource); 1307 ExternalAsciiStringResource* resource);
1252 1308
1253 /** 1309 /**
1254 * Associate an external string resource with this string by transforming it 1310 * Associate an external string resource with this string by transforming it
1255 * in place so that existing references to this string in the JavaScript heap 1311 * in place so that existing references to this string in the JavaScript heap
1256 * will use the external string resource. The external string resource's 1312 * will use the external string resource. The external string resource's
1257 * character contents need to be equivalent to this string. 1313 * character contents need to be equivalent to this string.
1258 * Returns true if the string has been changed to be an external string. 1314 * Returns true if the string has been changed to be an external string.
1259 * The string is not modified if the operation fails. See NewExternal for 1315 * The string is not modified if the operation fails. See NewExternal for
1260 * information on the lifetime of the resource. 1316 * information on the lifetime of the resource.
1261 */ 1317 */
1262 V8EXPORT bool MakeExternal(ExternalAsciiStringResource* resource); 1318 V8EXPORT bool MakeExternal(ExternalAsciiStringResource* resource);
1263 1319
1320
1321 /**
1322 * Creates a new external string using the Latin1-encoded data defined in the
1323 * given resource. When the external string is no longer live on V8's heap
1324 * the resource will be disposed by calling its Dispose method. The caller of
1325 * this function should not otherwise delete or modify the resource. Neither
1326 * should the underlying buffer be deallocated or modified except through the
1327 * destructor of the external string resource.
1328 * If the data contains non-ASCII character, the string is created as new
Erik Corry 2012/08/21 12:21:34 contains -> contains a as new -> as a new
Yang 2012/08/21 13:06:20 Done.
1329 * string object on the V8 heap and the Dispose method is called on the
1330 * resource immediately. This is because V8 is currently unable to handle
Erik Corry 2012/08/21 12:21:34 is currently unable -> is unable
Yang 2012/08/21 13:06:20 Done.
1331 * non-ASCII Latin1-encoded strings internally.
1332 */
1333 V8EXPORT static Local<String> NewExternal(
1334 ExternalLatin1StringResource* resource,
1335 int encoding = String::LATIN1_ENCODING);
1336
1337
1264 /** 1338 /**
1265 * Returns true if this string can be made external. 1339 * Returns true if this string can be made external.
1266 */ 1340 */
1267 V8EXPORT bool CanMakeExternal(); 1341 V8EXPORT bool CanMakeExternal();
1268 1342
1269 /** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/ 1343 /** Creates an undetectable string from the supplied ASCII or UTF-8 data.*/
1270 V8EXPORT static Local<String> NewUndetectable(const char* data, 1344 V8EXPORT static Local<String> NewUndetectable(const char* data,
1271 int length = -1); 1345 int length = kUndefinedLength,
1346 int encoding = UTF8_ENCODING);
1272 1347
1273 /** Creates an undetectable string from the supplied 16-bit character codes.*/ 1348 /** Creates an undetectable string from the supplied 16-bit UTF16 code units.
1349 */
1274 V8EXPORT static Local<String> NewUndetectable(const uint16_t* data, 1350 V8EXPORT static Local<String> NewUndetectable(const uint16_t* data,
1275 int length = -1); 1351 int length = kUndefinedLength);
1276 1352
1277 /** 1353 /**
1278 * Converts an object to a UTF-8-encoded character array. Useful if 1354 * Converts an object to a UTF-8-encoded character array. Useful if
1279 * you want to print the object. If conversion to a string fails 1355 * you want to print the object. If conversion to a string fails
1280 * (e.g. due to an exception in the toString() method of the object) 1356 * (e.g. due to an exception in the toString() method of the object)
1281 * then the length() method returns 0 and the * operator returns 1357 * then the length() method returns 0 and the * operator returns
1282 * NULL. 1358 * NULL.
1283 */ 1359 */
1284 class V8EXPORT Utf8Value { 1360 class V8EXPORT Utf8Value {
1285 public: 1361 public:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 private: 1412 private:
1337 uint16_t* str_; 1413 uint16_t* str_;
1338 int length_; 1414 int length_;
1339 1415
1340 // Disallow copying and assigning. 1416 // Disallow copying and assigning.
1341 Value(const Value&); 1417 Value(const Value&);
1342 void operator=(const Value&); 1418 void operator=(const Value&);
1343 }; 1419 };
1344 1420
1345 private: 1421 private:
1346 V8EXPORT void VerifyExternalStringResource(ExternalStringResource* val) const; 1422 V8EXPORT void VerifyExternalStringEncoding(int encoding) const;
1423 V8EXPORT void VerifyExternalStringResourceBase(
1424 ExternalStringResourceBase* val) const;
1347 V8EXPORT static void CheckCast(v8::Value* obj); 1425 V8EXPORT static void CheckCast(v8::Value* obj);
1348 }; 1426 };
1349 1427
1350 1428
1351 /** 1429 /**
1352 * A JavaScript number value (ECMA-262, 4.3.20) 1430 * A JavaScript number value (ECMA-262, 4.3.20)
1353 */ 1431 */
1354 class Number : public Primitive { 1432 class Number : public Primitive {
1355 public: 1433 public:
1356 V8EXPORT double Value() const; 1434 V8EXPORT double Value() const;
(...skipping 2596 matching lines...) Expand 10 before | Expand all | Expand 10 after
3953 // the implementation of v8. 4031 // the implementation of v8.
3954 static const int kHeapObjectMapOffset = 0; 4032 static const int kHeapObjectMapOffset = 0;
3955 static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize; 4033 static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
3956 static const int kStringResourceOffset = 3 * kApiPointerSize; 4034 static const int kStringResourceOffset = 3 * kApiPointerSize;
3957 4035
3958 static const int kOddballKindOffset = 3 * kApiPointerSize; 4036 static const int kOddballKindOffset = 3 * kApiPointerSize;
3959 static const int kForeignAddressOffset = kApiPointerSize; 4037 static const int kForeignAddressOffset = kApiPointerSize;
3960 static const int kJSObjectHeaderSize = 3 * kApiPointerSize; 4038 static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
3961 static const int kFullStringRepresentationMask = 0x07; 4039 static const int kFullStringRepresentationMask = 0x07;
3962 static const int kExternalTwoByteRepresentationTag = 0x02; 4040 static const int kExternalTwoByteRepresentationTag = 0x02;
4041 static const int kExternalAsciiRepresentationTag = 0x06;
4042 static const int kExternalAsciiDataHintMask = 0x08;
4043 static const int kExternalAsciiDataHintTag = 0x08;
3963 4044
3964 static const int kIsolateStateOffset = 0; 4045 static const int kIsolateStateOffset = 0;
3965 static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; 4046 static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
3966 static const int kIsolateRootsOffset = 3 * kApiPointerSize; 4047 static const int kIsolateRootsOffset = 3 * kApiPointerSize;
3967 static const int kUndefinedValueRootIndex = 5; 4048 static const int kUndefinedValueRootIndex = 5;
3968 static const int kNullValueRootIndex = 7; 4049 static const int kNullValueRootIndex = 7;
3969 static const int kTrueValueRootIndex = 8; 4050 static const int kTrueValueRootIndex = 8;
3970 static const int kFalseValueRootIndex = 9; 4051 static const int kFalseValueRootIndex = 9;
3971 static const int kEmptySymbolRootIndex = 112; 4052 static const int kEmptySymbolRootIndex = 112;
3972 4053
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4010 static inline void* GetExternalPointer(internal::Object* obj) { 4091 static inline void* GetExternalPointer(internal::Object* obj) {
4011 if (HasSmiTag(obj)) { 4092 if (HasSmiTag(obj)) {
4012 return GetExternalPointerFromSmi(obj); 4093 return GetExternalPointerFromSmi(obj);
4013 } else if (GetInstanceType(obj) == kForeignType) { 4094 } else if (GetInstanceType(obj) == kForeignType) {
4014 return ReadField<void*>(obj, kForeignAddressOffset); 4095 return ReadField<void*>(obj, kForeignAddressOffset);
4015 } else { 4096 } else {
4016 return NULL; 4097 return NULL;
4017 } 4098 }
4018 } 4099 }
4019 4100
4020 static inline bool IsExternalTwoByteString(int instance_type) {
4021 int representation = (instance_type & kFullStringRepresentationMask);
4022 return representation == kExternalTwoByteRepresentationTag;
4023 }
4024
4025 static inline bool IsInitialized(v8::Isolate* isolate) { 4101 static inline bool IsInitialized(v8::Isolate* isolate) {
4026 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateStateOffset; 4102 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateStateOffset;
4027 return *reinterpret_cast<int*>(addr) == 1; 4103 return *reinterpret_cast<int*>(addr) == 1;
4028 } 4104 }
4029 4105
4030 static inline void SetEmbedderData(v8::Isolate* isolate, void* data) { 4106 static inline void SetEmbedderData(v8::Isolate* isolate, void* data) {
4031 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + 4107 uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
4032 kIsolateEmbedderDataOffset; 4108 kIsolateEmbedderDataOffset;
4033 *reinterpret_cast<void**>(addr) = data; 4109 *reinterpret_cast<void**>(addr) = data;
4034 } 4110 }
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
4292 typedef internal::Internals I; 4368 typedef internal::Internals I;
4293 if (!I::IsInitialized(isolate)) return Empty(); 4369 if (!I::IsInitialized(isolate)) return Empty();
4294 S* slot = I::GetRoot(isolate, I::kEmptySymbolRootIndex); 4370 S* slot = I::GetRoot(isolate, I::kEmptySymbolRootIndex);
4295 return Local<String>(reinterpret_cast<String*>(slot)); 4371 return Local<String>(reinterpret_cast<String*>(slot));
4296 } 4372 }
4297 4373
4298 4374
4299 String::ExternalStringResource* String::GetExternalStringResource() const { 4375 String::ExternalStringResource* String::GetExternalStringResource() const {
4300 typedef internal::Object O; 4376 typedef internal::Object O;
4301 typedef internal::Internals I; 4377 typedef internal::Internals I;
4378 String::ExternalStringResource* result = NULL;
4302 O* obj = *reinterpret_cast<O**>(const_cast<String*>(this)); 4379 O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
4303 String::ExternalStringResource* result; 4380 if ((I::GetInstanceType(obj) & I::kFullStringRepresentationMask) ==
4304 if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) { 4381 I::kExternalTwoByteRepresentationTag) {
4305 void* value = I::ReadField<void*>(obj, I::kStringResourceOffset); 4382 result = reinterpret_cast<String::ExternalStringResource*>(
4306 result = reinterpret_cast<String::ExternalStringResource*>(value); 4383 GetExternalStringResourceBase());
4307 } else { 4384 }
4308 result = NULL; 4385 return result;
4386 }
4387
4388
4389 int String::GetExternalStringEncoding() const {
4390 typedef internal::Object O;
4391 typedef internal::Internals I;
4392 O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
4393 static const int kRepresentationAndHintMask =
4394 I::kFullStringRepresentationMask | I::kExternalAsciiDataHintMask;
4395
4396 int encoding;
4397 switch (I::GetInstanceType(obj) & kRepresentationAndHintMask) {
4398 case I::kExternalTwoByteRepresentationTag | I::kExternalAsciiDataHintTag:
4399 encoding = UTF16_ENCODING | STRICT_ASCII_HINT;
4400 break;
4401 case I::kExternalTwoByteRepresentationTag:
4402 encoding = UTF16_ENCODING | NOT_ASCII_HINT;
4403 break;
4404 case I::kExternalAsciiRepresentationTag:
4405 encoding = LATIN1_ENCODING | STRICT_ASCII_HINT;
4406 break;
4407 default:
4408 encoding = INVALID_ENCODING;
4409 break;
4309 } 4410 }
4310 #ifdef V8_ENABLE_CHECKS 4411 #ifdef V8_ENABLE_CHECKS
4311 VerifyExternalStringResource(result); 4412 VerifyExternalStringEncoding(encoding);
4413 #endif
4414 return encoding;
4415 }
4416
4417
4418 String::ExternalStringResourceBase* String::GetExternalStringResourceBase()
4419 const {
4420 typedef internal::Object O;
4421 typedef internal::Internals I;
4422 O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
4423 void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
4424 ExternalStringResourceBase* result =
4425 reinterpret_cast<String::ExternalStringResourceBase*>(value);
4426 #ifdef V8_ENABLE_CHECKS
4427 VerifyExternalStringResourceBase(result);
4312 #endif 4428 #endif
4313 return result; 4429 return result;
4314 } 4430 }
4315 4431
4316 4432
4317 bool Value::IsUndefined() const { 4433 bool Value::IsUndefined() const {
4318 #ifdef V8_ENABLE_CHECKS 4434 #ifdef V8_ENABLE_CHECKS
4319 return FullIsUndefined(); 4435 return FullIsUndefined();
4320 #else 4436 #else
4321 return QuickIsUndefined(); 4437 return QuickIsUndefined();
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
4536 4652
4537 4653
4538 } // namespace v8 4654 } // namespace v8
4539 4655
4540 4656
4541 #undef V8EXPORT 4657 #undef V8EXPORT
4542 #undef TYPE_CHECK 4658 #undef TYPE_CHECK
4543 4659
4544 4660
4545 #endif // V8_H_ 4661 #endif // V8_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.cc » ('j') | src/heap-inl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698