Changeset 65305 in webkit for trunk/JavaScriptCore
- Timestamp:
- Aug 13, 2010, 12:35:45 AM (15 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r65303 r65305 1 2010-08-13 Gavin Barraclough <[email protected]> 2 3 Reviewed by Sam Weinig 4 5 Unify UString::UTF8String() & String::utf8() methods, 6 remove UString::cost() & make atArrayIndex a free function. 7 8 * JavaScriptCore.exp: 9 * bytecode/CodeBlock.cpp: 10 (JSC::constantName): 11 (JSC::idName): 12 (JSC::CodeBlock::registerName): 13 (JSC::regexpName): 14 (JSC::printGlobalResolveInfo): 15 (JSC::printStructureStubInfo): 16 (JSC::CodeBlock::printStructure): 17 (JSC::CodeBlock::printStructures): 18 * jsc.cpp: 19 (functionPrint): 20 (functionDebug): 21 (runInteractive): 22 (fillBufferWithContentsOfFile): 23 * pcre/pcre_exec.cpp: 24 (Histogram::~Histogram): 25 * profiler/CallIdentifier.h: 26 (JSC::CallIdentifier::c_str): 27 * profiler/Profile.cpp: 28 (JSC::Profile::debugPrintDataSampleStyle): 29 * profiler/ProfileGenerator.cpp: 30 (JSC::ProfileGenerator::willExecute): 31 (JSC::ProfileGenerator::didExecute): 32 * profiler/ProfileNode.cpp: 33 (JSC::ProfileNode::debugPrintData): 34 (JSC::ProfileNode::debugPrintDataSampleStyle): 35 * runtime/Arguments.cpp: 36 (JSC::Arguments::getOwnPropertySlot): 37 (JSC::Arguments::getOwnPropertyDescriptor): 38 (JSC::Arguments::put): 39 (JSC::Arguments::deleteProperty): 40 * runtime/DateConversion.cpp: 41 (JSC::parseDate): 42 * runtime/Identifier.h: 43 (JSC::Identifier::toStrictUInt32): 44 * runtime/JSArray.cpp: 45 (JSC::JSArray::getOwnPropertySlot): 46 (JSC::JSArray::getOwnPropertyDescriptor): 47 (JSC::JSArray::put): 48 (JSC::JSArray::deleteProperty): 49 * runtime/JSArray.h: 50 (JSC::toArrayIndex): 51 * runtime/JSGlobalObjectFunctions.cpp: 52 (JSC::encode): 53 (JSC::parseInt): 54 (JSC::globalFuncJSCPrint): 55 * runtime/JSString.h: 56 (JSC::RopeBuilder::JSString): 57 * runtime/UString.cpp: 58 (JSC::UString::toDouble): 59 (JSC::putUTF8Triple): 60 (JSC::UString::utf8): 61 * runtime/UString.h: 62 (JSC::UString::~UString): 63 (JSC::UString::isNull): 64 (JSC::UString::isEmpty): 65 (JSC::UString::impl): 66 * wtf/text/WTFString.cpp: 67 (WTF::String::utf8): 68 * wtf/text/WTFString.h: 69 (WTF::String::~String): 70 (WTF::String::swap): 71 (WTF::String::isNull): 72 (WTF::String::isEmpty): 73 (WTF::String::impl): 74 (WTF::String::length): 75 (WTF::String::String): 76 (WTF::String::isHashTableDeletedValue): 77 1 78 2010-08-12 Zoltan Herczeg <[email protected]> 2 79 -
trunk/JavaScriptCore/JavaScriptCore.exp
r65302 r65305 514 514 __ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE 515 515 __ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE 516 __ZNK3JSC7UString10UTF8StringEb517 516 __ZNK3JSC7UString14toStrictUInt32EPb 517 __ZNK3JSC7UString4utf8Eb 518 518 __ZNK3JSC7UString5asciiEv 519 519 __ZNK3JSC7UString6substrEjj … … 541 541 __ZNK3WTF6String18simplifyWhiteSpaceEv 542 542 __ZNK3WTF6String19characterStartingAtEj 543 __ZNK3WTF6String4utf8E v543 __ZNK3WTF6String4utf8Eb 544 544 __ZNK3WTF6String5asciiEv 545 545 __ZNK3WTF6String5lowerEv -
trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r65207 r65305 2327 2327 buildConfigurationList = 149C277108902AFE008A9EFC /* Build configuration list for PBXProject "JavaScriptCore" */; 2328 2328 compatibilityVersion = "Xcode 2.4"; 2329 developmentRegion = English;2330 2329 hasScannedForEncodings = 1; 2331 2330 knownRegions = ( -
trunk/JavaScriptCore/bytecode/CodeBlock.cpp
r65302 r65305 72 72 static CString constantName(ExecState* exec, int k, JSValue value) 73 73 { 74 return makeString(valueToSourceString(exec, value), "(@k", UString::number(k - FirstConstantRegisterIndex), ")"). UTF8String();74 return makeString(valueToSourceString(exec, value), "(@k", UString::number(k - FirstConstantRegisterIndex), ")").utf8(); 75 75 } 76 76 77 77 static CString idName(int id0, const Identifier& ident) 78 78 { 79 return makeString(ident.ustring(), "(@id", UString::number(id0), ")"). UTF8String();79 return makeString(ident.ustring(), "(@id", UString::number(id0), ")").utf8(); 80 80 } 81 81 … … 88 88 return constantName(exec, r, getConstant(r)); 89 89 90 return makeString("r", UString::number(r)). UTF8String();90 return makeString("r", UString::number(r)).utf8(); 91 91 } 92 92 … … 107 107 static CString regexpName(int re, RegExp* regexp) 108 108 { 109 return makeString(regexpToSourceString(regexp), "(@re", UString::number(re), ")"). UTF8String();109 return makeString(regexpToSourceString(regexp), "(@re", UString::number(re), ")").utf8(); 110 110 } 111 111 … … 225 225 static void printGlobalResolveInfo(const GlobalResolveInfo& resolveInfo, unsigned instructionOffset) 226 226 { 227 printf(" [%4d] %s: %s\n", instructionOffset, "resolve_global", pointerToSourceString(resolveInfo.structure). UTF8String().data());227 printf(" [%4d] %s: %s\n", instructionOffset, "resolve_global", pointerToSourceString(resolveInfo.structure).utf8().data()); 228 228 } 229 229 … … 232 232 switch (stubInfo.accessType) { 233 233 case access_get_by_id_self: 234 printf(" [%4d] %s: %s\n", instructionOffset, "get_by_id_self", pointerToSourceString(stubInfo.u.getByIdSelf.baseObjectStructure). UTF8String().data());234 printf(" [%4d] %s: %s\n", instructionOffset, "get_by_id_self", pointerToSourceString(stubInfo.u.getByIdSelf.baseObjectStructure).utf8().data()); 235 235 return; 236 236 case access_get_by_id_proto: 237 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(stubInfo.u.getByIdProto.baseObjectStructure). UTF8String().data(), pointerToSourceString(stubInfo.u.getByIdProto.prototypeStructure).UTF8String().data());237 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(stubInfo.u.getByIdProto.baseObjectStructure).utf8().data(), pointerToSourceString(stubInfo.u.getByIdProto.prototypeStructure).utf8().data()); 238 238 return; 239 239 case access_get_by_id_chain: 240 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(stubInfo.u.getByIdChain.baseObjectStructure). UTF8String().data(), pointerToSourceString(stubInfo.u.getByIdChain.chain).UTF8String().data());240 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(stubInfo.u.getByIdChain.baseObjectStructure).utf8().data(), pointerToSourceString(stubInfo.u.getByIdChain.chain).utf8().data()); 241 241 return; 242 242 case access_get_by_id_self_list: 243 printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_self_list", pointerToSourceString(stubInfo.u.getByIdSelfList.structureList). UTF8String().data(), stubInfo.u.getByIdSelfList.listSize);243 printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_self_list", pointerToSourceString(stubInfo.u.getByIdSelfList.structureList).utf8().data(), stubInfo.u.getByIdSelfList.listSize); 244 244 return; 245 245 case access_get_by_id_proto_list: 246 printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_proto_list", pointerToSourceString(stubInfo.u.getByIdProtoList.structureList). UTF8String().data(), stubInfo.u.getByIdProtoList.listSize);246 printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_proto_list", pointerToSourceString(stubInfo.u.getByIdProtoList.structureList).utf8().data(), stubInfo.u.getByIdProtoList.listSize); 247 247 return; 248 248 case access_put_by_id_transition: 249 printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(stubInfo.u.putByIdTransition.previousStructure). UTF8String().data(), pointerToSourceString(stubInfo.u.putByIdTransition.structure).UTF8String().data(), pointerToSourceString(stubInfo.u.putByIdTransition.chain).UTF8String().data());249 printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(stubInfo.u.putByIdTransition.previousStructure).utf8().data(), pointerToSourceString(stubInfo.u.putByIdTransition.structure).utf8().data(), pointerToSourceString(stubInfo.u.putByIdTransition.chain).utf8().data()); 250 250 return; 251 251 case access_put_by_id_replace: 252 printf(" [%4d] %s: %s\n", instructionOffset, "put_by_id_replace", pointerToSourceString(stubInfo.u.putByIdReplace.baseObjectStructure). UTF8String().data());252 printf(" [%4d] %s: %s\n", instructionOffset, "put_by_id_replace", pointerToSourceString(stubInfo.u.putByIdReplace.baseObjectStructure).utf8().data()); 253 253 return; 254 254 case access_get_by_id: … … 279 279 { 280 280 unsigned instructionOffset = vPC - m_instructions.begin(); 281 printf(" [%4d] %s: %s\n", instructionOffset, name, pointerToSourceString(vPC[operand].u.structure). UTF8String().data());281 printf(" [%4d] %s: %s\n", instructionOffset, name, pointerToSourceString(vPC[operand].u.structure).utf8().data()); 282 282 } 283 283 … … 296 296 } 297 297 if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto)) { 298 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(vPC[4].u.structure). UTF8String().data(), pointerToSourceString(vPC[5].u.structure).UTF8String().data());298 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data()); 299 299 return; 300 300 } 301 301 if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition)) { 302 printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(vPC[4].u.structure). UTF8String().data(), pointerToSourceString(vPC[5].u.structure).UTF8String().data(), pointerToSourceString(vPC[6].u.structureChain).UTF8String().data());302 printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data(), pointerToSourceString(vPC[6].u.structureChain).utf8().data()); 303 303 return; 304 304 } 305 305 if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain)) { 306 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(vPC[4].u.structure). UTF8String().data(), pointerToSourceString(vPC[5].u.structureChain).UTF8String().data());306 printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structureChain).utf8().data()); 307 307 return; 308 308 } -
trunk/JavaScriptCore/jsc.cpp
r65302 r65305 179 179 putchar(' '); 180 180 181 printf("%s", exec->argument(i).toString(exec). UTF8String().data());181 printf("%s", exec->argument(i).toString(exec).utf8().data()); 182 182 } 183 183 … … 189 189 EncodedJSValue JSC_HOST_CALL functionDebug(ExecState* exec) 190 190 { 191 fprintf(stderr, "--> %s\n", exec->argument(0).toString(exec). UTF8String().data());191 fprintf(stderr, "--> %s\n", exec->argument(0).toString(exec).utf8().data()); 192 192 return JSValue::encode(jsUndefined()); 193 193 } … … 443 443 printf("Exception: %s\n", completion.value().toString(globalObject->globalExec()).ascii()); 444 444 else 445 printf("%s\n", completion.value().toString(globalObject->globalExec()). UTF8String().data());445 printf("%s\n", completion.value().toString(globalObject->globalExec()).utf8().data()); 446 446 447 447 globalObject->globalExec()->clearException(); … … 533 533 static bool fillBufferWithContentsOfFile(const UString& fileName, Vector<char>& buffer) 534 534 { 535 FILE* f = fopen(fileName. UTF8String().data(), "r");535 FILE* f = fopen(fileName.utf8().data(), "r"); 536 536 if (!f) { 537 fprintf(stderr, "Could not open file: %s\n", fileName. UTF8String().data());537 fprintf(stderr, "Could not open file: %s\n", fileName.utf8().data()); 538 538 return false; 539 539 } -
trunk/JavaScriptCore/pcre/pcre_exec.cpp
r65302 r65305 2144 2144 printf("Regular Expressions, sorted by time spent evaluating them:\n"); 2145 2145 for (size_t i = 0; i < size; ++i) 2146 printf(" %f - %s\n", values[size - i - 1].second, values[size - i - 1].first. UTF8String().c_str());2146 printf(" %f - %s\n", values[size - i - 1].second, values[size - i - 1].first.utf8().c_str()); 2147 2147 } 2148 2148 -
trunk/JavaScriptCore/profiler/CallIdentifier.h
r65302 r65305 72 72 #ifndef NDEBUG 73 73 operator const char*() const { return c_str(); } 74 const char* c_str() const { return m_name. UTF8String().data(); }74 const char* c_str() const { return m_name.utf8().data(); } 75 75 #endif 76 76 }; -
trunk/JavaScriptCore/profiler/Profile.cpp
r65302 r65305 128 128 std::sort(sortedFunctions.begin(), sortedFunctions.end(), functionNameCountPairComparator); 129 129 for (NameCountPairVector::iterator it = sortedFunctions.begin(); it != sortedFunctions.end(); ++it) 130 printf(" %-12d%s\n", (*it).second, UString((*it).first). UTF8String().data());130 printf(" %-12d%s\n", (*it).second, UString((*it).first).utf8().data()); 131 131 132 132 printf("\nSort by top of stack, same collapsed (when >= 5):\n"); -
trunk/JavaScriptCore/profiler/ProfileGenerator.cpp
r65302 r65305 76 76 { 77 77 if (JAVASCRIPTCORE_PROFILE_WILL_EXECUTE_ENABLED()) { 78 CString name = callIdentifier.m_name. UTF8String();79 CString url = callIdentifier.m_url. UTF8String();78 CString name = callIdentifier.m_name.utf8(); 79 CString url = callIdentifier.m_url.utf8(); 80 80 JAVASCRIPTCORE_PROFILE_WILL_EXECUTE(m_profileGroup, const_cast<char*>(name.data()), const_cast<char*>(url.data()), callIdentifier.m_lineNumber); 81 81 } … … 91 91 { 92 92 if (JAVASCRIPTCORE_PROFILE_DID_EXECUTE_ENABLED()) { 93 CString name = callIdentifier.m_name. UTF8String();94 CString url = callIdentifier.m_url. UTF8String();93 CString name = callIdentifier.m_name.utf8(); 94 CString url = callIdentifier.m_url.utf8(); 95 95 JAVASCRIPTCORE_PROFILE_DID_EXECUTE(m_profileGroup, const_cast<char*>(name.data()), const_cast<char*>(url.data()), callIdentifier.m_lineNumber); 96 96 } -
trunk/JavaScriptCore/profiler/ProfileNode.cpp
r65302 r65305 295 295 296 296 printf("Function Name %s %d SelfTime %.3fms/%.3f%% TotalTime %.3fms/%.3f%% VSelf %.3fms VTotal %.3fms Visible %s Next Sibling %s\n", 297 functionName(). UTF8String().data(),297 functionName().utf8().data(), 298 298 m_numberOfCalls, m_actualSelfTime, selfPercent(), m_actualTotalTime, totalPercent(), 299 299 m_visibleSelfTime, m_visibleTotalTime, 300 300 (m_visible ? "True" : "False"), 301 m_nextSibling ? m_nextSibling->functionName(). UTF8String().data() : "");301 m_nextSibling ? m_nextSibling->functionName().utf8().data() : ""); 302 302 303 303 ++indentLevel; … … 314 314 315 315 // Print function names 316 const char* name = functionName(). UTF8String().data();316 const char* name = functionName().utf8().data(); 317 317 double sampleCount = m_actualTotalTime * 1000; 318 318 if (indentLevel) { … … 340 340 printf(" "); 341 341 342 printf("%.0f %s\n", sampleCount - sumOfChildrensCount, functionName(). UTF8String().data());342 printf("%.0f %s\n", sampleCount - sumOfChildrensCount, functionName().utf8().data()); 343 343 } 344 344 -
trunk/JavaScriptCore/runtime/Arguments.cpp
r65302 r65305 158 158 { 159 159 bool isArrayIndex; 160 unsigned i = propertyName.toArrayIndex(&isArrayIndex);160 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 161 161 if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 162 162 if (i < d->numParameters) { … … 183 183 { 184 184 bool isArrayIndex; 185 unsigned i = propertyName.toArrayIndex(&isArrayIndex);185 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 186 186 if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 187 187 if (i < d->numParameters) { … … 234 234 { 235 235 bool isArrayIndex; 236 unsigned i = propertyName.toArrayIndex(&isArrayIndex);236 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 237 237 if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { 238 238 if (i < d->numParameters) … … 277 277 { 278 278 bool isArrayIndex; 279 unsigned i = propertyName.toArrayIndex(&isArrayIndex);279 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 280 280 if (isArrayIndex && i < d->numArguments) { 281 281 if (!d->deletedArguments) { -
trunk/JavaScriptCore/runtime/DateConversion.cpp
r65302 r65305 57 57 if (date == exec->globalData().cachedDateString) 58 58 return exec->globalData().cachedDateStringValue; 59 double value = parseDateFromNullTerminatedCharacters(exec, date. UTF8String().data());59 double value = parseDateFromNullTerminatedCharacters(exec, date.utf8().data()); 60 60 exec->globalData().cachedDateString = date; 61 61 exec->globalData().cachedDateStringValue = value; -
trunk/JavaScriptCore/runtime/Identifier.h
r65302 r65305 45 45 Identifier(JSGlobalData* globalData, const UString& s) : m_string(add(globalData, s.impl())) { } 46 46 47 // Special constructor for cases where we overwrite an object in place.48 Identifier(PlacementNewAdoptType) : m_string(PlacementNewAdopt) { }49 50 47 const UString& ustring() const { return m_string; } 51 48 StringImpl* impl() const { return m_string.impl(); } … … 69 66 uint32_t toUInt32(bool* ok, bool tolerateEmptyString) const { return m_string.toUInt32(ok, tolerateEmptyString); }; 70 67 uint32_t toStrictUInt32(bool* ok) const { return m_string.toStrictUInt32(ok); } 71 unsigned toArrayIndex(bool* ok) const { return m_string.toArrayIndex(ok); }72 68 double toDouble() const { return m_string.toDouble(); } 73 69 -
trunk/JavaScriptCore/runtime/JSArray.cpp
r65302 r65305 274 274 275 275 bool isArrayIndex; 276 unsigned i = propertyName.toArrayIndex(&isArrayIndex);276 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 277 277 if (isArrayIndex) 278 278 return JSArray::getOwnPropertySlot(exec, i, slot); … … 291 291 292 292 bool isArrayIndex; 293 unsigned i = propertyName.toArrayIndex(&isArrayIndex);293 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 294 294 if (isArrayIndex) { 295 295 if (i >= storage->m_length) … … 318 318 { 319 319 bool isArrayIndex; 320 unsigned i = propertyName.toArrayIndex(&isArrayIndex);320 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 321 321 if (isArrayIndex) { 322 322 put(exec, i, value); … … 476 476 { 477 477 bool isArrayIndex; 478 unsigned i = propertyName.toArrayIndex(&isArrayIndex);478 unsigned i = toArrayIndex(propertyName.ustring(), &isArrayIndex); 479 479 if (isArrayIndex) 480 480 return deleteProperty(exec, i); -
trunk/JavaScriptCore/runtime/JSArray.h
r65302 r65305 262 262 } 263 263 } 264 264 265 // Rule from ECMA 15.2 about what an array index is. 266 // Must exactly match string form of an unsigned integer, and be less than 2^32 - 1. 267 inline unsigned toArrayIndex(const UString& string, bool* ok) 268 { 269 unsigned i = string.toStrictUInt32(ok); 270 if (ok && i >= 0xFFFFFFFFU) 271 *ok = false; 272 return i; 273 } 274 265 275 } // namespace JSC 266 276 -
trunk/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
r65302 r65305 54 54 { 55 55 UString str = exec->argument(0).toString(exec); 56 CString cstr = str. UTF8String(true);56 CString cstr = str.utf8(true); 57 57 if (!cstr.data()) 58 58 return throwError(exec, createURIError(exec, "String contained an illegal UTF-16 sequence.")); … … 266 266 if (number >= mantissaOverflowLowerBound) { 267 267 if (radix == 10) 268 number = WTF::strtod(s.substr(firstDigitPosition, p - firstDigitPosition). UTF8String().data(), 0);268 number = WTF::strtod(s.substr(firstDigitPosition, p - firstDigitPosition).utf8().data(), 0); 269 269 else if (radix == 2 || radix == 4 || radix == 8 || radix == 16 || radix == 32) 270 number = parseIntOverflow(s.substr(firstDigitPosition, p - firstDigitPosition). UTF8String().data(), p - firstDigitPosition, radix);270 number = parseIntOverflow(s.substr(firstDigitPosition, p - firstDigitPosition).utf8().data(), p - firstDigitPosition, radix); 271 271 } 272 272 … … 454 454 EncodedJSValue JSC_HOST_CALL globalFuncJSCPrint(ExecState* exec) 455 455 { 456 CString string = exec->argument(0).toString(exec). UTF8String();456 CString string = exec->argument(0).toString(exec).utf8(); 457 457 puts(string.data()); 458 458 return JSValue::encode(jsUndefined()); -
trunk/JavaScriptCore/runtime/JSString.h
r65302 r65305 192 192 { 193 193 ASSERT(!m_value.isNull()); 194 Heap::heap(this)->reportExtraMemoryCost(value. cost());194 Heap::heap(this)->reportExtraMemoryCost(value.impl()->cost()); 195 195 } 196 196 … … 309 309 m_other.m_finalizerCallback = finalizer; 310 310 m_other.m_finalizerContext = context; 311 Heap::heap(this)->reportExtraMemoryCost(value. cost());311 Heap::heap(this)->reportExtraMemoryCost(value.impl()->cost()); 312 312 } 313 313 -
trunk/JavaScriptCore/runtime/UString.cpp
r65302 r65305 258 258 } 259 259 260 // FIXME: If tolerateTrailingJunk is true, then we want to tolerate junk261 // after the number, even if it contains invalid UTF-16 sequences. So we262 // shouldn't use the UTF8String function, which returns null when it263 // encounters invalid UTF-16. Further, we have no need to convert the264 // non-ASCII characters to UTF-8, so the UTF8String does quite a bit of265 // unnecessary work.266 267 // FIXME: The space skipping code below skips only ASCII spaces, but callers268 // need to skip all StrWhiteSpace. The isStrWhiteSpace function does the269 // right thing but requires UChar, not char, for its argument.270 271 260 const UChar* data = this->characters(); 272 261 const UChar* end = data + size; … … 595 584 } 596 585 597 CString UString::UTF8String(bool strict) const 598 { 599 // Allocate a buffer big enough to hold all the characters. 600 const unsigned len = length(); 601 Vector<char, 1024> buffer(len * 3); 602 603 // Convert to runs of 8-bit characters. 604 char* p = buffer.data(); 605 const UChar* d = reinterpret_cast<const UChar*>(&characters()[0]); 606 ConversionResult result = convertUTF16ToUTF8(&d, d + len, &p, p + buffer.size(), strict); 607 if (result != conversionOK) 586 // Helper to write a three-byte UTF-8 code point to the buffer, caller must check room is available. 587 static inline void putUTF8Triple(char*& buffer, UChar ch) 588 { 589 ASSERT(ch >= 0x0800); 590 *buffer++ = static_cast<char>(((ch >> 12) & 0x0F) | 0xE0); 591 *buffer++ = static_cast<char>(((ch >> 6) & 0x3F) | 0x80); 592 *buffer++ = static_cast<char>((ch & 0x3F) | 0x80); 593 } 594 595 CString UString::utf8(bool strict) const 596 { 597 unsigned length = this->length(); 598 const UChar* characters = this->characters(); 599 600 // Allocate a buffer big enough to hold all the characters 601 // (an individual UTF-16 UChar can only expand to 3 UTF-8 bytes). 602 // Optimization ideas, if we find this function is hot: 603 // * We could speculatively create a CStringBuffer to contain 'length' 604 // characters, and resize if necessary (i.e. if the buffer contains 605 // non-ascii characters). (Alternatively, scan the buffer first for 606 // ascii characters, so we know this will be sufficient). 607 // * We could allocate a CStringBuffer with an appropriate size to 608 // have a good chance of being able to write the string into the 609 // buffer without reallocing (say, 1.5 x length). 610 Vector<char, 1024> bufferVector(length * 3); 611 612 char* buffer = bufferVector.data(); 613 ConversionResult result = convertUTF16ToUTF8(&characters, characters + length, &buffer, buffer + bufferVector.size(), strict); 614 ASSERT(result != targetExhausted); // (length * 3) should be sufficient for any conversion 615 616 // Only produced from strict conversion. 617 if (result == sourceIllegal) 608 618 return CString(); 609 619 610 return CString(buffer.data(), p - buffer.data()); 620 // Check for an unconverted high surrogate. 621 if (result == sourceExhausted) { 622 if (strict) 623 return CString(); 624 // This should be one unpaired high surrogate. Treat it the same 625 // was as an unpaired high surrogate would have been handled in 626 // the middle of a string with non-strict conversion - which is 627 // to say, simply encode it to UTF-8. 628 ASSERT((characters + 1) == (this->characters() + length)); 629 ASSERT((*characters >= 0xD800) && (*characters <= 0xDBFF)); 630 // There should be room left, since one UChar hasn't been converted. 631 ASSERT((buffer + 3) <= (buffer + bufferVector.size())); 632 putUTF8Triple(buffer, *characters); 633 } 634 635 return CString(bufferVector.data(), buffer - bufferVector.data()); 611 636 } 612 637 -
trunk/JavaScriptCore/runtime/UString.h
r65302 r65305 39 39 namespace JSC { 40 40 41 using WTF::PlacementNewAdoptType;42 using WTF::PlacementNewAdopt;43 44 41 class UString { 45 42 public: … … 64 61 UString(RefPtr<StringImpl> impl) : m_impl(impl) { } 65 62 63 // Inline the destructor. 64 ALWAYS_INLINE ~UString() { } 65 66 66 void swap(UString& o) { m_impl.swap(o.m_impl); } 67 67 … … 69 69 static UString adopt(Vector<UChar, inlineCapacity>& vector) { return StringImpl::adopt(vector); } 70 70 71 static UString number(int); 72 static UString number(long long); 73 static UString number(unsigned); 74 static UString number(long); 75 static UString number(double); 76 77 // NOTE: This method should only be used for *debugging* purposes as it 78 // is neither Unicode safe nor free from side effects nor thread-safe. 79 char* ascii() const; 80 81 /** 82 * Convert the string to UTF-8, assuming it is UTF-16 encoded. 83 * In non-strict mode, this function is tolerant of badly formed UTF-16, it 84 * can create UTF-8 strings that are invalid because they have characters in 85 * the range U+D800-U+DDFF, U+FFFE, or U+FFFF, but the UTF-8 string is 86 * guaranteed to be otherwise valid. 87 * In strict mode, error is returned as null CString. 88 */ 89 CString UTF8String(bool strict = false) const; 71 bool isNull() const { return !m_impl; } 72 bool isEmpty() const { return !m_impl || !m_impl->length(); } 73 74 StringImpl* impl() const { return m_impl.get(); } 90 75 91 76 unsigned length() const … … 103 88 } 104 89 90 CString utf8(bool strict = false) const; 91 105 92 UChar operator[](unsigned index) const 106 93 { … … 110 97 } 111 98 99 static UString number(int); 100 static UString number(unsigned); 101 static UString number(long); 102 static UString number(long long); 103 static UString number(double); 104 105 106 112 107 double toDouble(bool tolerateTrailingJunk, bool tolerateEmptyString) const; 113 108 double toDouble(bool tolerateTrailingJunk) const; … … 117 112 uint32_t toUInt32(bool* ok, bool tolerateEmptyString) const; 118 113 uint32_t toStrictUInt32(bool* ok = 0) const; 119 120 unsigned toArrayIndex(bool* ok = 0) const;121 114 122 115 static const unsigned NotFound = 0xFFFFFFFFu; … … 128 121 UString substr(unsigned pos = 0, unsigned len = 0xFFFFFFFF) const; 129 122 130 bool isNull() const { return !m_impl; } 131 bool isEmpty() const { return !m_impl || !m_impl->length(); } 132 133 StringImpl* impl() const { return m_impl.get(); } 134 135 size_t cost() const 136 { 137 if (!m_impl) 138 return 0; 139 return m_impl->cost(); 140 } 141 142 ALWAYS_INLINE ~UString() { } 123 // NOTE: This method should only be used for *debugging* purposes as it 124 // is neither Unicode safe nor free from side effects nor thread-safe. 125 char* ascii() const; 126 143 127 private: 144 128 RefPtr<StringImpl> m_impl; … … 218 202 } 219 203 220 // Rule from ECMA 15.2 about what an array index is.221 // Must exactly match string form of an unsigned integer, and be less than 2^32 - 1.222 inline unsigned UString::toArrayIndex(bool* ok) const223 {224 unsigned i = toStrictUInt32(ok);225 if (ok && i >= 0xFFFFFFFFU)226 *ok = false;227 return i;228 }229 230 204 // We'd rather not do shared substring append for small strings, since 231 205 // this runs too much risk of a tiny initial string holding down a -
trunk/JavaScriptCore/wtf/text/WTFString.cpp
r65302 r65305 655 655 } 656 656 657 CString String::utf8( ) const657 CString String::utf8(bool strict) const 658 658 { 659 659 unsigned length = this->length(); … … 673 673 674 674 char* buffer = bufferVector.data(); 675 ConversionResult result = convertUTF16ToUTF8(&characters, characters + length, &buffer, buffer + bufferVector.size(), false); 676 ASSERT(result != sourceIllegal); // Only produced from strict conversion. 675 ConversionResult result = convertUTF16ToUTF8(&characters, characters + length, &buffer, buffer + bufferVector.size(), strict); 677 676 ASSERT(result != targetExhausted); // (length * 3) should be sufficient for any conversion 678 677 679 // If a high surrogate is left unconverted, treat it the same was as an unpaired high surrogate 680 // would have been handled in the middle of a string with non-strict conversion - which is to say, 681 // simply encode it to UTF-8. 678 // Only produced from strict conversion. 679 if (result == sourceIllegal) 680 return CString(); 681 682 // Check for an unconverted high surrogate. 682 683 if (result == sourceExhausted) { 683 // This should be one unpaired high surrogate. 684 if (strict) 685 return CString(); 686 // This should be one unpaired high surrogate. Treat it the same 687 // was as an unpaired high surrogate would have been handled in 688 // the middle of a string with non-strict conversion - which is 689 // to say, simply encode it to UTF-8. 684 690 ASSERT((characters + 1) == (this->characters() + length)); 685 691 ASSERT((*characters >= 0xD800) && (*characters <= 0xDBFF)); -
trunk/JavaScriptCore/wtf/text/WTFString.h
r65302 r65305 98 98 String(RefPtr<StringImpl> impl) : m_impl(impl) { } 99 99 100 // Inline the destructor. 101 ALWAYS_INLINE ~String() { } 102 100 103 void swap(String& o) { m_impl.swap(o.m_impl); } 101 102 // Hash table deleted values, which are only constructed and never copied or destroyed.103 String(WTF::HashTableDeletedValueType) : m_impl(WTF::HashTableDeletedValue) { }104 bool isHashTableDeletedValue() const { return m_impl.isHashTableDeletedValue(); }105 104 106 105 static String adopt(StringBuffer& buffer) { return StringImpl::adopt(buffer); } … … 108 107 static String adopt(Vector<UChar, inlineCapacity>& vector) { return StringImpl::adopt(vector); } 109 108 110 111 ALWAYS_INLINE unsigned length() const 109 bool isNull() const { return !m_impl; } 110 bool isEmpty() const { return !m_impl || !m_impl->length(); } 111 112 StringImpl* impl() const { return m_impl.get(); } 113 114 unsigned length() const 112 115 { 113 116 if (!m_impl) … … 123 126 } 124 127 125 const UChar* charactersWithNullTermination(); 126 128 CString latin1() const; 129 CString utf8(bool strict = false) const; 130 127 131 UChar operator[](unsigned index) const 128 132 { … … 131 135 return m_impl->characters()[index]; 132 136 } 137 138 static String number(short); 139 static String number(unsigned short); 140 static String number(int); 141 static String number(unsigned); 142 static String number(long); 143 static String number(unsigned long); 144 static String number(long long); 145 static String number(unsigned long long); 146 static String number(double); 147 148 149 150 const UChar* charactersWithNullTermination(); 151 133 152 UChar32 characterStartingAt(unsigned) const; // Ditto. 134 153 … … 191 210 String foldCase() const; 192 211 193 static String number(short);194 static String number(unsigned short);195 static String number(int);196 static String number(unsigned);197 static String number(long);198 static String number(unsigned long);199 static String number(long long);200 static String number(unsigned long long);201 static String number(double);202 203 212 #if !PLATFORM(QT) 204 213 static String format(const char *, ...) WTF_ATTRIBUTE_PRINTF(1, 2); … … 241 250 String threadsafeCopy() const; 242 251 243 bool isNull() const { return !m_impl; }244 ALWAYS_INLINE bool isEmpty() const { return !m_impl || !m_impl->length(); }245 246 StringImpl* impl() const { return m_impl.get(); }247 248 252 #if PLATFORM(CF) 249 253 String(CFStringRef); … … 277 281 Vector<char> ascii() const; 278 282 279 CString latin1() const;280 CString utf8() const;281 282 283 static String fromUTF8(const char*, size_t); 283 284 static String fromUTF8(const char*); … … 290 291 291 292 bool containsOnlyASCII() const { return charactersAreAllASCII(characters(), length()); } 293 294 // Hash table deleted values, which are only constructed and never copied or destroyed. 295 String(WTF::HashTableDeletedValueType) : m_impl(WTF::HashTableDeletedValue) { } 296 bool isHashTableDeletedValue() const { return m_impl.isHashTableDeletedValue(); } 292 297 293 298 private:
Note:
See TracChangeset
for help on using the changeset viewer.