Changeset 197412 in webkit for trunk/Source/JavaScriptCore/runtime
- Timestamp:
- Mar 1, 2016, 1:45:16 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore/runtime
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/ClassInfo.h
r197391 r197412 106 106 typedef bool (*PreventExtensionsFunctionPtr)(JSObject*, ExecState*); 107 107 PreventExtensionsFunctionPtr preventExtensions; 108 109 typedef bool (*IsExtensibleFunctionPtr)(JSObject*, ExecState*); 110 IsExtensibleFunctionPtr isExtensible; 108 111 109 112 typedef void (*DumpToStreamFunctionPtr)(const JSCell*, PrintStream&); … … 159 162 &ClassName::getTypedArrayImpl, \ 160 163 &ClassName::preventExtensions, \ 164 &ClassName::isExtensible, \ 161 165 &ClassName::dumpToStream, \ 162 166 &ClassName::estimatedSize \ -
trunk/Source/JavaScriptCore/runtime/JSCell.cpp
r197391 r197412 276 276 } 277 277 278 bool JSCell::isExtensible(JSObject*, ExecState*) 279 { 280 RELEASE_ASSERT_NOT_REACHED(); 281 } 282 278 283 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/JSCell.h
r197391 r197412 208 208 static NO_RETURN_DUE_TO_CRASH void getGenericPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); 209 209 static NO_RETURN_DUE_TO_CRASH bool preventExtensions(JSObject*, ExecState*); 210 static NO_RETURN_DUE_TO_CRASH bool isExtensible(JSObject*, ExecState*); 210 211 211 212 static String className(const JSObject*); -
trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
r196745 r197412 886 886 return JSValue::encode(jsUndefined()); 887 887 888 if (!thisObject->isExtensible()) 888 bool isExtensible = thisObject->isExtensibleInline(exec); 889 if (exec->hadException()) 890 return JSValue::encode(jsUndefined()); 891 if (!isExtensible) 889 892 return throwVMError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError)); 890 893 -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r197391 r197412 1678 1678 bool JSObject::preventExtensions(JSObject* object, ExecState* exec) 1679 1679 { 1680 if (!object->isExtensible()) 1680 if (!object->isStructureExtensible()) { 1681 // We've already set the internal [[PreventExtensions]] field to false. 1682 // We don't call the methodTable isExtensible here because it's not defined 1683 // that way in the specification. We are just doing an optimization here. 1681 1684 return true; 1685 } 1682 1686 1683 1687 VM& vm = exec->vm(); … … 1685 1689 object->setStructure(vm, Structure::preventExtensionsTransition(vm, object->structure(vm))); 1686 1690 return true; 1691 } 1692 1693 bool JSObject::isExtensible(JSObject* obj, ExecState*) 1694 { 1695 return obj->isExtensibleImpl(); 1687 1696 } 1688 1697 … … 1822 1831 // 4. If current is undefined and extensible is true, then 1823 1832 if (result.isNewEntry) { 1824 if (!is Extensible()) {1833 if (!isStructureExtensible()) { 1825 1834 map->remove(result.iterator); 1826 1835 return reject(exec, throwException, "Attempting to define property on object that is not extensible."); … … 2038 2047 if (LIKELY(!map)) { 2039 2048 // If the array is not extensible, we should have entered dictionary mode, and created the sparse map. 2040 ASSERT(is Extensible());2049 ASSERT(isStructureExtensible()); 2041 2050 2042 2051 // Update m_length if necessary. … … 2064 2073 if (i >= length) { 2065 2074 // Prohibit growing the array if length is not writable. 2066 if (map->lengthIsReadOnly() || !is Extensible()) {2075 if (map->lengthIsReadOnly() || !isStructureExtensible()) { 2067 2076 if (shouldThrow) 2068 2077 throwTypeError(exec, StrictModeReadonlyPropertyWriteError); … … 2184 2193 if (LIKELY(!map)) { 2185 2194 // If the array is not extensible, we should have entered dictionary mode, and created the spare map. 2186 ASSERT(is Extensible());2195 ASSERT(isStructureExtensible()); 2187 2196 2188 2197 // Update m_length if necessary. … … 2214 2223 if (map->lengthIsReadOnly()) 2215 2224 return reject(exec, mode == PutDirectIndexShouldThrow, StrictModeReadonlyPropertyWriteError); 2216 if (!is Extensible())2225 if (!isStructureExtensible()) 2217 2226 return reject(exec, mode == PutDirectIndexShouldThrow, "Attempting to define property on object that is not extensible."); 2218 2227 } … … 2849 2858 PropertyDescriptor current; 2850 2859 bool isCurrentDefined = getOwnPropertyDescriptor(exec, propertyName, current); 2851 return validateAndApplyPropertyDescriptor(exec, this, propertyName, isExtensible(), descriptor, isCurrentDefined, current, throwException); 2860 bool isExtensible = isExtensibleInline(exec); 2861 if (UNLIKELY(exec->hadException())) 2862 return false; 2863 return validateAndApplyPropertyDescriptor(exec, this, propertyName, isExtensible, descriptor, isCurrentDefined, current, throwException); 2852 2864 } 2853 2865 -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r197391 r197412 616 616 JS_EXPORT_PRIVATE void freeze(VM&); 617 617 JS_EXPORT_PRIVATE static bool preventExtensions(JSObject*, ExecState*); 618 JS_EXPORT_PRIVATE static bool isExtensible(JSObject*, ExecState*); 618 619 bool isSealed(VM& vm) { return structure(vm)->isSealed(vm); } 619 620 bool isFrozen(VM& vm) { return structure(vm)->isFrozen(vm); } 620 bool isExtensible() { return structure()->isExtensible(); } 621 private: 622 ALWAYS_INLINE bool isExtensibleImpl() { return isStructureExtensible(); } 623 public: 624 // You should only call isStructureExtensible() when: 625 // - Performing this check in a way that isn't described in the specification 626 // as calling the virtual [[IsExtensible]] trap. 627 // - When you're guaranteed that object->methodTable()->isExtensible isn't 628 // overridden. 629 ALWAYS_INLINE bool isStructureExtensible() { return structure()->isStructureExtensible(); } 630 // You should call this when performing [[IsExtensible]] trap in a place 631 // that is described in the specification. This performs the fully virtual 632 // [[IsExtensible]] trap. 633 ALWAYS_INLINE bool isExtensibleInline(ExecState* exec) 634 { 635 VM& vm = exec->vm(); 636 auto isExtensibleMethod = methodTable(vm)->isExtensible; 637 if (LIKELY(isExtensibleMethod == JSObject::isExtensible)) 638 return isExtensibleImpl(); 639 640 return isExtensibleMethod(this, exec); 641 } 621 642 bool indexingShouldBeSparse() 622 643 { 623 return !is Extensible()644 return !isStructureExtensible() 624 645 || structure()->typeInfo().interceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero(); 625 646 } … … 1273 1294 } 1274 1295 1275 if ((mode == PutModePut) && !is Extensible())1296 if ((mode == PutModePut) && !isStructureExtensible()) 1276 1297 return false; 1277 1298 … … 1338 1359 } 1339 1360 1340 if ((mode == PutModePut) && !is Extensible())1361 if ((mode == PutModePut) && !isStructureExtensible()) 1341 1362 return false; 1342 1363 -
trunk/Source/JavaScriptCore/runtime/ObjectConstructor.cpp
r197391 r197412 213 213 return JSValue::encode(objectValue); 214 214 215 if (!object->isExtensible()) 215 bool isExtensible = object->isExtensibleInline(exec); 216 if (exec->hadException()) 217 return JSValue::encode(JSValue()); 218 if (!isExtensible) 216 219 return throwVMError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError)); 217 220 … … 617 620 // 3. If the [[Extensible]] internal property of O is false, then return true. 618 621 // 4. Otherwise, return false. 619 return JSValue::encode(jsBoolean(!object->isExtensible())); 622 bool isExtensible = object->isExtensibleInline(exec); 623 if (exec->hadException()) 624 return JSValue::encode(JSValue()); 625 return JSValue::encode(jsBoolean(!isExtensible)); 620 626 } 621 627 … … 651 657 // 3. If the [[Extensible]] internal property of O is false, then return true. 652 658 // 4. Otherwise, return false. 653 return JSValue::encode(jsBoolean(!object->isExtensible())); 659 bool isExtensible = object->isExtensibleInline(exec); 660 if (exec->hadException()) 661 return JSValue::encode(JSValue()); 662 return JSValue::encode(jsBoolean(!isExtensible)); 654 663 } 655 664 … … 659 668 if (!obj.isObject()) 660 669 return JSValue::encode(jsBoolean(false)); 661 return JSValue::encode(jsBoolean(asObject(obj)->isExtensible())); 670 JSObject* object = asObject(obj); 671 bool isExtensible = object->isExtensibleInline(exec); 672 if (exec->hadException()) 673 return JSValue::encode(JSValue()); 674 return JSValue::encode(jsBoolean(isExtensible)); 662 675 } 663 676 -
trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp
r197383 r197412 197 197 // FIXME: this doesn't work if 'target' is another Proxy. We don't have isExtensible implemented in a way that fits w/ Proxys. 198 198 // https://bugs.webkit.org/show_bug.cgi?id=154375 199 if (!target->isExtensible()) { 199 bool isExtensible = target->isExtensibleInline(exec); 200 if (exec->hadException()) 201 return false; 202 if (!isExtensible) { 200 203 // FIXME: Come up with a test for this error. I'm not sure how to because 201 204 // Object.seal(o) will make all fields [[Configurable]] false. … … 208 211 } 209 212 213 bool isExtensible = target->isExtensibleInline(exec); 214 if (exec->hadException()) 215 return false; 210 216 PropertyDescriptor trapResultAsDescriptor; 211 217 toPropertyDescriptor(exec, trapResult, trapResultAsDescriptor); … … 213 219 return false; 214 220 bool throwException = false; 215 bool valid = validateAndApplyPropertyDescriptor(exec, nullptr, propertyName, target->isExtensible(),221 bool valid = validateAndApplyPropertyDescriptor(exec, nullptr, propertyName, isExtensible, 216 222 trapResultAsDescriptor, isTargetPropertyDescriptorDefined, targetPropertyDescriptor, throwException); 217 223 if (!valid) { … … 289 295 return false; 290 296 } 291 if (!target->isExtensible()) { 297 bool isExtensible = target->isExtensibleInline(exec); 298 if (exec->hadException()) 299 return false; 300 if (!isExtensible) { 292 301 throwVMTypeError(exec, ASCIILiteral("Proxy 'has' must return 'true' for a non-extensible 'target' object with a configurable property.")); 293 302 return false; -
trunk/Source/JavaScriptCore/runtime/ReflectObject.cpp
r197391 r197412 169 169 if (!target.isObject()) 170 170 return JSValue::encode(throwTypeError(exec, ASCIILiteral("Reflect.isExtensible requires the first argument be an object"))); 171 return JSValue::encode(jsBoolean(asObject(target)->isExtensible())); 171 172 bool isExtensible = asObject(target)->isExtensibleInline(exec); 173 if (exec->hadException()) 174 return JSValue::encode(JSValue()); 175 return JSValue::encode(jsBoolean(isExtensible)); 172 176 } 173 177 … … 212 216 return JSValue::encode(jsBoolean(true)); 213 217 214 if (!object->isExtensible()) 218 bool isExtensible = object->isExtensibleInline(exec); 219 if (exec->hadException()) 220 return JSValue::encode(JSValue()); 221 if (!isExtensible) 215 222 return JSValue::encode(jsBoolean(false)); 216 223 -
trunk/Source/JavaScriptCore/runtime/SparseArrayValueMap.cpp
r196490 r197412 99 99 // In the uncommon case that this is a new property, and the array is not 100 100 // extensible, this is not the right thing to have done - so remove again. 101 if (result.isNewEntry && !array->is Extensible()) {101 if (result.isNewEntry && !array->isStructureExtensible()) { 102 102 remove(result.iterator); 103 103 if (shouldThrow) … … 119 119 // In the uncommon case that this is a new property, and the array is not 120 120 // extensible, this is not the right thing to have done - so remove again. 121 if (mode != PutDirectIndexLikePutDirect && result.isNewEntry && !array->is Extensible()) {121 if (mode != PutDirectIndexLikePutDirect && result.isNewEntry && !array->isStructureExtensible()) { 122 122 remove(result.iterator); 123 123 return reject(exec, mode == PutDirectIndexShouldThrow, "Attempting to define property on object that is not extensible."); -
trunk/Source/JavaScriptCore/runtime/StringObject.cpp
r187355 r197412 87 87 88 88 if (propertyName == exec->propertyNames().length) { 89 if (!object->isExtensible()) { 89 bool isExtensible = object->isExtensibleInline(exec); 90 if (exec->hadException()) 91 return false; 92 if (!isExtensible) { 90 93 if (throwException) 91 94 exec->vm().throwException(exec, createTypeError(exec, ASCIILiteral("Attempting to define property on object that is not extensible."))); -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r197391 r197412 692 692 bool Structure::isSealed(VM& vm) 693 693 { 694 if (is Extensible())694 if (isStructureExtensible()) 695 695 return false; 696 696 … … 711 711 bool Structure::isFrozen(VM& vm) 712 712 { 713 if (is Extensible())713 if (isStructureExtensible()) 714 714 return false; 715 715 -
trunk/Source/JavaScriptCore/runtime/Structure.h
r197391 r197412 184 184 JS_EXPORT_PRIVATE bool isSealed(VM&); 185 185 JS_EXPORT_PRIVATE bool isFrozen(VM&); 186 bool is Extensible() const { return !didPreventExtensions(); }186 bool isStructureExtensible() const { return !didPreventExtensions(); } 187 187 bool putWillGrowOutOfLineStorage(); 188 188 size_t suggestedNewOutOfLineStorageCapacity();
Note:
See TracChangeset
for help on using the changeset viewer.