コード例 #1
0
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);
}
コード例 #2
0
ファイル: Prototype_glue.c プロジェクト: stadaki/konoha3
// @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
}
コード例 #3
0
ファイル: MiniVM.c プロジェクト: masakiishii/konoha.js
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;
}
コード例 #4
0
ファイル: Compiler.c プロジェクト: myoan/minikonoha
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;
}
コード例 #5
0
ファイル: Prototype_glue.c プロジェクト: stadaki/konoha3
//## 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);
		}
	}
}