U32 ObjectDeclNode::compileSubObject(U32 *codeStream, U32 ip, bool root) { U32 start = ip; codeStream[ip++] = OP_PUSH_FRAME; ip = classNameExpr->compile(codeStream, ip, TypeReqString); codeStream[ip++] = OP_PUSH; ip = objectNameExpr->compile(codeStream, ip, TypeReqString); codeStream[ip++] = OP_PUSH; for(ExprNode *exprWalk = argList; exprWalk; exprWalk = (ExprNode *) exprWalk->getNext()) { ip = exprWalk->compile(codeStream, ip, TypeReqString); codeStream[ip++] = OP_PUSH; } codeStream[ip++] = OP_CREATE_OBJECT; codeStream[ip] = STEtoU32(parentObject, ip); ip++; codeStream[ip++] = isDatablock; codeStream[ip++] = isClassNameInternal; codeStream[ip++] = isSingleton; codeStream[ip++] = dbgLineNumber; codeStream[ip++] = start + failOffset; for(SlotAssignNode *slotWalk = slotDecls; slotWalk; slotWalk = (SlotAssignNode *) slotWalk->getNext()) ip = slotWalk->compile(codeStream, ip, TypeReqNone); codeStream[ip++] = OP_ADD_OBJECT; codeStream[ip++] = root; for(ObjectDeclNode *objectWalk = subObjects; objectWalk; objectWalk = (ObjectDeclNode *) objectWalk->getNext()) ip = objectWalk->compileSubObject(codeStream, ip, false); codeStream[ip++] = OP_END_OBJECT; codeStream[ip++] = root || isDatablock; // Added to fix the object creation issue [7/9/2007 Black] codeStream[ip++] = OP_FINISH_OBJECT; return ip; }
U32 FuncCallExprNode::compile(U32 *codeStream, U32 ip, TypeReq type) { codeStream[ip++] = OP_PUSH_FRAME; for(ExprNode *walk = args; walk; walk = (ExprNode *) walk->getNext()) { ip = walk->compile(codeStream, ip, TypeReqString); codeStream[ip++] = OP_PUSH; } if(callType == MethodCall || callType == ParentCall) codeStream[ip++] = OP_CALLFUNC; else codeStream[ip++] = OP_CALLFUNC_RESOLVE; codeStream[ip] = STEtoU32(funcName, ip); ip++; codeStream[ip] = STEtoU32(nameSpace, ip); ip++; codeStream[ip++] = callType; if(type != TypeReqString) codeStream[ip++] = conversionOp(TypeReqString, type); return ip; }