Changeset 52075 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Dec 13, 2009, 4:27:07 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Executable.cpp
r48662 r52075 31 31 #include "JIT.h" 32 32 #include "Parser.h" 33 #include "StringBuilder.h" 33 34 #include "Vector.h" 34 35 … … 266 267 { 267 268 FunctionParameters& parameters = *m_parameters; 268 UString s("");269 StringBuilder builder; 269 270 for (size_t pos = 0; pos < parameters.size(); ++pos) { 270 if (! s.isEmpty())271 s += ", ";272 s += parameters[pos].ustring();271 if (!builder.isEmpty()) 272 builder.append(", "); 273 builder.append(parameters[pos].ustring()); 273 274 } 274 275 return s; 275 return builder.release(); 276 276 } 277 277 -
trunk/JavaScriptCore/runtime/FunctionConstructor.cpp
r48836 r52075 22 22 #include "FunctionConstructor.h" 23 23 24 #include "Debugger.h" 24 25 #include "FunctionPrototype.h" 25 26 #include "JSFunction.h" 26 27 #include "JSGlobalObject.h" 27 28 #include "JSString.h" 28 #include "Parser.h"29 #include "Debugger.h"30 29 #include "Lexer.h" 31 30 #include "Nodes.h" 31 #include "Parser.h" 32 #include "StringBuilder.h" 32 33 33 34 namespace JSC { … … 77 78 program = "(function() { \n})"; 78 79 else if (args.size() == 1) 79 program = "(function() { " + args.at(0).toString(exec) + "\n})";80 program = makeString("(function() { ", args.at(0).toString(exec), "\n})"); 80 81 else { 81 program = "(function(" + args.at(0).toString(exec); 82 for (size_t i = 1; i < args.size() - 1; i++) 83 program += "," + args.at(i).toString(exec); 84 program += ") { " + args.at(args.size() - 1).toString(exec) + "\n})"; 82 StringBuilder builder; 83 builder.append("(function("); 84 builder.append(args.at(0).toString(exec)); 85 for (size_t i = 1; i < args.size() - 1; i++) { 86 builder.append(","); 87 builder.append(args.at(i).toString(exec)); 88 } 89 builder.append(") { "); 90 builder.append(args.at(args.size() - 1).toString(exec)); 91 builder.append("\n})"); 92 program = builder.release(); 85 93 } 86 94 -
trunk/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
r48905 r52075 28 28 #include "CallFrame.h" 29 29 #include "GlobalEvalFunction.h" 30 #include "Interpreter.h" 30 31 #include "JSGlobalObject.h" 32 #include "JSString.h" 33 #include "Lexer.h" 31 34 #include "LiteralParser.h" 32 #include "JSString.h" 33 #include "Interpreter.h" 35 #include "Nodes.h" 34 36 #include "Parser.h" 37 #include "StringBuilder.h" 35 38 #include "dtoa.h" 36 #include "Lexer.h"37 #include "Nodes.h"38 39 #include <stdio.h> 39 40 #include <stdlib.h> … … 56 57 return throwError(exec, URIError, "String contained an illegal UTF-16 sequence."); 57 58 58 UString result = "";59 StringBuilder builder; 59 60 const char* p = cstr.c_str(); 60 61 for (size_t k = 0; k < cstr.size(); k++, p++) { 61 62 char c = *p; 62 63 if (c && strchr(doNotEscape, c)) 63 result.append(c);64 builder.append(c); 64 65 else { 65 66 char tmp[4]; 66 s printf(tmp, "%%%02X", static_cast<unsigned char>(c));67 result += tmp;68 } 69 } 70 return jsString(exec, result);67 snprintf(tmp, 4, "%%%02X", static_cast<unsigned char>(c)); 68 builder.append((const char*)tmp); 69 } 70 } 71 return jsString(exec, builder.release()); 71 72 } 72 73 73 74 static JSValue decode(ExecState* exec, const ArgList& args, const char* doNotUnescape, bool strict) 74 75 { 75 UString result = "";76 StringBuilder builder; 76 77 UString str = args.at(0).toString(exec); 77 78 int k = 0; … … 107 108 else if (character >= 0x10000) { 108 109 // Convert to surrogate pair. 109 result.append(static_cast<UChar>(0xD800 | ((character - 0x10000) >> 10)));110 builder.append(static_cast<UChar>(0xD800 | ((character - 0x10000) >> 10))); 110 111 u = static_cast<UChar>(0xDC00 | ((character - 0x10000) & 0x3FF)); 111 112 } else … … 132 133 } 133 134 k++; 134 result.append(c);135 } 136 return jsString(exec, result);135 builder.append(c); 136 } 137 return jsString(exec, builder.release()); 137 138 } 138 139 … … 377 378 "*+-./@_"; 378 379 379 UString result = "";380 StringBuilder builder; 380 381 UString s; 381 382 UString str = args.at(0).toString(exec); … … 394 395 s = UString(tmp); 395 396 } 396 result += s;397 } 398 399 return jsString(exec, result);397 builder.append(s); 398 } 399 400 return jsString(exec, builder.release()); 400 401 } 401 402 402 403 JSValue JSC_HOST_CALL globalFuncUnescape(ExecState* exec, JSObject*, JSValue, const ArgList& args) 403 404 { 404 UString result = "";405 StringBuilder builder; 405 406 UString str = args.at(0).toString(exec); 406 407 int k = 0; … … 421 422 } 422 423 k++; 423 result.append(*c);424 } 425 426 return jsString(exec, result);424 builder.append(*c); 425 } 426 427 return jsString(exec, builder.release()); 427 428 } 428 429 -
trunk/JavaScriptCore/runtime/JSONObject.cpp
r51801 r52075 33 33 #include "LiteralParser.h" 34 34 #include "PropertyNameArray.h" 35 #include "StringBuilder.h" 35 36 #include <wtf/MathExtras.h> 36 37 … … 71 72 72 73 private: 73 class StringBuilder : public Vector<UChar> {74 public:75 using Vector<UChar>::append;76 77 inline void append(const char* str)78 {79 size_t len = strlen(str);80 reserveCapacity(size() + len);81 for (size_t i = 0; i < len; i++)82 Vector<UChar>::append(str[i]);83 }84 85 inline void append(const UString& str)86 {87 append(str.data(), str.size());88 }89 };90 91 74 class Holder { 92 75 public: … … 286 269 return jsNull(); 287 270 288 result.shrinkToFit(); 289 size_t length = result.size(); 290 return jsString(m_exec, UString(result.releaseBuffer(), length, false)); 271 return jsString(m_exec, result.release()); 291 272 } 292 273 … … 478 459 int newSize = m_indent.size() + m_gap.size(); 479 460 if (newSize > m_repeatedGap.size()) 480 m_repeatedGap .append(m_gap);461 m_repeatedGap = makeString(m_repeatedGap, m_gap); 481 462 ASSERT(newSize <= m_repeatedGap.size()); 482 463 m_indent = m_repeatedGap.substr(0, newSize); -
trunk/JavaScriptCore/runtime/JSString.h
r52047 r52075 346 346 friend JSValue jsString(ExecState* exec, JSString* s1, const UString& u2); 347 347 friend JSValue jsString(ExecState* exec, Register* strings, unsigned count); 348 friend JSValue jsString(ExecState* exec, JSValue thisValue, const ArgList& args); 348 349 }; 349 350 -
trunk/JavaScriptCore/runtime/LiteralParser.cpp
r47828 r52075 30 30 #include "JSString.h" 31 31 #include "Lexer.h" 32 #include "StringBuilder.h" 32 33 #include <wtf/ASCIICType.h> 33 34 #include <wtf/dtoa.h> … … 135 136 ++m_ptr; 136 137 const UChar* runStart; 137 token.stringToken = UString();138 StringBuilder builder; 138 139 do { 139 140 runStart = m_ptr; … … 141 142 ++m_ptr; 142 143 if (runStart < m_ptr) 143 token.stringToken.append(runStart, m_ptr - runStart);144 builder.append(runStart, m_ptr - runStart); 144 145 if ((mode == StrictJSON) && m_ptr < m_end && *m_ptr == '\\') { 145 146 ++m_ptr; … … 148 149 switch (*m_ptr) { 149 150 case '"': 150 token.stringToken.append('"');151 builder.append('"'); 151 152 m_ptr++; 152 153 break; 153 154 case '\\': 154 token.stringToken.append('\\');155 builder.append('\\'); 155 156 m_ptr++; 156 157 break; 157 158 case '/': 158 token.stringToken.append('/');159 builder.append('/'); 159 160 m_ptr++; 160 161 break; 161 162 case 'b': 162 token.stringToken.append('\b');163 builder.append('\b'); 163 164 m_ptr++; 164 165 break; 165 166 case 'f': 166 token.stringToken.append('\f');167 builder.append('\f'); 167 168 m_ptr++; 168 169 break; 169 170 case 'n': 170 token.stringToken.append('\n');171 builder.append('\n'); 171 172 m_ptr++; 172 173 break; 173 174 case 'r': 174 token.stringToken.append('\r');175 builder.append('\r'); 175 176 m_ptr++; 176 177 break; 177 178 case 't': 178 token.stringToken.append('\t');179 builder.append('\t'); 179 180 m_ptr++; 180 181 break; … … 187 188 return TokError; 188 189 } 189 token.stringToken.append(JSC::Lexer::convertUnicode(m_ptr[1], m_ptr[2], m_ptr[3], m_ptr[4]));190 builder.append(JSC::Lexer::convertUnicode(m_ptr[1], m_ptr[2], m_ptr[3], m_ptr[4])); 190 191 m_ptr += 5; 191 192 break; … … 200 201 return TokError; 201 202 203 token.stringToken = builder.release(); 202 204 token.type = TokString; 203 205 token.end = ++m_ptr; -
trunk/JavaScriptCore/runtime/NumberPrototype.cpp
r49335 r52075 26 26 #include "JSFunction.h" 27 27 #include "JSString.h" 28 #include "Operations.h" 28 29 #include "PrototypeFunction.h" 30 #include "StringBuilder.h" 29 31 #include "dtoa.h" 30 #include "Operations.h"31 32 #include <wtf/Assertions.h> 32 33 #include <wtf/MathExtras.h> … … 74 75 size_t length = strlen(result); 75 76 76 UString str = sign ? "-" : ""; 77 StringBuilder builder; 78 builder.append(sign ? "-" : ""); 77 79 if (resultIsInfOrNan) 78 str += result;80 builder.append((const char*)result); 79 81 else if (decimalPoint <= 0) 80 str += "0";82 builder.append("0"); 81 83 else { 82 84 Vector<char, 1024> buf(decimalPoint + 1); … … 90 92 buf[decimalPoint] = '\0'; 91 93 92 str.append(buf.data());93 } 94 95 return str;94 builder.append((const char*)(buf.data())); 95 } 96 97 return builder.release(); 96 98 } 97 99 … … 237 239 UString s; 238 240 if (x < 0) { 239 s .append('-');241 s = "-"; 240 242 x = -x; 241 } else if (x == -0.0) 242 x = 0; 243 } else { 244 s = ""; 245 if (x == -0.0) 246 x = 0; 247 } 243 248 244 249 if (x >= pow(10.0, 21.0)) 245 return jsString(exec, s + UString::from(x));250 return jsString(exec, makeString(s, UString::from(x))); 246 251 247 252 const double tenToTheF = pow(10.0, f); … … 254 259 int k = m.size(); 255 260 if (k <= f) { 256 UStringz;261 StringBuilder z; 257 262 for (int i = 0; i < f + 1 - k; i++) 258 263 z.append('0'); 259 m = z + m; 264 z.append(m); 265 m = z.release(); 260 266 k = f + 1; 261 267 ASSERT(k == m.size()); 262 268 } 263 269 int kMinusf = k - f; 270 264 271 if (kMinusf < m.size()) 265 return jsString(exec, s + m.substr(0, kMinusf) + "." + m.substr(kMinusf));266 return jsString(exec, s + m.substr(0, kMinusf));272 return jsString(exec, makeString(s, m.substr(0, kMinusf), ".", m.substr(kMinusf))); 273 return jsString(exec, makeString(s, m.substr(0, kMinusf))); 267 274 } 268 275 … … 392 399 s = "-"; 393 400 x = -x; 394 } 401 } else 402 s = ""; 395 403 396 404 if (!(doublePrecision >= 1 && doublePrecision <= 21)) // true for NaN … … 423 431 if (e < -6 || e >= precision) { 424 432 if (m.size() > 1) 425 m = m .substr(0, 1) + "." + m.substr(1);433 m = makeString(m.substr(0, 1), ".", m.substr(1)); 426 434 if (e >= 0) 427 return jsNontrivialString(exec, s + m + "e+" + UString::from(e));428 return jsNontrivialString(exec, s + m + "e-" + UString::from(-e));435 return jsNontrivialString(exec, makeString(s, m, "e+", UString::from(e))); 436 return jsNontrivialString(exec, makeString(s, m, "e-", UString::from(-e))); 429 437 } 430 438 } else { … … 434 442 435 443 if (e == precision - 1) 436 return jsString(exec, s + m);444 return jsString(exec, makeString(s, m)); 437 445 if (e >= 0) { 438 446 if (e + 1 < m.size()) 439 return jsString(exec, s + m.substr(0, e + 1) + "." + m.substr(e + 1));440 return jsString(exec, s + m);441 } 442 return jsNontrivialString(exec, s + "0." + charSequence('0', -(e + 1)) + m);447 return jsString(exec, makeString(s, m.substr(0, e + 1), ".", m.substr(e + 1))); 448 return jsString(exec, makeString(s, m)); 449 } 450 return jsNontrivialString(exec, makeString(s, "0.", charSequence('0', -(e + 1)), m)); 443 451 } 444 452 -
trunk/JavaScriptCore/runtime/Operations.h
r52026 r52075 129 129 } 130 130 131 ALWAYS_INLINE JSValue jsString(ExecState* exec, JSValue thisValue, const ArgList& args) 132 { 133 unsigned ropeLength = 0; 134 if (LIKELY(thisValue.isString())) 135 ropeLength += asString(thisValue)->ropeLength(); 136 else 137 ++ropeLength; 138 for (unsigned i = 0; i < args.size(); ++i) { 139 JSValue v = args.at(i); 140 if (LIKELY(v.isString())) 141 ropeLength += asString(v)->ropeLength(); 142 else 143 ++ropeLength; 144 } 145 146 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength); 147 if (UNLIKELY(!rope)) 148 return throwOutOfMemoryError(exec); 149 150 unsigned index = 0; 151 if (LIKELY(thisValue.isString())) 152 rope->append(index, asString(thisValue)); 153 else 154 rope->append(index, thisValue.toString(exec)); 155 for (unsigned i = 0; i < args.size(); ++i) { 156 JSValue v = args.at(i); 157 if (LIKELY(v.isString())) 158 rope->append(index, asString(v)); 159 else 160 rope->append(index, v.toString(exec)); 161 } 162 ASSERT(index == ropeLength); 163 164 JSGlobalData* globalData = &exec->globalData(); 165 return new (globalData) JSString(globalData, rope.release()); 166 } 167 131 168 // ECMA 11.9.3 132 169 inline bool JSValue::equal(ExecState* exec, JSValue v1, JSValue v2) -
trunk/JavaScriptCore/runtime/StringPrototype.cpp
r52028 r52075 30 30 #include "JSFunction.h" 31 31 #include "ObjectPrototype.h" 32 #include "Operations.h" 32 33 #include "PropertyNameArray.h" 33 34 #include "RegExpConstructor.h" … … 149 150 // ------------------------------ Functions -------------------------- 150 151 151 static inline UString substituteBackreferences(const UString& replacement, const UString& source, const int* ovector, RegExp* reg)152 { 153 UStringsubstitutedReplacement;152 static NEVER_INLINE UString substituteBackreferencesSlow(const UString& replacement, const UString& source, const int* ovector, RegExp* reg, int i) 153 { 154 Vector<UChar> substitutedReplacement; 154 155 int offset = 0; 155 int i = -1; 156 while ((i = replacement.find('$', i + 1)) != -1) { 156 do { 157 157 if (i + 1 == replacement.size()) 158 158 break; … … 206 206 offset = i + 1; 207 207 substitutedReplacement.append(source.data() + backrefStart, backrefLength); 208 } 209 210 if (!offset) 211 return replacement; 208 } while ((i = replacement.find('$', i + 1)) != -1); 212 209 213 210 if (replacement.size() - offset) 214 211 substitutedReplacement.append(replacement.data() + offset, replacement.size() - offset); 215 212 216 return substitutedReplacement; 213 substitutedReplacement.shrinkToFit(); 214 unsigned size = substitutedReplacement.size(); 215 return UString(substitutedReplacement.releaseBuffer(), size, false); 216 } 217 218 static inline UString substituteBackreferences(const UString& replacement, const UString& source, const int* ovector, RegExp* reg) 219 { 220 int i = replacement.find('$', 0); 221 if (UNLIKELY(i != -1)) 222 return substituteBackreferencesSlow(replacement, source, ovector, reg, i); 223 return replacement; 217 224 } 218 225 … … 424 431 JSValue JSC_HOST_CALL stringProtoFuncConcat(ExecState* exec, JSObject*, JSValue thisValue, const ArgList& args) 425 432 { 426 UString s = thisValue.toThisString(exec); 427 428 ArgList::const_iterator end = args.end(); 429 for (ArgList::const_iterator it = args.begin(); it != end; ++it) 430 s += (*it).toString(exec); 431 return jsString(exec, s); 433 if (thisValue.isString() && (args.size() == 1)) { 434 JSValue v = args.at(0); 435 return v.isString() 436 ? jsString(exec, asString(thisValue), asString(v)) 437 : jsString(exec, asString(thisValue), v.toString(exec)); 438 } 439 440 return jsString(exec, thisValue, args); 432 441 } 433 442 -
trunk/JavaScriptCore/runtime/UString.h
r52047 r52075 544 544 545 545 template<> 546 class StringTypeAdapter<char*> 547 { 546 class StringTypeAdapter<char*> { 548 547 public: 549 548 StringTypeAdapter<char*>(char* buffer) … … 567 566 568 567 template<> 569 class StringTypeAdapter<const char*> 570 { 568 class StringTypeAdapter<const char*> { 571 569 public: 572 570 StringTypeAdapter<const char*>(const char* buffer) … … 590 588 591 589 template<> 592 class StringTypeAdapter<UString> 593 { 590 class StringTypeAdapter<UString> { 594 591 public: 595 592 StringTypeAdapter<UString>(UString& string)
Note:
See TracChangeset
for help on using the changeset viewer.