static void NMOV_asm(KonohaContext *kctx, int a, ktype_t ty, int b) { if(TY_isUnbox(ty)) { ASM(NMOV, NC_(a), NC_(b), CT_(ty)); } else { ASM(NMOV, OC_(a), OC_(b), CT_(ty)); } }
static void Iterator_Init(KonohaContext *kctx, kObject *o, void *conf) { kIterator *itr = (kIterator *)o; int isUnboxEntry = TY_isUnbox(O_ct(itr)->p0); KFieldInit(itr, itr->source, K_NULL); itr->current_pos = 0; itr->hasNext = Nothing_hasNext; itr->setNextResult = isUnboxEntry ? Nothing_setNextResultUnbox : Nothing_setNextResult; }
static KMETHOD Array_toIterator(KonohaContext *kctx, KonohaStack *sfp) { kArray *a = sfp[0].asArray; KonohaClass *cIterator = CT_p0(kctx, CT_Iterator, O_ct(a)->p0); kIterator *itr = (kIterator *)KLIB new_kObject(kctx, OnStack, cIterator, 0); KFieldSet(itr, itr->arrayList, a); itr->hasNext = Array_hasNext; itr->setNextResult = TY_isUnbox(O_ct(a)->p0) ? Array_setNextResultUnbox : Array_setNextResult; KReturn(itr); }
static kbool_t KonohaClass_setClassFieldUnboxValue(KonohaContext *kctx, KonohaClassVar *definedClass, ksymbol_t sym, uintptr_t unboxValue) { int i; for(i = definedClass->fieldsize - 1; i >= 0; i--) { if(definedClass->fieldItems[i].fn == sym && TY_isUnbox(definedClass->fieldItems[i].ty)) { definedClass->defaultNullValueVar_OnGlobalConstList->fieldUnboxItems[i] = unboxValue; return true; } } return false; }
static void LETEXPR_asm(KonohaContext *kctx, kStmt *stmt, int a, kExpr *expr, int shift, int espidx) { kExpr *leftHandExpr = kExpr_at(expr, 1); kExpr *rightHandExpr = kExpr_at(expr, 2); DBG_P("LET (%s) a=%d, shift=%d, espidx=%d", TY_t(expr->ty), a, shift, espidx); if(leftHandExpr->build == TEXPR_LOCAL) { EXPR_asm(kctx, stmt, leftHandExpr->index, rightHandExpr, shift, espidx); if(expr->ty != TY_void && a != leftHandExpr->index) { NMOV_asm(kctx, a, leftHandExpr->ty, leftHandExpr->index); } } else if(leftHandExpr->build == TEXPR_STACKTOP) { DBG_P("LET TEXPR_STACKTOP a=%d, leftHandExpr->index=%d, espidx=%d", a, leftHandExpr->index, espidx); EXPR_asm(kctx, stmt, leftHandExpr->index + shift, rightHandExpr, shift, espidx); if(expr->ty != TY_void && a != leftHandExpr->index + shift) { NMOV_asm(kctx, a, leftHandExpr->ty, leftHandExpr->index + shift); } } else{ assert(leftHandExpr->build == TEXPR_FIELD); EXPR_asm(kctx, stmt, espidx, rightHandExpr, shift, espidx); kshort_t index = (kshort_t)leftHandExpr->index; kshort_t xindex = (kshort_t)(leftHandExpr->index >> (sizeof(kshort_t)*8)); if(TY_isUnbox(rightHandExpr->ty)) { ASM(XNMOV, OC_(index), xindex, NC_(espidx), CT_(leftHandExpr->ty)); if(expr->ty != TY_void) { ASM(NMOVx, NC_(a), OC_(index), xindex, CT_(leftHandExpr->ty)); } } else { ASM(XNMOV, OC_(index), xindex, OC_(espidx), CT_(leftHandExpr->ty)); if(expr->ty != TY_void) { ASM(NMOVx, OC_(a), OC_(index), xindex, CT_(leftHandExpr->ty)); } } } }
static void EXPR_asm(KonohaContext *kctx, kStmt *stmt, int a, kExpr *expr, int shift, int espidx) { DBG_ASSERT(expr != NULL); //DBG_P("a=%d, shift=%d, espidx=%d", a, shift, espidx); switch(expr->build) { case TEXPR_CONST : { kObject *v = expr->objectConstValue; DBG_ASSERT(!TY_isUnbox(expr->ty)); DBG_ASSERT(Expr_hasObjectConstValue(expr)); v = BUILD_addConstPool(kctx, v); ASM(NSET, OC_(a), (uintptr_t)v, CT_(expr->ty)); break; } case TEXPR_NEW : { ASM(NEW, OC_(a), expr->index, CT_(expr->ty)); break; } case TEXPR_NULL : { if(TY_isUnbox(expr->ty)) { ASM(NSET, NC_(a), 0, CT_(expr->ty)); } else { ASM(NULL, OC_(a), CT_(expr->ty)); } break; } case TEXPR_NCONST : { ASM(NSET, NC_(a), expr->unboxConstValue, CT_(expr->ty)); break; } case TEXPR_LOCAL : { NMOV_asm(kctx, a, expr->ty, expr->index); break; } case TEXPR_BLOCK : { DBG_ASSERT(IS_Block(expr->block)); BLOCK_asm(kctx, expr->block, espidx); NMOV_asm(kctx, a, expr->ty, /*expr->index*/ espidx); break; } case TEXPR_FIELD : { kshort_t index = (kshort_t)expr->index; kshort_t xindex = (kshort_t)(expr->index >> (sizeof(kshort_t)*8)); if(TY_isUnbox(expr->ty)) { ASM(NMOVx, NC_(a), OC_(index), xindex, CT_(expr->ty)); } else { ASM(NMOVx, OC_(a), OC_(index), xindex, CT_(expr->ty)); } break; } case TEXPR_CALL : CALL_asm(kctx, stmt, a, expr, shift, espidx); if(a != espidx) { NMOV_asm(kctx, a, expr->ty, espidx); } break; case TEXPR_AND : AND_asm(kctx, stmt, a, expr, shift, espidx); break; case TEXPR_OR : OR_asm(kctx, stmt, a, expr, shift, espidx); break; case TEXPR_LET : LETEXPR_asm(kctx, stmt, a, expr, shift, espidx); break; case TEXPR_STACKTOP : //DBG_P("STACKTOP mov %d, %d, < %d", a, expr->index + shift, espidx); DBG_ASSERT(expr->index + shift < espidx); NMOV_asm(kctx, a, expr->ty, expr->index + shift); break; default: DBG_ABORT("unknown expr=%d", expr->build); } }