- JSCallbackObject* thisObject = jsCast<JSCallbackObject*>(object);
- PropertySlot slot;
- if (thisObject->methodTable()->getOwnPropertySlot(thisObject, exec, propertyName, slot)) {
- // Ideally we should return an access descriptor, but returning a value descriptor is better than nothing.
- JSValue value = slot.getValue(exec, propertyName);
- if (!exec->hadException())
- descriptor.setValue(value);
- // We don't know whether the property is configurable, but assume it is.
- descriptor.setConfigurable(true);
- // We don't know whether the property is enumerable (we could call getOwnPropertyNames() to find out), but assume it isn't.
- descriptor.setEnumerable(false);
- return true;
+ JSCallbackObject* thisObject = jsCast<JSCallbackObject*>(cell);
+ JSContextRef ctx = toRef(exec);
+ JSObjectRef thisRef = toRef(thisObject);
+ RefPtr<OpaqueJSString> propertyNameRef;
+ JSValueRef valueRef = toRef(exec, value);
+
+ if (StringImpl* name = propertyName.uid()) {
+ for (JSClassRef jsClass = thisObject->classRef(); jsClass; jsClass = jsClass->parentClass) {
+ if (JSObjectSetPropertyCallback setProperty = jsClass->setProperty) {
+ if (!propertyNameRef)
+ propertyNameRef = OpaqueJSString::create(name);
+ JSValueRef exception = 0;
+ bool result;
+ {
+ JSLock::DropAllLocks dropAllLocks(exec);
+ result = setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, &exception);
+ }
+ if (exception)
+ exec->vm().throwException(exec, toJS(exec, exception));
+ if (result || exception)
+ return;
+ }
+
+ if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) {
+ if (StaticValueEntry* entry = staticValues->get(name)) {
+ if (entry->attributes & kJSPropertyAttributeReadOnly)
+ return;
+ if (JSObjectSetPropertyCallback setProperty = entry->setProperty) {
+ JSValueRef exception = 0;
+ bool result;
+ {
+ JSLock::DropAllLocks dropAllLocks(exec);
+ result = setProperty(ctx, thisRef, entry->propertyNameRef.get(), valueRef, &exception);
+ }
+ if (exception)
+ exec->vm().throwException(exec, toJS(exec, exception));
+ if (result || exception)
+ return;
+ }
+ }
+ }
+
+ if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) {
+ if (StaticFunctionEntry* entry = staticFunctions->get(name)) {
+ if (entry->attributes & kJSPropertyAttributeReadOnly)
+ return;
+ thisObject->JSCallbackObject<Parent>::putDirect(exec->vm(), propertyName, value); // put as override property
+ return;
+ }
+ }
+ }