Changeset 54804 in webkit for trunk/JavaScriptCore/runtime/Operations.h
- Timestamp:
- Feb 15, 2010, 5:32:06 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Operations.h
r54394 r54804 43 43 return s1; 44 44 45 unsigned ropeLength = s1->ropeLength() + s2->ropeLength();45 unsigned fiberCount = s1->fiberCount() + s2->fiberCount(); 46 46 JSGlobalData* globalData = &exec->globalData(); 47 47 48 if (ropeLength <= JSString::s_maxInternalRopeLength) 49 return new (globalData) JSString(globalData, ropeLength, s1, s2); 50 51 unsigned index = 0; 52 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength); 53 if (UNLIKELY(!rope)) 48 if (fiberCount <= JSString::s_maxInternalRopeLength) 49 return new (globalData) JSString(globalData, fiberCount, s1, s2); 50 51 JSString::RopeBuilder ropeBuilder(fiberCount); 52 if (UNLIKELY(ropeBuilder.isOutOfMemory())) 54 53 return throwOutOfMemoryError(exec); 55 rope->append(index, s1); 56 rope->append(index, s2); 57 ASSERT(index == ropeLength); 58 return new (globalData) JSString(globalData, rope.release()); 54 ropeBuilder.append(s1); 55 ropeBuilder.append(s2); 56 return new (globalData) JSString(globalData, ropeBuilder.release()); 59 57 } 60 58 61 59 ALWAYS_INLINE JSValue jsString(ExecState* exec, const UString& u1, JSString* s2) 62 60 { 63 unsigned ropeLength = 1 + s2->ropeLength();61 unsigned fiberCount = 1 + s2->fiberCount(); 64 62 JSGlobalData* globalData = &exec->globalData(); 65 63 66 if (ropeLength <= JSString::s_maxInternalRopeLength) 67 return new (globalData) JSString(globalData, ropeLength, u1, s2); 68 69 unsigned index = 0; 70 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength); 71 if (UNLIKELY(!rope)) 64 if (fiberCount <= JSString::s_maxInternalRopeLength) 65 return new (globalData) JSString(globalData, fiberCount, u1, s2); 66 67 JSString::RopeBuilder ropeBuilder(fiberCount); 68 if (UNLIKELY(ropeBuilder.isOutOfMemory())) 72 69 return throwOutOfMemoryError(exec); 73 rope->append(index, u1); 74 rope->append(index, s2); 75 ASSERT(index == ropeLength); 76 return new (globalData) JSString(globalData, rope.release()); 70 ropeBuilder.append(u1); 71 ropeBuilder.append(s2); 72 return new (globalData) JSString(globalData, ropeBuilder.release()); 77 73 } 78 74 79 75 ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, const UString& u2) 80 76 { 81 unsigned ropeLength = s1->ropeLength() + 1;77 unsigned fiberCount = s1->fiberCount() + 1; 82 78 JSGlobalData* globalData = &exec->globalData(); 83 79 84 if (ropeLength <= JSString::s_maxInternalRopeLength) 85 return new (globalData) JSString(globalData, ropeLength, s1, u2); 86 87 unsigned index = 0; 88 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength); 89 if (UNLIKELY(!rope)) 80 if (fiberCount <= JSString::s_maxInternalRopeLength) 81 return new (globalData) JSString(globalData, fiberCount, s1, u2); 82 83 JSString::RopeBuilder ropeBuilder(fiberCount); 84 if (UNLIKELY(ropeBuilder.isOutOfMemory())) 90 85 return throwOutOfMemoryError(exec); 91 rope->append(index, s1); 92 rope->append(index, u2); 93 ASSERT(index == ropeLength); 94 return new (globalData) JSString(globalData, rope.release()); 86 ropeBuilder.append(s1); 87 ropeBuilder.append(u2); 88 return new (globalData) JSString(globalData, ropeBuilder.release()); 95 89 } 96 90 … … 99 93 ASSERT(count >= 3); 100 94 101 unsigned ropeLength= 0;95 unsigned fiberCount = 0; 102 96 for (unsigned i = 0; i < count; ++i) { 103 97 JSValue v = strings[i].jsValue(); 104 98 if (LIKELY(v.isString())) 105 ropeLength += asString(v)->ropeLength();99 fiberCount += asString(v)->fiberCount(); 106 100 else 107 ++ ropeLength;101 ++fiberCount; 108 102 } 109 103 110 104 JSGlobalData* globalData = &exec->globalData(); 111 if ( ropeLength== 3)105 if (fiberCount == 3) 112 106 return new (globalData) JSString(exec, strings[0].jsValue(), strings[1].jsValue(), strings[2].jsValue()); 113 107 114 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength);115 if (UNLIKELY( !rope))108 JSString::RopeBuilder ropeBuilder(fiberCount); 109 if (UNLIKELY(ropeBuilder.isOutOfMemory())) 116 110 return throwOutOfMemoryError(exec); 117 111 118 unsigned index = 0;119 112 for (unsigned i = 0; i < count; ++i) { 120 113 JSValue v = strings[i].jsValue(); 121 114 if (LIKELY(v.isString())) 122 rope ->append(index,asString(v));115 ropeBuilder.append(asString(v)); 123 116 else 124 rope->append(index, v.toString(exec)); 125 } 126 127 ASSERT(index == ropeLength); 128 return new (globalData) JSString(globalData, rope.release()); 117 ropeBuilder.append(v.toString(exec)); 118 } 119 120 return new (globalData) JSString(globalData, ropeBuilder.release()); 129 121 } 130 122 131 123 ALWAYS_INLINE JSValue jsString(ExecState* exec, JSValue thisValue, const ArgList& args) 132 124 { 133 unsigned ropeLength= 0;125 unsigned fiberCount = 0; 134 126 if (LIKELY(thisValue.isString())) 135 ropeLength += asString(thisValue)->ropeLength();127 fiberCount += asString(thisValue)->fiberCount(); 136 128 else 137 ++ ropeLength;129 ++fiberCount; 138 130 for (unsigned i = 0; i < args.size(); ++i) { 139 131 JSValue v = args.at(i); 140 132 if (LIKELY(v.isString())) 141 ropeLength += asString(v)->ropeLength();133 fiberCount += asString(v)->fiberCount(); 142 134 else 143 ++ ropeLength;144 } 145 146 RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength);147 if (UNLIKELY( !rope))135 ++fiberCount; 136 } 137 138 JSString::RopeBuilder ropeBuilder(fiberCount); 139 if (UNLIKELY(ropeBuilder.isOutOfMemory())) 148 140 return throwOutOfMemoryError(exec); 149 141 150 unsigned index = 0;151 142 if (LIKELY(thisValue.isString())) 152 rope ->append(index,asString(thisValue));143 ropeBuilder.append(asString(thisValue)); 153 144 else 154 rope ->append(index,thisValue.toString(exec));145 ropeBuilder.append(thisValue.toString(exec)); 155 146 for (unsigned i = 0; i < args.size(); ++i) { 156 147 JSValue v = args.at(i); 157 148 if (LIKELY(v.isString())) 158 rope ->append(index,asString(v));149 ropeBuilder.append(asString(v)); 159 150 else 160 rope->append(index, v.toString(exec)); 161 } 162 ASSERT(index == ropeLength); 151 ropeBuilder.append(v.toString(exec)); 152 } 163 153 164 154 JSGlobalData* globalData = &exec->globalData(); 165 return new (globalData) JSString(globalData, rope .release());155 return new (globalData) JSString(globalData, ropeBuilder.release()); 166 156 } 167 157
Note:
See TracChangeset
for help on using the changeset viewer.