Advertisement
Guest User

Untitled

a guest
Jul 29th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.49 KB | None | 0 0
  1. commit b4b92b67407cdb7c3a82123cd6dff31bad48d047
  2. Author: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
  3. Date: Tue Mar 1 09:40:48 2011 -0300
  4.  
  5. QScriptContext: identify explicity the kinds of contexts
  6.  
  7. There are five different kinds of QScriptContext(Private)
  8. implementations, for different purposes. This commit adds inline
  9. functions to identify them according the invariants that each one has,
  10. with the intetion of making things more readable.
  11.  
  12. diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp
  13. index 3f1cd4d..c98f447 100644
  14. --- a/src/script/api/qscriptcontext.cpp
  15. +++ b/src/script/api/qscriptcontext.cpp
  16. @@ -277,9 +277,9 @@ QScriptValue QScriptContext::argumentsObject() const
  17. */
  18. bool QScriptContext::isCalledAsConstructor() const
  19. {
  20. - if (d_ptr->arguments)
  21. + if (d_ptr->isNativeFunction())
  22. return d_ptr->arguments->IsConstructCall();
  23. - if (!d_ptr->frame.IsEmpty()) {
  24. + if (d_ptr->isJSFrame()) {
  25. QScriptIsolate api(d_ptr->engine);
  26. return d_ptr->frame->IsConstructor();
  27. }
  28. @@ -305,7 +305,7 @@ QScriptContext *QScriptContext::parentContext() const
  29. }
  30. if (d_ptr->previous)
  31. return d_ptr->previous;
  32. - if (!d_ptr->frame.IsEmpty())
  33. + if (d_ptr->isJSFrame())
  34. return 0; //skip all the native contexts. They are unfortunately hidden by V8, we reached the end of the stack already.
  35. return d_ptr->parent;
  36. }
  37. @@ -457,18 +457,16 @@ QString QScriptContext::toString() const
  38.  
  39. QString functionName = info.functionName();
  40. if (functionName.isEmpty()) {
  41. - if (!d_ptr->parent || (!d_ptr->previous && !d_ptr->frame.IsEmpty())) {
  42. + if (d_ptr->isGlobalContext() || (!d_ptr->previous && d_ptr->isJSFrame())) {
  43. result.append(QLatin1String("<global>"));
  44. - } else {
  45. - if (d_ptr->frame.IsEmpty()) {
  46. + } else if (!d_ptr->isJSFrame()) {
  47. result.append(QLatin1String("<native>"));
  48. + } else {
  49. + QScriptIsolate api(d_ptr->engine);
  50. + if (d_ptr->frame->IsEval()) {
  51. + result.append(QLatin1String("<eval>"));
  52. } else {
  53. - QScriptIsolate api(d_ptr->engine);
  54. - if (d_ptr->frame->IsEval()) {
  55. - result.append(QLatin1String("<eval>"));
  56. - } else {
  57. - result.append(QLatin1String("<anonymous>"));
  58. - }
  59. + result.append(QLatin1String("<anonymous>"));
  60. }
  61. }
  62. } else {
  63. diff --git a/src/script/api/qscriptcontext_impl_p.h b/src/script/api/qscriptcontext_impl_p.h
  64. index 6e542d3..ff6bccc 100644
  65. --- a/src/script/api/qscriptcontext_impl_p.h
  66. +++ b/src/script/api/qscriptcontext_impl_p.h
  67. @@ -56,6 +56,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptEnginePrivate *engine
  68. m_callee(v8::Persistent<v8::Value>::New(callee)), hasArgumentGetter(false)
  69. {
  70. Q_ASSERT(engine);
  71. + Q_ASSERT(parent);
  72. context->Enter();
  73. }
  74.  
  75. @@ -65,6 +66,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptEnginePrivate *engine
  76. parent(engine->setCurrentQSContext(this)), previous(0), hasArgumentGetter(false)
  77. {
  78. Q_ASSERT(engine);
  79. + Q_ASSERT(parent);
  80. context->Enter();
  81. }
  82.  
  83. @@ -74,6 +76,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptEnginePrivate *engine
  84. previous(0), hasArgumentGetter(false)
  85. {
  86. Q_ASSERT(engine);
  87. + Q_ASSERT(parent);
  88. context->Enter();
  89. }
  90.  
  91. @@ -82,6 +85,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptContextPrivate *paren
  92. parent(parent), previous(0), frame(v8::Persistent<v8::StackFrame>::New(frame)), hasArgumentGetter(false)
  93. {
  94. Q_ASSERT(engine);
  95. + Q_ASSERT(parent);
  96. }
  97.  
  98.  
  99. @@ -94,10 +98,10 @@ inline QScriptContextPrivate::~QScriptContextPrivate()
  100. m_thisObject.Dispose();
  101. m_callee.Dispose();
  102.  
  103. - if (!parent)
  104. + if (isGlobalContext())
  105. return;
  106.  
  107. - if (frame.IsEmpty()) {
  108. + if (!isJSFrame()) {
  109. QScriptContextPrivate *old = engine->setCurrentQSContext(parent);
  110. if (old != this) {
  111. qWarning("QScriptEngine::pushContext() doesn't match with popContext()");
  112. @@ -123,7 +127,7 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argument(i
  113. if (index < 0)
  114. return InvalidValue();
  115.  
  116. - if (arguments) {
  117. + if (isNativeFunction()) {
  118. if (index >= arguments->Length())
  119. return new QScriptValuePrivate(engine, QScriptValue::UndefinedValue);
  120.  
  121. @@ -135,7 +139,7 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argument(i
  122.  
  123. inline int QScriptContextPrivate::argumentCount() const
  124. {
  125. - if (arguments) {
  126. + if (isNativeFunction()) {
  127. return arguments->Length();
  128. }
  129.  
  130. @@ -144,7 +148,7 @@ inline int QScriptContextPrivate::argumentCount() const
  131.  
  132. inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argumentsObject() const
  133. {
  134. - if (arguments) {
  135. + if (isNativeFunction()) {
  136. if (!argsObject) {
  137. QScriptContextPrivate *that = const_cast<QScriptContextPrivate *>(this);
  138. that->argsObject = that->createArgumentsObject();
  139. @@ -157,9 +161,9 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argumentsO
  140.  
  141. inline v8::Handle<v8::Object> QScriptContextPrivate::thisObject() const
  142. {
  143. - if (arguments) {
  144. + if (isNativeFunction()) {
  145. return arguments->This();
  146. - } else if (accessorInfo) {
  147. + } else if (isNativeAccessor()) {
  148. return accessorInfo->This();
  149. } else if (!m_thisObject.IsEmpty()) {
  150. return m_thisObject;
  151. @@ -170,22 +174,25 @@ inline v8::Handle<v8::Object> QScriptContextPrivate::thisObject() const
  152.  
  153. inline void QScriptContextPrivate::setThisObject(QScriptValuePrivate *newThis)
  154. {
  155. - if (!newThis->isObject()) {
  156. -// qWarning() << "QScriptContext::setThisObject: cannot set this object for native context";
  157. + if (isNativeFunction() || isNativeAccessor() || isJSFrame()) {
  158. + qWarning("QScriptContext::setThisObject: cannot set this object for context");
  159. return;
  160. }
  161. +
  162. + if (!newThis->isObject())
  163. + return;
  164. +
  165. if (newThis->engine() != engine) {
  166. qWarning("QScriptContext::setThisObject() failed: cannot set an object created in "
  167. "a different engine");
  168. return;
  169. }
  170. - if (!parent) {
  171. - //global object
  172. +
  173. + if (isGlobalContext()) {
  174. engine->setGlobalObject(newThis);
  175. return;
  176. }
  177. - if (!frame.IsEmpty())
  178. - qWarning() << "QScriptContext::setThisObject: cannot set this object for native context";
  179. +
  180. m_thisObject.Dispose();
  181. m_thisObject = v8::Persistent<v8::Object>::New(*newThis);
  182. }
  183. @@ -193,10 +200,11 @@ inline void QScriptContextPrivate::setThisObject(QScriptValuePrivate *newThis)
  184.  
  185. inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::callee() const
  186. {
  187. - if (!m_callee.IsEmpty())
  188. - return new QScriptValuePrivate(engine, m_callee);
  189. - if (arguments)
  190. + if (isNativeFunction()) {
  191. + if (!m_callee.IsEmpty())
  192. + return new QScriptValuePrivate(engine, m_callee);
  193. return new QScriptValuePrivate(engine, arguments->Callee());
  194. + }
  195.  
  196. Q_UNIMPLEMENTED();
  197. return InvalidValue();
  198. @@ -204,21 +212,23 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::callee() c
  199.  
  200. inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::activationObject() const
  201. {
  202. - if (!parent)
  203. + if (isGlobalContext())
  204. return new QScriptValuePrivate(engine, engine->globalObject());
  205. - if (context.IsEmpty()) {
  206. + if (isJSFrame()) {
  207. Q_UNIMPLEMENTED();
  208. return InvalidValue();
  209. }
  210. Q_ASSERT(!context.IsEmpty());
  211.  
  212. v8::Handle<v8::Object> activation = context->GetExtensionObject();
  213. - if (hasArgumentGetter || (arguments && !activation->Has(v8::String::New("arguments")))) {
  214. - //we need to build the arguments now just in case the activationobject is used after the
  215. - // QScriptContext is out of scope
  216. - QScriptSharedDataPointer<QScriptValuePrivate> argsObject(argumentsObject());
  217. - activation->ForceSet(v8::String::New("arguments"), *argsObject);
  218. - const_cast<bool&>(hasArgumentGetter) = false;
  219. + if (isNativeFunction()) {
  220. + if (hasArgumentGetter || !activation->Has(v8::String::New("arguments"))) {
  221. + // We need to build the arguments now just in case the activation object is used after
  222. + // the QScriptContext is out of scope.
  223. + QScriptSharedDataPointer<QScriptValuePrivate> argsObject(argumentsObject());
  224. + activation->ForceSet(v8::String::New("arguments"), *argsObject);
  225. + const_cast<bool&>(hasArgumentGetter) = false;
  226. + }
  227. }
  228. return new QScriptValuePrivate(engine, activation);
  229. }
  230. @@ -234,16 +244,15 @@ inline void QScriptContextPrivate::setActivationObject(QScriptValuePrivate *acti
  231. return;
  232. }
  233.  
  234. - if (!parent) {
  235. + if (isGlobalContext()) {
  236. engine->setGlobalObject(activation);
  237. return;
  238. - }
  239. -
  240. - if (!context.IsEmpty()) {
  241. - context->SetExtensionObject(*activation);
  242. + } else if (isJSFrame()) {
  243. + Q_UNIMPLEMENTED();
  244. return;
  245. }
  246. - Q_UNIMPLEMENTED();
  247. +
  248. + context->SetExtensionObject(*activation);
  249. }
  250.  
  251. inline QScriptValueList QScriptContextPrivate::scopeChain() const
  252. @@ -266,7 +275,7 @@ inline QScriptValueList QScriptContextPrivate::scopeChain() const
  253. } while (!current.IsEmpty());
  254. }
  255.  
  256. - if (frame.IsEmpty()) {
  257. + if (!isJSFrame()) {
  258. // Implicit global context
  259. list.append(QScriptValuePrivate::get(new QScriptValuePrivate(engine, thisObject())));
  260. }
  261. diff --git a/src/script/api/qscriptcontext_p.h b/src/script/api/qscriptcontext_p.h
  262. index 0a0948e..d8cbd71 100644
  263. --- a/src/script/api/qscriptcontext_p.h
  264. +++ b/src/script/api/qscriptcontext_p.h
  265. @@ -61,6 +61,12 @@ public:
  266. inline QScriptContextPrivate(QScriptContextPrivate *parent, v8::Handle<v8::StackFrame> frame); // internal, for js frame (allocated in parentContext())
  267. inline ~QScriptContextPrivate();
  268.  
  269. + inline bool isGlobalContext() const { return !parent; }
  270. + inline bool isNativeFunction() const { return arguments; }
  271. + inline bool isNativeAccessor() const { return accessorInfo; }
  272. + inline bool isJSFrame() const { return !frame.IsEmpty(); }
  273. + inline bool isPushedContext() const { return !context.IsEmpty() && !arguments && !accessorInfo; }
  274. +
  275. inline QScriptPassPointer<QScriptValuePrivate> argument(int index) const;
  276. inline int argumentCount() const;
  277. inline QScriptPassPointer<QScriptValuePrivate> argumentsObject() const;
  278. diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
  279. index 85d021a..ca96ecb 100644
  280. --- a/src/script/api/qscriptcontextinfo.cpp
  281. +++ b/src/script/api/qscriptcontextinfo.cpp
  282. @@ -127,7 +127,7 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
  283. QScriptContextPrivate *context_p = QScriptContextPrivate::get(context);
  284. QScriptIsolate api(context_p->engine, QScriptIsolate::NotNullEngine);
  285. v8::HandleScope handleScope;
  286. - if (!context_p->frame.IsEmpty()) {
  287. + if (context_p->isJSFrame()) {
  288. v8::Handle<v8::StackFrame> frame = context_p->frame;
  289. scriptId = frame->GetScriptId()->NumberValue();
  290. columnNumber = frame->GetColumn();
  291. diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
  292. index 322bbe9..33d1d19 100644
  293. --- a/src/script/api/qscriptengine.cpp
  294. +++ b/src/script/api/qscriptengine.cpp
  295. @@ -838,7 +838,7 @@ QScriptContextPrivate *QScriptEnginePrivate::pushContext()
  296. void QScriptEnginePrivate::popContext()
  297. {
  298. QScriptContextPrivate *ctx = currentContext();
  299. - if (!ctx->parentContext() || ctx->arguments) {
  300. + if (!ctx->isPushedContext()) {
  301. qWarning("QScriptEngine::popContext() doesn't match with pushContext()");
  302. } else {
  303. delete ctx;
  304. @@ -870,7 +870,7 @@ QScriptPassPointer<QScriptValuePrivate> QScriptEnginePrivate::evaluate(v8::Handl
  305. Q_ASSERT(!thisObj.IsEmpty());
  306.  
  307. // Lazily initialize the 'arguments' property in JS context
  308. - if (m_currentQsContext->arguments)
  309. + if (m_currentQsContext->isNativeFunction())
  310. m_currentQsContext->initializeArgumentsProperty();
  311.  
  312. result = script->Run(thisObj);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement