exception_t lookupExtraCaps(tcb_t* thread, word_t *bufferPtr, message_info_t info) { lookupSlot_raw_ret_t lu_ret; cptr_t cptr; unsigned int i, length; if (!bufferPtr) { current_extra_caps.excaprefs[0] = NULL; return EXCEPTION_NONE; } length = message_info_get_msgExtraCaps(info); for (i = 0; i < length; i++) { cptr = getExtraCPtr(bufferPtr, i); lu_ret = lookupSlot(thread, cptr); if (lu_ret.status != EXCEPTION_NONE) { current_fault = fault_cap_fault_new(cptr, false); return lu_ret.status; } current_extra_caps.excaprefs[i] = lu_ret.slot; } if (i < seL4_MsgMaxExtraCaps) { current_extra_caps.excaprefs[i] = NULL; } return EXCEPTION_NONE; }
bool Parser::statement() { bool isReturn = false; switch (lexer->token) { case '{': isReturn = block(); break; case TK_if: ifStat(); break; case TK_while: whileStat(); break; case TK_for: forStat(); break; case TK_return: { advance(); int top = syms->localsTop(); emit(top, RET, 0, expr(top), UNUSED); isReturn = true; break; } case TK_NAME: { int lookahead = lexer->lookahead(); if (lookahead == '=' || lookahead == ':'+TK_EQUAL) { Value name = lexer->info.name; consume(TK_NAME); if (lookahead == '=') { int slot = lookupSlot(name); consume('='); int top = syms->localsTop(); patchOrEmitMove(top + 1, slot, expr(top)); proto->patchPos = -1; } else { consume(':'+TK_EQUAL); if (syms->definedInThisBlock(name)) { CERR(true, E_VAR_REDEFINITION, name); // aSlot = slot; // reuse existing local with same name } else { const Value a = expr(syms->localsTop()); const int slot = syms->set(name); patchOrEmitMove(slot+1, slot, a); proto->patchPos = -1; } } break; } } default: { int top = syms->localsTop(); Value lhs = expr(top); if (TOKEN == '=') { consume('='); CERR(!IS_REG(lhs), E_ASSIGN_TO_CONST, lhs); CERR(proto->patchPos < 0, E_ASSIGN_RHS, lhs); unsigned code = proto->code.pop(); int op = OP(code); CERR(op != GETI && op != GETF, E_ASSIGN_RHS, lhs); assert((int)lhs == OC(code)); emit(top + 3, op + 1, OA(code), VAL_REG(OB(code)), expr(top + 2)); } } } return isReturn; }