static KMETHOD KMethodFunc_UnboxPrototypeGetter(KonohaContext *kctx, KonohaStack *sfp) { kMethod *mtd = sfp[K_MTDIDX].calledMethod; ksymbol_t key = (ksymbol_t)mtd->delta; KKeyValue *kvs = KLIB kObjectProto_GetKeyValue(kctx, sfp[0].asObject, key); KReturnUnboxValue((kvs == NULL) ? 0 : kvs->unboxValue); }
// @SmartReturn Object Prototype.get(Symbol symbol) static KMETHOD Prototype_get(KonohaContext *kctx, KonohaStack *sfp) { KClass *targetClass = KGetReturnType(sfp); DBG_P("requesting type=%s", KClass_text(targetClass)); ksymbol_t symbol = sfp[1].intValue; KKeyValue *kvs = KLIB kObjectProto_GetKeyValue(kctx, sfp[0].asObject, symbol); if(kvs != NULL) { KClass *c = KClass_(kvs->attrTypeId); if(targetClass == c) { if(KClass_Is(UnboxType, targetClass)) { KReturnUnboxValue(kvs->unboxValue); } else { KReturnField(kvs->ObjectValue); } } DBG_P("requesting type=%s instanceof %s ? %d", KClass_text(c), KClass_text(targetClass), c->isSubType(kctx, c, targetClass)); if(c->isSubType(kctx, c, targetClass)) { if(KClass_Is(UnboxType, c)) { if(KClass_Is(UnboxType, targetClass)) { KReturnUnboxValue(kvs->unboxValue); } else { DBG_P("boxing type=%s instanceof %s ? %d", KClass_text(c), KClass_text(targetClass), c->isSubType(kctx, c, targetClass)); KReturn(KLIB new_kObject(kctx, OnStack, c, kvs->unboxValue)); } } KReturnField(kvs->ObjectValue); } } KReturnUnboxValue(0); // return default value }
static bblock_t kUntypedNode_GetLabelNode(KonohaContext *kctx, kUntypedNode *node, ksymbol_t label) { KKeyValue *kvs = KLIB kObjectProto_GetKeyValue(kctx, node, label); if(kvs != NULL) { return (bblock_t)kvs->unboxValue; } return -1; }
static Block *kNode_GetTargetBlock(KonohaContext *kctx, kNode *stmt, ksymbol_t keyword) { KKeyValue *kvs = KLIB kObjectProto_GetKeyValue(kctx, stmt, keyword); if(kvs != 0) { return (Block *) kvs->unboxValue; } return 0; }
//## Prototype Prototype.(Object o); static KMETHOD Prototype_(KonohaContext *kctx, KonohaStack *sfp) { ksymbol_t symbol = KDynamicCallSymbol(sfp); KKeyValue *kvs = KLIB kObjectProto_GetKeyValue(kctx, sfp[0].asObject, symbol); if(kvs != NULL) { KClass *c = KClass_(kvs->attrTypeId); kParam *cparam = KClass_cparam(c); if(KClass_isFunc(c) && cparam->psize <= KDynamicCallArgument(sfp)) { KClass *thisClass = kObject_class(sfp[0].asObject), *returnType = KGetReturnType(sfp); kFunc *fo = (kFunc *)kvs->FuncValue; KStackSetFunc(sfp, fo); KStackDynamicTypeCheck(kctx, sfp, fo->method, thisClass); KStackCall(sfp); KStackReturnTypeCheck(kctx, sfp, fo->method, thisClass, returnType); } } }