/*! Returns the value of the \a name property for this context as a QVariant. */ QVariant QDeclarativeContext::contextProperty(const QString &name) const { Q_D(const QDeclarativeContext); QVariant value; int idx = -1; QDeclarativeContextData *data = d->data; if (data->propertyNames) idx = data->propertyNames->value(name); if (idx == -1) { QByteArray utf8Name = name.toUtf8(); if (data->contextObject) { QObject *obj = data->contextObject; QDeclarativePropertyCache::Data local; QDeclarativePropertyCache::Data *property = QDeclarativePropertyCache::property(data->engine, obj, name, local); if (property) value = obj->metaObject()->property(property->coreIndex).read(obj); } if (!value.isValid() && parentContext()) value = parentContext()->contextProperty(name); } else { if (idx >= d->propertyValues.count()) value = QVariant::fromValue(data->idValues[idx - d->propertyValues.count()].data()); else value = d->propertyValues[idx]; } return value; }
/*! Returns the value of the \a name property for this context as a QVariant. */ QVariant QQmlContext::contextProperty(const QString &name) const { Q_D(const QQmlContext); QVariant value; int idx = -1; QQmlContextData *data = d->data; const QV4::IdentifierHash<int> &properties = data->propertyNames(); if (properties.count()) idx = properties.value(name); if (idx == -1) { if (data->contextObject) { QObject *obj = data->contextObject; QQmlPropertyData local; QQmlPropertyData *property = QQmlPropertyCache::property(data->engine, obj, name, data, local); if (property) value = obj->metaObject()->property(property->coreIndex()).read(obj); } if (!value.isValid() && parentContext()) value = parentContext()->contextProperty(name); } else { if (idx >= d->propertyValues.count()) value = QVariant::fromValue(data->idValues[idx - d->propertyValues.count()].data()); else value = d->propertyValues[idx]; } return value; }
/*! Returns true if the function was called as a constructor (e.g. \c{"new foo()"}); otherwise returns false. When a function is called as constructor, the thisObject() contains the newly constructed object to be initialized. \note This function is only guaranteed to work for a context corresponding to native functions. */ bool QScriptContext::isCalledAsConstructor() const { JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this)); QScript::APIShim shim(QScript::scriptEngineFromExec(frame)); //For native functions, look up flags. uint flags = QScriptEnginePrivate::contextFlags(frame); if (flags & QScriptEnginePrivate::NativeContext) return flags & QScriptEnginePrivate::CalledAsConstructorContext; //Not a native function, try to look up in the bytecode if we where called from op_construct JSC::Instruction* returnPC = frame->returnPC(); if (!returnPC) return false; JSC::CallFrame *callerFrame = QScriptEnginePrivate::frameForContext(parentContext()); if (!callerFrame) return false; if (returnPC[-JSC::op_construct_length].u.opcode == frame->interpreter()->getOpcode(JSC::op_construct)) { //We are maybe called from the op_construct opcode which has 6 opperands. //But we need to check we are not called from op_call with 4 opperands //we make sure that the returnPC[-1] (thisRegister) is smaller than the returnPC[-3] (registerOffset) //as if it was an op_call, the returnPC[-1] would be the registerOffset, bigger than returnPC[-3] (funcRegister) return returnPC[-1].u.operand < returnPC[-3].u.operand; } return false; }
QDebug RDFServiceBasic::logMessage(int level, char const *func, char const *loc) const { int dmsgc = attributes_["debug_message_count"].toInt(); attributes_["debug_message_count"] = QVariant(dmsgc + 1); QDebug log = parentContext()->logMessage(level, func, loc); log.nospace() << "[RDFService(" << name_ << ' ' << (void *)this << ") " << qSetFieldWidth(4) << dmsgc << qSetFieldWidth(0) << "]"; return log.space(); }
/*! \since 4.4 Returns a string representation of this context. This is useful for debugging. \sa backtrace() */ QString QScriptContext::toString() const { QScriptContextInfo info(this); QString result; QString functionName = info.functionName(); if (functionName.isEmpty()) { if (parentContext()) { const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this); if (info.functionType() == QScriptContextInfo::ScriptFunction) result.append(QLatin1String("<anonymous>")); else if(frame->callerFrame()->hasHostCallFrameFlag()) result.append(QLatin1String("<eval>")); else result.append(QLatin1String("<native>")); } else { result.append(QLatin1String("<global>")); } } else { result.append(functionName); } QStringList parameterNames = info.functionParameterNames(); result.append(QLatin1Char('(')); for (int i = 0; i < argumentCount(); ++i) { if (i > 0) result.append(QLatin1String(", ")); if (i < parameterNames.count()) { result.append(parameterNames.at(i)); result.append(QLatin1String(" = ")); } QScriptValue arg = argument(i); if (arg.isString()) result.append(QLatin1Char('\'')); result.append(arg.toString()); if (arg.isString()) result.append(QLatin1Char('\'')); } result.append(QLatin1Char(')')); QString fileName = info.fileName(); int lineNumber = info.lineNumber(); result.append(QLatin1String(" at ")); if (!fileName.isEmpty()) { result.append(fileName); result.append(QLatin1Char(':')); } result.append(QString::number(lineNumber)); return result; }
QScriptValue QScriptContext::activationObject() const { JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this)); QScript::APIShim shim(QScript::scriptEngineFromExec(frame)); JSC::JSObject *result = 0; uint flags = QScriptEnginePrivate::contextFlags(frame); if ((flags & QScriptEnginePrivate::NativeContext) && !(flags & QScriptEnginePrivate::HasScopeContext)) { //For native functions, lazily create it if needed QScript::QScriptActivationObject *scope = new (frame) QScript::QScriptActivationObject(frame); frame->setScopeChain(frame->scopeChain()->copy()->push(scope)); result = scope; QScriptEnginePrivate::setContextFlags(frame, flags | QScriptEnginePrivate::HasScopeContext); } else { // look in scope chain JSC::ScopeChainNode *node = frame->scopeChain(); JSC::ScopeChainIterator it(node); for (it = node->begin(); it != node->end(); ++it) { if ((*it) && (*it)->isVariableObject()) { result = *it; break; } } } if (!result) { if (!parentContext()) return engine()->globalObject(); qWarning("QScriptContext::activationObject: could not get activation object for frame"); return QScriptValue(); /*JSC::CodeBlock *codeBlock = frame->codeBlock(); if (!codeBlock) { // non-Qt native function Q_ASSERT(true); //### this should in theorry not happen result = new (frame)QScript::QScriptActivationObject(frame); } else { // ### this is wrong JSC::FunctionBodyNode *body = static_cast<JSC::FunctionBodyNode*>(codeBlock->ownerNode()); result = new (frame)JSC::JSActivation(frame, body); }*/ } if (result && result->inherits(&QScript::QScriptActivationObject::info) && (static_cast<QScript::QScriptActivationObject*>(result)->delegate() != 0)) { // Return the object that property access is being delegated to result = static_cast<QScript::QScriptActivationObject*>(result)->delegate(); } return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(result); }
/*! \since 4.4 Returns a string representation of this context. This is useful for debugging. \sa backtrace() */ QString QScriptContext::toString() const { QScriptContextInfo info(this); QString result; QString functionName = info.functionName(); if (functionName.isEmpty()) { if (parentContext()) { if (info.functionType() == QScriptContextInfo::ScriptFunction) result.append(QLatin1String("<anonymous>")); else result.append(QLatin1String("<native>")); } else { result.append(QLatin1String("<global>")); } } else { result.append(functionName); } QStringList parameterNames = info.functionParameterNames(); result.append(QLatin1String(" (")); for (int i = 0; i < argumentCount(); ++i) { if (i > 0) result.append(QLatin1String(", ")); if (i < parameterNames.count()) { result.append(parameterNames.at(i)); result.append(QLatin1Char('=')); } QScriptValue arg = argument(i); result.append(safeValueToString(arg)); } result.append(QLatin1String(")")); QString fileName = info.fileName(); int lineNumber = info.lineNumber(); result.append(QLatin1String(" at ")); if (!fileName.isEmpty()) { result.append(fileName); result.append(QLatin1Char(':')); } result.append(QString::number(lineNumber)); return result; }
void RenderLayerClipper::calculateClipRects(const ClipRectsContext& clipRectsContext, ClipRects& clipRects) const { if (!m_renderer->layer()->parent()) { // The root layer's clip rect is always infinite. clipRects.reset(PaintInfo::infiniteRect()); return; } ClipRectsType clipRectsType = clipRectsContext.clipRectsType; bool useCached = clipRectsType != TemporaryClipRects; // For transformed layers, the root layer was shifted to be us, so there is no need to // examine the parent. We want to cache clip rects with us as the root. RenderLayer* parentLayer = clipRectsContext.rootLayer != m_renderer->layer() ? m_renderer->layer()->parent() : 0; // Ensure that our parent's clip has been calculated so that we can examine the values. if (parentLayer) { if (useCached && parentLayer->clipper().clipRects(clipRectsContext)) { clipRects = *parentLayer->clipper().clipRects(clipRectsContext); } else { ClipRectsContext parentContext(clipRectsContext); parentContext.overlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize; // FIXME: why? parentLayer->clipper().calculateClipRects(parentContext, clipRects); } } else { clipRects.reset(PaintInfo::infiniteRect()); } // A fixed object is essentially the root of its containing block hierarchy, so when // we encounter such an object, we reset our clip rects to the fixedClipRect. if (m_renderer->style()->position() == FixedPosition) { clipRects.setPosClipRect(clipRects.fixedClipRect()); clipRects.setOverflowClipRect(clipRects.fixedClipRect()); clipRects.setFixed(true); } else if (m_renderer->style()->hasInFlowPosition()) { clipRects.setPosClipRect(clipRects.overflowClipRect()); } else if (m_renderer->style()->position() == AbsolutePosition) { clipRects.setOverflowClipRect(clipRects.posClipRect()); } // Update the clip rects that will be passed to child layers. if ((m_renderer->hasOverflowClip() && (clipRectsContext.respectOverflowClip == RespectOverflowClip || m_renderer->layer() != clipRectsContext.rootLayer)) || m_renderer->hasClip()) { // This layer establishes a clip of some kind. // This offset cannot use convertToLayerCoords, because sometimes our rootLayer may be across // some transformed layer boundary, for example, in the RenderLayerCompositor overlapMap, where // clipRects are needed in view space. LayoutPoint offset; offset = roundedLayoutPoint(m_renderer->localToContainerPoint(FloatPoint(), clipRectsContext.rootLayer->renderer())); RenderView* view = m_renderer->view(); ASSERT(view); if (view && clipRects.fixed() && clipRectsContext.rootLayer->renderer() == view) { offset -= view->frameView()->scrollOffsetForFixedPosition(); } if (m_renderer->hasOverflowClip()) { ClipRect newOverflowClip = toRenderBox(m_renderer)->overflowClipRect(offset, clipRectsContext.region, clipRectsContext.overlayScrollbarSizeRelevancy); if (m_renderer->style()->hasBorderRadius()) newOverflowClip.setHasRadius(true); clipRects.setOverflowClipRect(intersection(newOverflowClip, clipRects.overflowClipRect())); if (m_renderer->isPositioned()) clipRects.setPosClipRect(intersection(newOverflowClip, clipRects.posClipRect())); } if (m_renderer->hasClip()) { LayoutRect newPosClip = toRenderBox(m_renderer)->clipRect(offset, clipRectsContext.region); clipRects.setPosClipRect(intersection(newPosClip, clipRects.posClipRect())); clipRects.setOverflowClipRect(intersection(newPosClip, clipRects.overflowClipRect())); clipRects.setFixedClipRect(intersection(newPosClip, clipRects.fixedClipRect())); } } }