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

Side by Side Diff: include/v8.h

Issue 10917211: Introduce new API to expose external string resource regardless of encoding. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 3 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') | no next file with comments »
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 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 V8EXPORT bool Value() const; 1011 V8EXPORT bool Value() const;
1012 static inline Handle<Boolean> New(bool value); 1012 static inline Handle<Boolean> New(bool value);
1013 }; 1013 };
1014 1014
1015 1015
1016 /** 1016 /**
1017 * A JavaScript string value (ECMA-262, 4.3.17). 1017 * A JavaScript string value (ECMA-262, 4.3.17).
1018 */ 1018 */
1019 class String : public Primitive { 1019 class String : public Primitive {
1020 public: 1020 public:
1021 enum Encoding {
1022 UNKNOWN_ENCODING = 0x1,
1023 TWO_BYTE_ENCODING = 0x0,
1024 ASCII_ENCODING = 0x4
1025 };
1021 /** 1026 /**
1022 * Returns the number of characters in this string. 1027 * Returns the number of characters in this string.
1023 */ 1028 */
1024 V8EXPORT int Length() const; 1029 V8EXPORT int Length() const;
1025 1030
1026 /** 1031 /**
1027 * Returns the number of bytes in the UTF-8 encoded 1032 * Returns the number of bytes in the UTF-8 encoded
1028 * representation of this string. 1033 * representation of this string.
1029 */ 1034 */
1030 V8EXPORT int Utf8Length() const; 1035 V8EXPORT int Utf8Length() const;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 virtual ~ExternalAsciiStringResource() {} 1179 virtual ~ExternalAsciiStringResource() {}
1175 /** The string data from the underlying buffer.*/ 1180 /** The string data from the underlying buffer.*/
1176 virtual const char* data() const = 0; 1181 virtual const char* data() const = 0;
1177 /** The number of ASCII characters in the string.*/ 1182 /** The number of ASCII characters in the string.*/
1178 virtual size_t length() const = 0; 1183 virtual size_t length() const = 0;
1179 protected: 1184 protected:
1180 ExternalAsciiStringResource() {} 1185 ExternalAsciiStringResource() {}
1181 }; 1186 };
1182 1187
1183 /** 1188 /**
1189 * If the string is an external string, return the ExternalStringResourceBase
1190 * regardless of the encoding, otherwise return NULL. The encoding of the
1191 * string is returned in type_out.
1192 */
1193 inline ExternalStringResourceBase* GetExternalStringResourceBase(
1194 Encoding* encoding_out) const;
1195
1196 /**
1184 * Get the ExternalStringResource for an external string. Returns 1197 * Get the ExternalStringResource for an external string. Returns
1185 * NULL if IsExternal() doesn't return true. 1198 * NULL if IsExternal() doesn't return true.
1186 */ 1199 */
1187 inline ExternalStringResource* GetExternalStringResource() const; 1200 inline ExternalStringResource* GetExternalStringResource() const;
1188 1201
1189 /** 1202 /**
1190 * Get the ExternalAsciiStringResource for an external ASCII string. 1203 * Get the ExternalAsciiStringResource for an external ASCII string.
1191 * Returns NULL if IsExternalAscii() doesn't return true. 1204 * Returns NULL if IsExternalAscii() doesn't return true.
1192 */ 1205 */
1193 V8EXPORT const ExternalAsciiStringResource* GetExternalAsciiStringResource() 1206 V8EXPORT const ExternalAsciiStringResource* GetExternalAsciiStringResource()
(...skipping 25 matching lines...) Expand all
1219 V8EXPORT static Local<String> Concat(Handle<String> left, 1232 V8EXPORT static Local<String> Concat(Handle<String> left,
1220 Handle<String> right); 1233 Handle<String> right);
1221 1234
1222 /** 1235 /**
1223 * Creates a new external string using the data defined in the given 1236 * Creates a new external string using the data defined in the given
1224 * resource. When the external string is no longer live on V8's heap the 1237 * resource. When the external string is no longer live on V8's heap the
1225 * resource will be disposed by calling its Dispose method. The caller of 1238 * resource will be disposed by calling its Dispose method. The caller of
1226 * this function should not otherwise delete or modify the resource. Neither 1239 * this function should not otherwise delete or modify the resource. Neither
1227 * should the underlying buffer be deallocated or modified except through the 1240 * should the underlying buffer be deallocated or modified except through the
1228 * destructor of the external string resource. 1241 * destructor of the external string resource.
1242 * The optional encoding argument provides a hint on whether scanning for
1243 * ASCII content is necessary.
drcarney 2012/09/12 11:27:09 Looks like this comment accidentally slipped in.
Yang 2012/09/12 11:28:50 Done.
1229 */ 1244 */
1230 V8EXPORT static Local<String> NewExternal(ExternalStringResource* resource); 1245 V8EXPORT static Local<String> NewExternal(ExternalStringResource* resource);
1231 1246
1232 /** 1247 /**
1233 * Associate an external string resource with this string by transforming it 1248 * Associate an external string resource with this string by transforming it
1234 * in place so that existing references to this string in the JavaScript heap 1249 * in place so that existing references to this string in the JavaScript heap
1235 * will use the external string resource. The external string resource's 1250 * will use the external string resource. The external string resource's
1236 * character contents need to be equivalent to this string. 1251 * character contents need to be equivalent to this string.
1237 * Returns true if the string has been changed to be an external string. 1252 * Returns true if the string has been changed to be an external string.
1238 * The string is not modified if the operation fails. See NewExternal for 1253 * The string is not modified if the operation fails. See NewExternal for
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 private: 1351 private:
1337 uint16_t* str_; 1352 uint16_t* str_;
1338 int length_; 1353 int length_;
1339 1354
1340 // Disallow copying and assigning. 1355 // Disallow copying and assigning.
1341 Value(const Value&); 1356 Value(const Value&);
1342 void operator=(const Value&); 1357 void operator=(const Value&);
1343 }; 1358 };
1344 1359
1345 private: 1360 private:
1361 V8EXPORT void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
1362 Encoding encoding_out) const;
1346 V8EXPORT void VerifyExternalStringResource(ExternalStringResource* val) const; 1363 V8EXPORT void VerifyExternalStringResource(ExternalStringResource* val) const;
1347 V8EXPORT static void CheckCast(v8::Value* obj); 1364 V8EXPORT static void CheckCast(v8::Value* obj);
1348 }; 1365 };
1349 1366
1350 1367
1351 /** 1368 /**
1352 * A JavaScript number value (ECMA-262, 4.3.20) 1369 * A JavaScript number value (ECMA-262, 4.3.20)
1353 */ 1370 */
1354 class Number : public Primitive { 1371 class Number : public Primitive {
1355 public: 1372 public:
(...skipping 2670 matching lines...) Expand 10 before | Expand all | Expand 10 after
4026 // These values match non-compiler-dependent values defined within 4043 // These values match non-compiler-dependent values defined within
4027 // the implementation of v8. 4044 // the implementation of v8.
4028 static const int kHeapObjectMapOffset = 0; 4045 static const int kHeapObjectMapOffset = 0;
4029 static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize; 4046 static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
4030 static const int kStringResourceOffset = 3 * kApiPointerSize; 4047 static const int kStringResourceOffset = 3 * kApiPointerSize;
4031 4048
4032 static const int kOddballKindOffset = 3 * kApiPointerSize; 4049 static const int kOddballKindOffset = 3 * kApiPointerSize;
4033 static const int kForeignAddressOffset = kApiPointerSize; 4050 static const int kForeignAddressOffset = kApiPointerSize;
4034 static const int kJSObjectHeaderSize = 3 * kApiPointerSize; 4051 static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
4035 static const int kFullStringRepresentationMask = 0x07; 4052 static const int kFullStringRepresentationMask = 0x07;
4053 static const int kStringEncodingMask = 0x4;
4036 static const int kExternalTwoByteRepresentationTag = 0x02; 4054 static const int kExternalTwoByteRepresentationTag = 0x02;
4055 static const int kExternalAsciiRepresentationTag = 0x06;
4037 4056
4038 static const int kIsolateStateOffset = 0; 4057 static const int kIsolateStateOffset = 0;
4039 static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; 4058 static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
4040 static const int kIsolateRootsOffset = 3 * kApiPointerSize; 4059 static const int kIsolateRootsOffset = 3 * kApiPointerSize;
4041 static const int kUndefinedValueRootIndex = 5; 4060 static const int kUndefinedValueRootIndex = 5;
4042 static const int kNullValueRootIndex = 7; 4061 static const int kNullValueRootIndex = 7;
4043 static const int kTrueValueRootIndex = 8; 4062 static const int kTrueValueRootIndex = 8;
4044 static const int kFalseValueRootIndex = 9; 4063 static const int kFalseValueRootIndex = 9;
4045 static const int kEmptySymbolRootIndex = 116; 4064 static const int kEmptySymbolRootIndex = 116;
4046 4065
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
4381 } else { 4400 } else {
4382 result = NULL; 4401 result = NULL;
4383 } 4402 }
4384 #ifdef V8_ENABLE_CHECKS 4403 #ifdef V8_ENABLE_CHECKS
4385 VerifyExternalStringResource(result); 4404 VerifyExternalStringResource(result);
4386 #endif 4405 #endif
4387 return result; 4406 return result;
4388 } 4407 }
4389 4408
4390 4409
4410 String::ExternalStringResourceBase* String::GetExternalStringResourceBase(
4411 String::Encoding* encoding_out) const {
4412 typedef internal::Object O;
4413 typedef internal::Internals I;
4414 O* obj = *reinterpret_cast<O**>(const_cast<String*>(this));
4415 int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
4416 *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
4417 ExternalStringResourceBase* resource = NULL;
4418 if (type == I::kExternalAsciiRepresentationTag ||
4419 type == I::kExternalTwoByteRepresentationTag) {
4420 void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
4421 resource = static_cast<ExternalStringResourceBase*>(value);
4422 }
4423 #ifdef V8_ENABLE_CHECKS
4424 VerifyExternalStringResourceBase(resource, *encoding_out);
4425 #endif
4426 return resource;
4427 }
4428
4429
4391 bool Value::IsUndefined() const { 4430 bool Value::IsUndefined() const {
4392 #ifdef V8_ENABLE_CHECKS 4431 #ifdef V8_ENABLE_CHECKS
4393 return FullIsUndefined(); 4432 return FullIsUndefined();
4394 #else 4433 #else
4395 return QuickIsUndefined(); 4434 return QuickIsUndefined();
4396 #endif 4435 #endif
4397 } 4436 }
4398 4437
4399 bool Value::QuickIsUndefined() const { 4438 bool Value::QuickIsUndefined() const {
4400 typedef internal::Object O; 4439 typedef internal::Object O;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
4610 4649
4611 4650
4612 } // namespace v8 4651 } // namespace v8
4613 4652
4614 4653
4615 #undef V8EXPORT 4654 #undef V8EXPORT
4616 #undef TYPE_CHECK 4655 #undef TYPE_CHECK
4617 4656
4618 4657
4619 #endif // V8_H_ 4658 #endif // V8_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698