src/script/bridge/qscriptclassobject.cpp
changeset 30 5dc02b23752f
parent 19 fcece45ef507
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    82         return true;
    82         return true;
    83     }
    83     }
    84     return false;
    84     return false;
    85 }
    85 }
    86 
    86 
       
    87 bool ClassObjectDelegate::getOwnPropertyDescriptor(QScriptObject *object,
       
    88                                                    JSC::ExecState *exec,
       
    89                                                    const JSC::Identifier &propertyName,
       
    90                                                    JSC::PropertyDescriptor &descriptor)
       
    91 {
       
    92     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
       
    93     QScript::SaveFrameHelper saveFrame(engine, exec);
       
    94     // for compatibility with the old back-end, normal JS properties
       
    95     // are queried first.
       
    96     if (QScriptObjectDelegate::getOwnPropertyDescriptor(object, exec, propertyName, descriptor))
       
    97         return true;
       
    98 
       
    99     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
       
   100     QScriptString scriptName;
       
   101     QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated);
       
   102     QScriptStringPrivate::init(scriptName, &scriptName_d);
       
   103     uint id = 0;
       
   104     QScriptClass::QueryFlags qflags = m_scriptClass->queryProperty(
       
   105         scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
       
   106     if (qflags & QScriptClass::HandlesReadAccess) {
       
   107         QScriptValue::PropertyFlags pflags = m_scriptClass->propertyFlags(scriptObject, scriptName, id);
       
   108         unsigned attribs = 0;
       
   109         if (pflags & QScriptValue::ReadOnly)
       
   110             attribs |= JSC::ReadOnly;
       
   111         if (pflags & QScriptValue::SkipInEnumeration)
       
   112             attribs |= JSC::DontEnum;
       
   113         if (pflags & QScriptValue::Undeletable)
       
   114             attribs |= JSC::DontDelete;
       
   115         if (pflags & QScriptValue::PropertyGetter)
       
   116             attribs |= JSC::Getter;
       
   117         if (pflags & QScriptValue::PropertySetter)
       
   118             attribs |= JSC::Setter;
       
   119         attribs |= pflags & QScriptValue::UserRange;
       
   120         // Rather than calling the getter, we could return an access descriptor here.
       
   121         QScriptValue value = m_scriptClass->property(scriptObject, scriptName, id);
       
   122         descriptor.setDescriptor(engine->scriptValueToJSCValue(value), attribs);
       
   123         return true;
       
   124     }
       
   125     return false;
       
   126 }
       
   127 
    87 void ClassObjectDelegate::put(QScriptObject* object, JSC::ExecState *exec,
   128 void ClassObjectDelegate::put(QScriptObject* object, JSC::ExecState *exec,
    88                               const JSC::Identifier &propertyName,
   129                               const JSC::Identifier &propertyName,
    89                               JSC::JSValue value, JSC::PutPropertySlot &slot)
   130                               JSC::JSValue value, JSC::PutPropertySlot &slot)
    90 {
   131 {
    91     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
   132     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
   103     }
   144     }
   104     QScriptObjectDelegate::put(object, exec, propertyName, value, slot);
   145     QScriptObjectDelegate::put(object, exec, propertyName, value, slot);
   105 }
   146 }
   106 
   147 
   107 bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
   148 bool ClassObjectDelegate::deleteProperty(QScriptObject* object, JSC::ExecState *exec,
   108                                          const JSC::Identifier &propertyName,
   149                                          const JSC::Identifier &propertyName)
   109                                          bool checkDontDelete)
       
   110 {
   150 {
   111     // ### avoid duplication of put()
   151     // ### avoid duplication of put()
   112     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
   152     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
   113     QScript::SaveFrameHelper saveFrame(engine, exec);
   153     QScript::SaveFrameHelper saveFrame(engine, exec);
   114     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
   154     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
   122         if (m_scriptClass->propertyFlags(scriptObject, scriptName, id) & QScriptValue::Undeletable)
   162         if (m_scriptClass->propertyFlags(scriptObject, scriptName, id) & QScriptValue::Undeletable)
   123             return false;
   163             return false;
   124         m_scriptClass->setProperty(scriptObject, scriptName, id, QScriptValue());
   164         m_scriptClass->setProperty(scriptObject, scriptName, id, QScriptValue());
   125         return true;
   165         return true;
   126     }
   166     }
   127     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName, checkDontDelete);
   167     return QScriptObjectDelegate::deleteProperty(object, exec, propertyName);
   128 }
       
   129 
       
   130 bool ClassObjectDelegate::getPropertyAttributes(const QScriptObject* object, JSC::ExecState *exec,
       
   131                                                 const JSC::Identifier &propertyName,
       
   132                                                 unsigned &attribs) const
       
   133 {
       
   134     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
       
   135     QScript::SaveFrameHelper saveFrame(engine, exec);
       
   136     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
       
   137     QScriptString scriptName;
       
   138     QScriptStringPrivate scriptName_d(engine, propertyName, QScriptStringPrivate::StackAllocated);
       
   139     QScriptStringPrivate::init(scriptName, &scriptName_d);
       
   140     uint id = 0;
       
   141     QScriptClass::QueryFlags flags = m_scriptClass->queryProperty(
       
   142         scriptObject, scriptName, QScriptClass::HandlesReadAccess, &id);
       
   143     if (flags & QScriptClass::HandlesReadAccess) {
       
   144         QScriptValue::PropertyFlags flags = m_scriptClass->propertyFlags(scriptObject, scriptName, id);
       
   145         attribs = 0;
       
   146         if (flags & QScriptValue::ReadOnly)
       
   147             attribs |= JSC::ReadOnly;
       
   148         if (flags & QScriptValue::SkipInEnumeration)
       
   149             attribs |= JSC::DontEnum;
       
   150         if (flags & QScriptValue::Undeletable)
       
   151             attribs |= JSC::DontDelete;
       
   152         if (flags & QScriptValue::PropertyGetter)
       
   153             attribs |= JSC::Getter;
       
   154         if (flags & QScriptValue::PropertySetter)
       
   155             attribs |= JSC::Setter;
       
   156         attribs |= flags & QScriptValue::UserRange;
       
   157         return true;
       
   158     }
       
   159     return QScriptObjectDelegate::getPropertyAttributes(object, exec, propertyName, attribs);
       
   160 }
   168 }
   161 
   169 
   162 void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
   170 void ClassObjectDelegate::getOwnPropertyNames(QScriptObject* object, JSC::ExecState *exec,
   163                                               JSC::PropertyNameArray &propertyNames,
   171                                               JSC::PropertyNameArray &propertyNames,
   164                                               bool includeNonEnumerable)
   172                                               JSC::EnumerationMode mode)
   165 {
   173 {
   166     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
   174     QScriptEnginePrivate *engine = scriptEngineFromExec(exec);
   167     QScript::SaveFrameHelper saveFrame(engine, exec);
   175     QScript::SaveFrameHelper saveFrame(engine, exec);
   168     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
   176     QScriptValue scriptObject = engine->scriptValueFromJSCValue(object);
   169     QScriptClassPropertyIterator *it = m_scriptClass->newIterator(scriptObject);
   177     QScriptClassPropertyIterator *it = m_scriptClass->newIterator(scriptObject);
   173             QString name = it->name().toString();
   181             QString name = it->name().toString();
   174             propertyNames.add(JSC::Identifier(exec, name));
   182             propertyNames.add(JSC::Identifier(exec, name));
   175         }
   183         }
   176         delete it;
   184         delete it;
   177     }
   185     }
   178     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, includeNonEnumerable);
   186     QScriptObjectDelegate::getOwnPropertyNames(object, exec, propertyNames, mode);
   179 }
   187 }
   180 
   188 
   181 JSC::CallType ClassObjectDelegate::getCallData(QScriptObject*, JSC::CallData &callData)
   189 JSC::CallType ClassObjectDelegate::getCallData(QScriptObject*, JSC::CallData &callData)
   182 {
   190 {
   183     if (!m_scriptClass->supportsExtension(QScriptClass::Callable))
   191     if (!m_scriptClass->supportsExtension(QScriptClass::Callable))
   204     QScriptContext *ctx = eng_p->contextForFrame(eng_p->currentFrame);
   212     QScriptContext *ctx = eng_p->contextForFrame(eng_p->currentFrame);
   205     QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj);
   213     QScriptValue scriptObject = eng_p->scriptValueFromJSCValue(obj);
   206     QVariant result = scriptClass->extension(QScriptClass::Callable, qVariantFromValue(ctx));
   214     QVariant result = scriptClass->extension(QScriptClass::Callable, qVariantFromValue(ctx));
   207     eng_p->popContext();
   215     eng_p->popContext();
   208     eng_p->currentFrame = oldFrame;
   216     eng_p->currentFrame = oldFrame;
   209     return eng_p->jscValueFromVariant(result);
   217     return QScriptEnginePrivate::jscValueFromVariant(exec, result);
   210 }
   218 }
   211 
   219 
   212 JSC::ConstructType ClassObjectDelegate::getConstructData(QScriptObject*, JSC::ConstructData &constructData)
   220 JSC::ConstructType ClassObjectDelegate::getConstructData(QScriptObject*, JSC::ConstructData &constructData)
   213 {
   221 {
   214     if (!m_scriptClass->supportsExtension(QScriptClass::Callable))
   222     if (!m_scriptClass->supportsExtension(QScriptClass::Callable))