Parse_stat MCReturn::parse(MCScriptPoint &sp) { initpoint(sp); if (sp.parseexp(False, True, &source) != PS_NORMAL) { MCperror->add (PE_RETURN_BADEXP, sp); return PS_ERROR; } if (sp.skip_token(SP_REPEAT, TT_UNDEFINED, RF_WITH) == PS_NORMAL) { if (sp.skip_token(SP_FACTOR, TT_CHUNK, CT_URL)) { // MW-2011-06-22: [[ SERVER ]] Update to use SP findvar method to take into account // execution outwith a handler. Symbol_type type; if (sp.next(type) != PS_NORMAL || sp.findvar(sp.gettoken_nameref(), &var) != PS_NORMAL) sp.backup(); else var->parsearray(sp); } if (var == NULL) { sp.skip_token(SP_FACTOR, TT_FUNCTION, F_CACHED_URLS); if (sp.parseexp(False, True, &url) != PS_NORMAL) { MCperror->add (PE_RETURN_BADEXP, sp); return PS_ERROR; } } } return PS_NORMAL; }
Parse_stat MCAdd::parse(MCScriptPoint &sp) { initpoint(sp); if (sp.parseexp(False, True, &source) != PS_NORMAL) { MCperror->add(PE_ADD_BADEXP, sp); return PS_ERROR; } if (sp.skip_token(SP_FACTOR, TT_TO) == PS_ERROR) { MCperror->add(PE_ADD_NOTO, sp); return PS_ERROR; } Symbol_type type; // MW-2011-06-22: [[ SERVER ]] Update to use SP findvar method to take into account // execution outwith a handler. if (sp.next(type) != PS_NORMAL || type != ST_ID || sp.findvar(sp.gettoken_nameref(), &destvar) != PS_NORMAL) { sp.backup(); dest = new (nothrow) MCChunk(True); if (dest->parse(sp, False) != PS_NORMAL) { MCperror->add(PE_ADD_BADDEST, sp); return PS_ERROR; } } else destvar->parsearray(sp); // MW-2013-08-01: [[ Bug 10925 ]] If the dest chunk is just a var, extract the varref. if (dest != NULL && dest -> isvarchunk()) destvar = dest -> getrootvarref(); return PS_NORMAL; }
Parse_stat MCSetOp::parse(MCScriptPoint &sp) { initpoint(sp); // MW-2011-06-22: [[ SERVER ]] Update to use SP findvar method to take into account // execution outwith a handler. Symbol_type type; if (sp.next(type) != PS_NORMAL || type != ST_ID || sp.findvar(sp.gettoken_nameref(), &destvar) != PS_NORMAL || destvar -> parsearray(sp) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADARRAY, sp); return PS_ERROR; } if (sp.skip_token(SP_REPEAT, TT_UNDEFINED, RF_WITH) == PS_ERROR && sp.skip_token(SP_FACTOR, TT_PREP, PT_BY) == PS_ERROR) { MCperror->add(PE_ARRAYOP_NOWITH, sp); return PS_ERROR; } if (sp.parseexp(True, False, &source) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADEXP, sp); return PS_ERROR; } // MERG-2013-08-26: [[ RecursiveArrayOp ]] Support nested arrays in union and intersect recursive = sp.skip_token(SP_SUGAR, TT_UNDEFINED, SG_RECURSIVELY) == PS_NORMAL; MCVarref *t_src_ref, *t_dst_ref; t_src_ref = source -> getrootvarref(); t_dst_ref = destvar -> getrootvarref(); overlap = t_src_ref != NULL && t_dst_ref != NULL && t_src_ref -> rootmatches(t_dst_ref); return PS_NORMAL; }
Parse_stat MCArrayOp::parse(MCScriptPoint &sp) { initpoint(sp); Symbol_type type; // MW-2008-08-20: [[ Bug 6954 ]] Split/Combine don't work on array keys // MW-2011-06-22: [[ SERVER ]] Update to use SP findvar method to take into account // execution outwith a handler. if (sp.next(type) != PS_NORMAL || type != ST_ID || sp.findvar(sp.gettoken_nameref(), &destvar) != PS_NORMAL || destvar -> parsearray(sp) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADARRAY, sp); return PS_ERROR; } if (sp.skip_token(SP_REPEAT, TT_UNDEFINED, RF_WITH) != PS_NORMAL && sp.skip_token(SP_FACTOR, TT_PREP, PT_BY) != PS_NORMAL && sp.skip_token(SP_START, TT_UNDEFINED, SC_USING) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_NOWITH, sp); return PS_ERROR; } if (sp . next(type) == PS_NORMAL && type == ST_ID && (sp . gettoken() == "column" || sp . gettoken() == "row")) { if (sp . gettoken() == "column") mode = TYPE_COLUMN; else mode = TYPE_ROW; } else { sp.backup(); if (sp.parseexp(True, False, &element) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADEXP, sp); return PS_ERROR; } if (sp.skip_token(SP_FACTOR, TT_BINOP, O_AND) == PS_NORMAL) if (sp.parseexp(True, False, &key) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADEXP, sp); return PS_ERROR; } } if (sp . skip_token(SP_FACTOR, TT_PREP, PT_AS) == PS_NORMAL) { if (sp . skip_token(SP_COMMAND, TT_STATEMENT, S_SET) != PS_NORMAL || key != nil) { MCperror -> add(PE_ARRAYOP_BADFORM, sp); return PS_ERROR; } form = FORM_SET; } return PS_NORMAL; }
Parse_stat MCSetOp::parse(MCScriptPoint &sp) { initpoint(sp); if (op == kOpSymmetricDifference) { if (sp.skip_token(SP_COMMAND, TT_STATEMENT, S_DIFFERENCE) == PS_ERROR) { MCperror->add(PE_ARRAYOP_NODIFFERENCE, sp); return PS_ERROR; } } // MW-2011-06-22: [[ SERVER ]] Update to use SP findvar method to take into account // execution outwith a handler. MCerrorlock++; Symbol_type type; MCScriptPoint tsp(sp); if (sp.next(type) != PS_NORMAL || type != ST_ID || sp.findvar(sp.gettoken_nameref(), &(&destvar)) != PS_NORMAL || destvar -> parsearray(sp) != PS_NORMAL) { sp = tsp; MCerrorlock--; destvar.Reset(); if (sp.parseexp(False, True, &(&destexpr)) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADARRAY, sp); return PS_ERROR; } } else MCerrorlock--; if (sp.skip_token(SP_REPEAT, TT_UNDEFINED, RF_WITH) == PS_ERROR && sp.skip_token(SP_FACTOR, TT_PREP, PT_BY) == PS_ERROR) { MCperror->add(PE_ARRAYOP_NOWITH, sp); return PS_ERROR; } if (sp.parseexp(True, False, &(&source)) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADEXP, sp); return PS_ERROR; } // MERG-2013-08-26: [[ RecursiveArrayOp ]] Support nested arrays in union and intersect if (sp.skip_token(SP_SUGAR, TT_UNDEFINED, SG_RECURSIVELY) == PS_NORMAL) { if (op == kOpIntersect) op = kOpIntersectRecursively; else if (op == kOpUnion) op = kOpUnionRecursively; else { MCperror->add(PE_ARRAYOP_BADRECURSIVE, sp); return PS_ERROR; } } if (sp.skip_token(SP_FACTOR, TT_PREP, PT_INTO) == PS_NORMAL) { if (!destexpr) { destexpr.Reset(destvar.Release()); } Symbol_type ttype; if (sp.next(ttype) != PS_NORMAL || ttype != ST_ID || sp.findvar(sp.gettoken_nameref(), &(&destvar)) != PS_NORMAL || destvar -> parsearray(sp) != PS_NORMAL) { MCperror->add(PE_ARRAYOP_BADARRAY, sp); return PS_ERROR; } is_into = true; } if (!destvar && is_into) { MCperror->add(PE_ARRAYOP_DSTNOTCONTAINER, sp); return PS_ERROR; } return PS_NORMAL; }