+JSValueRef JSObjectGetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName)
+{
+ ExecState* exec = toJS(ctx);
+ APIEntryShim entryShim(exec);
+ JSObject* jsObject = toJS(object);
+ JSValue result;
+ Identifier name(propertyName->identifier(&exec->vm()));
+ if (jsObject->inherits(&JSCallbackObject<JSGlobalObject>::s_info))
+ result = jsCast<JSCallbackObject<JSGlobalObject>*>(jsObject)->getPrivateProperty(name);
+ else if (jsObject->inherits(&JSCallbackObject<JSDestructibleObject>::s_info))
+ result = jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->getPrivateProperty(name);
+#if JSC_OBJC_API_ENABLED
+ else if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info))
+ result = jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->getPrivateProperty(name);
+#endif
+ return toRef(exec, result);
+}
+
+bool JSObjectSetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value)
+{
+ ExecState* exec = toJS(ctx);
+ APIEntryShim entryShim(exec);
+ JSObject* jsObject = toJS(object);
+ JSValue jsValue = value ? toJS(exec, value) : JSValue();
+ Identifier name(propertyName->identifier(&exec->vm()));
+ if (jsObject->inherits(&JSCallbackObject<JSGlobalObject>::s_info)) {
+ jsCast<JSCallbackObject<JSGlobalObject>*>(jsObject)->setPrivateProperty(exec->vm(), name, jsValue);
+ return true;
+ }
+ if (jsObject->inherits(&JSCallbackObject<JSDestructibleObject>::s_info)) {
+ jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->setPrivateProperty(exec->vm(), name, jsValue);
+ return true;
+ }
+#if JSC_OBJC_API_ENABLED
+ if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info)) {
+ jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->setPrivateProperty(exec->vm(), name, jsValue);
+ return true;
+ }
+#endif
+ return false;
+}
+
+bool JSObjectDeletePrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName)
+{
+ ExecState* exec = toJS(ctx);
+ APIEntryShim entryShim(exec);
+ JSObject* jsObject = toJS(object);
+ Identifier name(propertyName->identifier(&exec->vm()));
+ if (jsObject->inherits(&JSCallbackObject<JSGlobalObject>::s_info)) {
+ jsCast<JSCallbackObject<JSGlobalObject>*>(jsObject)->deletePrivateProperty(name);
+ return true;
+ }
+ if (jsObject->inherits(&JSCallbackObject<JSDestructibleObject>::s_info)) {
+ jsCast<JSCallbackObject<JSDestructibleObject>*>(jsObject)->deletePrivateProperty(name);
+ return true;
+ }
+#if JSC_OBJC_API_ENABLED
+ if (jsObject->inherits(&JSCallbackObject<JSAPIWrapperObject>::s_info)) {
+ jsCast<JSCallbackObject<JSAPIWrapperObject>*>(jsObject)->deletePrivateProperty(name);
+ return true;
+ }
+#endif
+ return false;
+}
+