Changeset 34095 in webkit for trunk/JavaScriptCore
- Timestamp:
- May 23, 2008, 4:44:40 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r34092 r34095 1 2008-05-23 Anders Carlsson <[email protected]> 2 3 Reviewed by Geoff. 4 5 <rdar://problem/5959886> REGRESSION: Assertion failure in JSImmediate::toString when loading GMail (19217) 6 7 Change List to store a JSValue*** pointer + an offset instead of a JSValue** pointer to protect against the case where 8 a register file changes while a list object points to its buffer. 9 10 * VM/Machine.cpp: 11 (KJS::Machine::privateExecute): 12 * kjs/JSActivation.cpp: 13 (KJS::JSActivation::createArgumentsObject): 14 * kjs/list.cpp: 15 (KJS::List::getSlice): 16 * kjs/list.h: 17 (KJS::List::List): 18 (KJS::List::at): 19 (KJS::List::append): 20 (KJS::List::begin): 21 (KJS::List::end): 22 (KJS::List::buffer): 23 1 24 2008-05-23 Kevin McCullough <[email protected]> 2 25 -
trunk/JavaScriptCore/VM/Machine.cpp
r34090 r34095 1941 1941 JSObject* thisObj = static_cast<JSObject*>(r[argv].u.jsValue); 1942 1942 1943 List args( &r[argv + 1].u.jsValue, argc - 1);1943 List args(reinterpret_cast<JSValue***>(registerBase), registerOffset + argv + 1, argc - 1); 1944 1944 1945 1945 registerFile->setSafeForReentry(true); … … 2059 2059 int registerOffset = r - (*registerBase); 2060 2060 2061 List args(&r[argv + 1].u.jsValue, argc - 1); 2061 List args(reinterpret_cast<JSValue***>(registerBase), registerOffset + argv + 1, argc - 1); 2062 2062 2063 registerFile->setSafeForReentry(true); 2063 2064 JSValue* returnValue = constructor->construct(exec, args); -
trunk/JavaScriptCore/kjs/JSActivation.cpp
r33979 r34095 186 186 int argc; 187 187 exec->machine()->getFunctionAndArguments(registerBase(), callFrame, function, argv, argc); 188 List args( &argv->u.jsValue, argc);188 List args(reinterpret_cast<JSValue***>(registerBase()), argv - *registerBase(), argc); 189 189 return new Arguments(exec, function, args, this); 190 190 } -
trunk/JavaScriptCore/kjs/list.cpp
r33979 r34095 33 33 result.m_vector.appendRange(start, end()); 34 34 result.m_size = result.m_vector.size(); 35 result.m_buffer = result.m_vector.data();35 result.m_bufferSlot = result.m_vector.dataSlot(); 36 36 } 37 37 -
trunk/JavaScriptCore/kjs/list.h
r33979 r34095 50 50 #endif 51 51 { 52 m_buffer = m_vector.data(); 52 m_bufferSlot = m_vector.dataSlot(); 53 m_offset = 0; 53 54 m_size = m_vector.size(); 54 55 } 55 56 56 57 // Constructor for a read-only list whose data has already been allocated elsewhere. 57 List(JSValue** buffer, size_t size) 58 : m_buffer(buffer) 58 List(JSValue*** bufferSlot, size_t offset, size_t size) 59 : m_bufferSlot(bufferSlot) 60 , m_offset(offset) 59 61 , m_size(size) 60 62 , m_isInMarkSet(false) … … 77 79 { 78 80 if (i < m_size) 79 return m_buffer[i];81 return buffer()[i]; 80 82 return jsUndefined(); 81 83 } … … 101 103 // "just append" case. 102 104 expandAndAppend(v); 103 m_buffer = m_vector.data();105 m_bufferSlot = m_vector.dataSlot(); 104 106 ++m_size; 105 107 } … … 108 110 void getSlice(int startIndex, List& result) const; 109 111 110 iterator begin() { return m_buffer; }111 iterator end() { return m_buffer+ m_size; }112 iterator begin() { return buffer(); } 113 iterator end() { return buffer() + m_size; } 112 114 113 const_iterator begin() const { return m_buffer; }114 const_iterator end() const { return m_buffer+ m_size; }115 const_iterator begin() const { return buffer(); } 116 const_iterator end() const { return buffer() + m_size; } 115 117 116 118 static void markProtectedLists() … … 127 129 void expandAndAppend(JSValue*); 128 130 129 JSValue** m_buffer; 131 JSValue** buffer() const { return *m_bufferSlot + m_offset; } 132 133 JSValue*** m_bufferSlot; 134 size_t m_offset; 130 135 size_t m_size; 131 136
Note:
See TracChangeset
for help on using the changeset viewer.