void c_Closure::init(int numArgs, ActRec* ar, TypedValue* sp) { auto const cls = getVMClass(); auto const invokeFunc = getInvokeFunc(); if (invokeFunc->cls()) { setThisOrClass(ar->getThisOrClass()); if (invokeFunc->isStatic()) { if (!hasClass()) { setClass(getThisUnchecked()->getVMClass()); } } else if (!hasClass()) { getThisUnchecked()->incRefCount(); } } else { hdr()->ctx = nullptr; } /* * Copy the use vars to instance variables, and initialize any * instance properties that are for static locals to KindOfUninit. */ auto const numDeclProperties = cls->numDeclProperties(); assertx(numDeclProperties - numArgs == getInvokeFunc()->numStaticLocals()); auto beforeCurUseVar = sp + numArgs; auto curProperty = getUseVars(); int i = 0; assertx(numArgs <= numDeclProperties); for (; i < numArgs; i++) { // teleport the references in here so we don't incref tvCopy(*--beforeCurUseVar, *curProperty++); } for (; i < numDeclProperties; ++i) { tvWriteUninit(*curProperty++); } }
static Class* getClassByName(const char* name, int len) { Class* cls = nullptr; // translate "self" or "parent" if (len == 4 && !memcmp(name, "self", 4)) { cls = g_context->getContextClass(); if (!cls) { throw FatalErrorException("Cannot access self:: " "when no class scope is active"); } } else if (len == 6 && !memcmp(name, "parent", 6)) { cls = g_context->getParentContextClass(); if (!cls) { throw FatalErrorException("Cannot access parent"); } } else if (len == 6 && !memcmp(name, "static", 6)) { CallerFrame cf; auto ar = cf(); if (ar) { if (ar->hasThis()) { cls = ar->getThis()->getVMClass(); } else if (ar->hasClass()) { cls = ar->getClass(); } } if (!cls) { throw FatalErrorException("Cannot access static:: " "when no class scope is active"); } } else { String className(name, len, CopyString); cls = Unit::loadClass(className.get()); } return cls; }
listPo C_LIST(termPo t) { assert(hasClass(t, listClass)); return (listPo) t; }
basePo C_BASE(termPo t) { assert(hasClass(t, baseClass)); return (basePo) t; }
extern methodPo C_MTD(termPo t) { assert(hasClass(t, methodClass)); return (methodPo) t; }
bool Style::addClass(const std::string& className, const TransitionOptions& properties) { if (hasClass(className)) return false; classes.push_back(className); transitionProperties = properties; return true; }
cellPo C_CELL(termPo t) { assert(hasClass(t, cellClass)); return (cellPo) t; }