static kbool_t KClass_AddField(KonohaContext *kctx, KClass *ct, ktypeattr_t typeattr, ksymbol_t sym) { kuhalfword_t pos = ct->fieldsize; if(unlikely(ct->classMethodList == K_EMPTYARRAY)) { ((KClassVar *)ct)->classMethodList = new_(MethodArray, 8, OnGlobalConstList); /*FIXME WriteBarrier */ } INIT_GCSTACK(); if(pos < ct->fieldAllocSize) { KClassVar *definedClass = (KClassVar *)ct; definedClass->fieldsize += 1; definedClass->fieldItems[pos].name = sym; if(KType_Is(UnboxType, typeattr)) { definedClass->defaultNullValueVar->fieldUnboxItems[pos] = 0; definedClass->fieldItems[pos].typeAttr = typeattr; } else { kObjectVar *o = definedClass->defaultNullValueVar; KFieldSet(o, o->fieldObjectItems[pos], KLIB Knull(kctx, KClass_(typeattr))); definedClass->fieldItems[pos].typeAttr = typeattr | KTypeAttr_Boxed; } if(1/*KHalfFlag_Is(flag, kField_Getter)*/) { kMethod *mtd = new_FieldGetter(kctx, _GcStack, definedClass->typeId, sym, KTypeAttr_Unmask(typeattr), pos); KLIB kArray_Add(kctx, ct->classMethodList, mtd); } if(!KTypeAttr_Is(ReadOnly, typeattr)/*KHalfFlag_Is(flag, kField_Setter)*/) { kMethod *mtd = new_FieldSetter(kctx, _GcStack, definedClass->typeId, sym, KTypeAttr_Unmask(typeattr), pos); KLIB kArray_Add(kctx, ct->classMethodList, mtd); } } else { if(1/*KHalfFlag_Is(flag, kField_Getter)*/) { kMethod *mtd = new_PrototypeGetter(kctx, _GcStack, ct->typeId, sym, KTypeAttr_Unmask(typeattr)); KLIB kArray_Add(kctx, ct->classMethodList, mtd); } if(!KTypeAttr_Is(ReadOnly, typeattr)/*KHalfFlag_Is(flag, kField_Setter)*/) { kMethod *mtd = new_PrototypeSetter(kctx, _GcStack, ct->typeId, sym, KTypeAttr_Unmask(typeattr)); KLIB kArray_Add(kctx, ct->classMethodList, mtd); } } RESET_GCSTACK(); return true; }
static KClass *CreateEnvClass(KonohaContext *kctx, kNameSpace *ns, kToken *typeTk, KClass **EnvObjectClass) { INIT_GCSTACK(); size_t i = 0, esize = ns->genv->localScope.varsize; size_t start = 0, end = esize; KGammaStackDecl *oldenv = ns->genv->localScope.varItems; kparamtype_t *p = ALLOCA(kparamtype_t, esize); char buf[256] = {'_', '_', '_', 'E', 'N', 'V', 0}, *text = buf + 6; if(ns->genv->thisClass == KClass_NameSpace) { start = 1; end = esize - 1; } assert(end < 256); for(i = start; i <= end; i++) { p[i-1].name = oldenv[i].name; p[i-1].attrTypeId = oldenv[i].attrTypeId; *(text++) = (KType_text(p[i-1].attrTypeId))[0]; } *EnvObjectClass = KLIB kNameSpace_GetClassByFullName(kctx, ns, buf, text - buf, NULL); if(*EnvObjectClass == NULL) { *EnvObjectClass = kNameSpace_DefineClassName(kctx, ns, buf, text - buf); } KClass *ct = KLIB KClass_Generics(kctx, KClass_Func, typeTk->resolvedTypeId, end, p); if(end >= 1) { ((KClassVar *)ct)->classMethodList = new_(MethodArray, end*2, OnGlobalConstList); for(i = start; i <= end; i++) { int n = i - 1; ksymbol_t sym = p[n].name; ktypeattr_t type = KTypeAttr_Unmask(p[n].attrTypeId); kMethod *getter = new_FunctionGetter(kctx, _GcStack, ct->typeId, sym, type, n); kMethod *setter = new_FunctionSetter(kctx, _GcStack, ct->typeId, sym, type, n); KLIB kArray_Add(kctx, ct->classMethodList, getter); KLIB kArray_Add(kctx, ct->classMethodList, setter); } } RESET_GCSTACK(); return ct; }