//## String DIR.readPath() static KMETHOD DIR_readPath(KonohaContext *kctx, KonohaStack *sfp) { kDir *dir = (kDir *)sfp[0].asObject; if(dir->dirp != NULL) { KMakeTrace(trace, sfp); struct dirent entry, *result; int ret = readdir_r(dir->dirp, &entry, &result); if(result != NULL) { char *d_name = result->d_name, delim[2] = {'/', 0}; KGrowingBuffer wb; KLIB Kwb_Init(&(kctx->stack->cwb), &wb); KLIB Kwb_Write(kctx, &wb, S_text(dir->PathInfoNULL), S_size(dir->PathInfoNULL)); KLIB Kwb_Write(kctx, &wb, delim, 1); if(dir->readerIconv != ICONV_NULL) { KLIB Kwb_Write(kctx, &wb, d_name, strlen(d_name)); } else { KLIB Kwb_iconv(kctx, &wb, dir->readerIconv, d_name, strlen(d_name), trace); } KReturnWith( KLIB new_kString(kctx, OnStack, KLIB Kwb_top(kctx, &wb, 0), Kwb_bytesize(&wb), StringPolicy_SystemInfo), KLIB Kwb_Free(&wb) ); } if(ret == -1) { KTraceErrorPoint(trace, SystemFault, "readdir", LogErrno); } kDir_close(kctx, dir); } KReturn(KNULL(String)); }
static void dumpMethod(KonohaContext *kctx, KonohaStack *sfp, kMethod *mtd) { KGrowingBuffer wb; KLIB Kwb_Init(&(kctx->stack->cwb), &wb); kMethod_WriteToBuffer(kctx, mtd, &wb); PLATAPI printf_i("%s\n", KLIB Kwb_top(kctx, &wb, 1)); KLIB Kwb_Free(&wb); return; }
static void DumpVisitor_visitConstExpr(KonohaContext *kctx, IRBuilder *self, kExpr *expr) { KGrowingBuffer wb; KLIB Kwb_init(&(kctx->stack->cwb), &wb); KonohaStack sfp[1]; kObject *obj = expr->objectConstValue; sfp[0].asObject = obj; O_ct(obj)->p(kctx, sfp, 0, &wb, 0); char *str = (char *) KLIB Kwb_top(kctx, &wb, 0); char buf[128]; snprintf(buf, 128, "CONST:%s:'%s'", CT_t(O_ct(obj)), str); emit_string(buf, "", "", DUMPER(self)->indent); KLIB Kwb_free(&wb); }
static void DumpVisitor_visitNConstExpr(KonohaContext *kctx, IRBuilder *self, kExpr *expr) { KGrowingBuffer wb; KLIB Kwb_init(&(kctx->stack->cwb), &wb); KonohaStack sfp[1]; unsigned long unboxVal = expr->unboxConstValue; KonohaClass *ct = CT_(expr->ty); sfp[0].unboxValue = unboxVal; ct->p(kctx, sfp, 0, &wb, 0); char *str = (char *) KLIB Kwb_top(kctx, &wb, 0); char buf[128]; snprintf(buf, 128, "NCONST:'%s'", str); emit_string(buf, "", "", DUMPER(self)->indent); KLIB Kwb_free(&wb); }
static void DumpVisitor_init(KonohaContext *kctx, struct IRBuilder *builder, kMethod *mtd) { unsigned i; KGrowingBuffer wb; KLIB Kwb_init(&(kctx->stack->cwb), &wb); kParam *pa = Method_param(mtd); KLIB Kwb_printf(kctx, &wb, "METHOD %s%s(", T_mn(mtd->mn)); for (i = 0; i < pa->psize; i++) { if(i != 0) { KLIB Kwb_write(kctx, &wb, ", ", 2); } KLIB Kwb_printf(kctx, &wb, "%s %s", TY_t(pa->paramtypeItems[i].ty), SYM_t(pa->paramtypeItems[i].fn)); } emit_string(KLIB Kwb_top(kctx, &wb, 1), "", ") {", 0); builder->local_fields = (void *) KMalloc_UNTRACE(sizeof(int)); DUMPER(builder)->indent = 0; }
static void DumpVisitor_visitCallExpr(KonohaContext *kctx, IRBuilder *self, kExpr *expr) { KGrowingBuffer wb; KLIB Kwb_init(&(kctx->stack->cwb), &wb); kMethod *mtd = CallExpr_getMethod(expr); KLIB Kwb_printf(kctx, &wb, "CALL: '%s%s'", T_mn(mtd->mn)); DUMPER(self)->indent++; emit_string(KLIB Kwb_top(kctx, &wb, 1), "(", "", DUMPER(self)->indent); DUMPER(self)->indent++; unsigned i; for (i = 1; i < kArray_size(expr->cons); ++i) { handleExpr(kctx, self, kExpr_at(expr, i)); } DUMPER(self)->indent--; emit_string(")", "", "", DUMPER(self)->indent); DUMPER(self)->indent--; KLIB Kwb_free(&wb); }
static void kException_addStackTrace(KonohaContext *kctx, KonohaStack *sfp, kException *e) { kMethod *mtd = sfp[K_MTDIDX].mtdNC; KUtilsWriteBuffer wb; KLIB Kwb_init(&kctx->stack->cwb, &wb); kfileline_t uline = sfp[K_RTNIDX].uline; if(uline > 0) { const char *file = FileId_t(uline); KLIB Kwb_printf(kctx, &wb, "(%s:%d) %s.%s%s" , PLATAPI shortFilePath(file), (kushort_t)uline, Method_t(mtd)); } // int i = 0, psize = Method_paramsize(mtd); // kParam *pa = Method_param(mtd); // KonohaClass *thisClass = O_cid(sfp[0]); // for(i = 0; i < psize; i++) { // pa->paramtypeItems[0].ty; // if(i > 0) { // knh_putc(ctx, cwb->w, ','); // } // knh_write_fn(ctx, cwb->w, p->fn); // knh_putc(ctx, cwb->w, '='); // knh_write_sfp(ctx, cwb->w, type, &sfp[i+1], FMT_line); // } const char *msg = KLIB Kwb_top(kctx, &wb, 1); KLIB kArray_add(kctx, e->stackTraceList, KLIB new_kString(kctx, msg, strlen(msg), 0)); // if((mtd)->mn != MN_LAMBDA) { // knh_uline_t uline = knh_stack_uline(ctx, sfp); // knh_write_uline(ctx, cwb->w, uline); // knh_write_type(ctx, cwb->w, (mtd)->cid); // knh_putc(ctx, cwb->w, '.'); // knh_write_mn(ctx, cwb->w, (mtd)->mn); // knh_putc(ctx, cwb->w, '('); // knh_putc(ctx, cwb->w, ')'); // if(DP(e)->tracesNULL == NULL) { // KNH_INITv(DP(e)->tracesNULL, new_Array(ctx, CLASS_String, 0)); // } // knh_Array_add(ctx, DP(e)->tracesNULL, knh_cwb_newString(ctx, cwb)); // } }
static KMETHOD PyObject_toString(KonohaContext *kctx, KonohaStack *sfp) { kPyObject *po = (kPyObject*)sfp[0].asObject; KUtilsWriteBuffer wb; // assert DBG_ASSERT(po->self != NULL); KLIB Kwb_init(&(kctx->stack->cwb), &wb); O_ct(sfp[0].asObject)->p(kctx, sfp, 0, &wb, 0); kString* s = KLIB new_kString(kctx, KLIB Kwb_top(kctx, &wb, 1), Kwb_bytesize(&wb), 0); KLIB Kwb_free(&wb); RETURN_(s); //if (PyString_Check(po->self)) { // //dec // t = PyString_AsString(po->self); // RETURN_(KLIB new_kString(kctx, t, strlen(t), 0)); //} //else if (PyUnicode_Check(po->self)) { // //dec // PyObject* s = PyUnicode_AsUTF8String(po->self); // // [TODO] there is no t's NULL check. Is it OK? // t = PyString_AsString(s); // RETURN_(KLIB new_kString(kctx, t, strlen(t), 0)); //} //else if (PyByteArray_Check(po->self)) { // //dec // t = PyByteArray_AsString(po->self); // RETURN_(KLIB new_kString(kctx, t, strlen(t), 0)); //} //else { // KUtilsWriteBuffer wb; // KLIB Kwb_init(&(kctx->stack->cwb), &wb); // O_ct(sfp[0].asObject)->p(kctx, sfp, 0, &wb, 0); // kString* s = KLIB new_kString(kctx, KLIB Kwb_top(kctx, &wb, 1), Kwb_bytesize(&wb), 0); // KLIB Kwb_free(&wb); // RETURN_(s); //} }
static kString *Kwb_newString(KonohaContext *kctx, kArray *gcstack, KGrowingBuffer *wb) { return KLIB new_kString(kctx, gcstack, KLIB Kwb_top(kctx, wb, false), Kwb_bytesize(wb), 0); }
static KMETHOD Statement_import(KonohaContext *kctx, KonohaStack *sfp) { int ret = false; VAR_Statement(stmt, gma); kTokenArray *tokenList = (kTokenArray *) kStmt_GetObjectNULL(kctx, stmt, KW_TokenPattern); if(tokenList == NULL) { KReturnUnboxValue(false); } kNameSpace *ns = Stmt_ns(stmt); SugarSyntaxVar *syn = (SugarSyntaxVar *) SYN_(ns, KW_ExprMethodCall); kExpr *expr; kTokenVar *tkImport = /*G*/new_(TokenVar, 0, OnGcStack); tkImport->resolvedSymbol = MN_("import"); if(IS_Token(tokenList)) { kTokenArray *list = ((kToken *) tokenList)->subTokenList; if(IS_String(list)) { /* case: import cstyle; */ kString *pkgname = (kString *) list; expr = CreateImportCall(kctx, syn, tkImport, ns, pkgname); } else if(kArray_size(list) == 1) { /* case : import("konoha.import"); */ kExpr *param0 = makeStringConstValue(kctx, list->TokenItems[0]->text); expr = SUGAR new_UntypedCallStyleExpr(kctx, syn, 3, tkImport, new_ConstValueExpr(kctx, O_typeId(ns), UPCAST(ns)), param0); } else if(kArray_size(list) == 2) { /* case : import("konoha.import", "import"); */ kExpr *param0 = makeStringConstValue(kctx, list->TokenItems[0]->text); kExpr *param1 = makeStringConstValue(kctx, list->TokenItems[1]->text); expr = SUGAR new_UntypedCallStyleExpr(kctx, syn, 4, tkImport, new_ConstValueExpr(kctx, O_typeId(ns), UPCAST(ns)), param0, param1); } else { KReturnUnboxValue(false); } } else { KGrowingBuffer wb; KLIB Kwb_Init(&(kctx->stack->cwb), &wb); /* case : import konoha.import */ ksymbol_t star = SYM_("*"); size_t i = 0; if(i + 2 < kArray_size(tokenList)) { for (; i < kArray_size(tokenList)-1; i+=2) { /* name . */ kToken *tk = tokenList->TokenItems[i+0]; if(i+2 < kArray_size(tokenList)) { kToken *startTk = tokenList->TokenItems[i+2]; if(startTk->resolvedSyntaxInfo->keyword == star) { break; } } KLIB Kwb_Write(kctx, &wb, S_text(tk->text), S_size(tk->text)); KLIB Kwb_Write(kctx, &wb, ".", 1); } } kString *name = tokenList->TokenItems[i]->text; KLIB Kwb_Write(kctx, &wb, S_text(name), S_size(name)); kString *pkgname = KLIB new_kString(kctx, OnGcStack, KLIB Kwb_top(kctx, &wb, 1), Kwb_bytesize(&wb), 0); expr = CreateImportCall(kctx, syn, tkImport, ns, pkgname); } KLIB kObject_setObject(kctx, stmt, KW_ExprPattern, TY_Expr, expr); ret = SUGAR kStmt_TypeCheckByName(kctx, stmt, KW_ExprPattern, gma, TY_void, TypeCheckPolicy_ALLOWVOID); if(ret) { kStmt_typed(stmt, EXPR); } KReturnUnboxValue(ret); }