Esempio n. 1
0
static void MPIData_extend(KonohaContext *kctx, kMPIData *p, int size) {
	size_t newSize = p->offset + size;
	if(p->size < newSize) {
		switch(p->typeId) {
		case KMPI_BYTES: {
			kBytes *b = (kBytes *)KLIB new_kObjectDontUseThis(kctx, CT_Bytes, (uintptr_t)newSize, OnStack);
			memcpy(b->buf, p->b->buf, p->size);
			p->b = b;
			p->size = newSize;
			break;
		}
		case KMPI_FARRAY: {
			kfloat_t *fa = KCalloc_UNTRACE(sizeof(kfloat_t), newSize);
			memcpy(fa, p->fa, p->size * sizeof(kfloat_t));
			KFree(p->fa, p->size * sizeof(kfloat_t));
			p->fa = fa;
			p->size = newSize;
			break;
		}
		case KMPI_IARRAY: {
			kint_t *ia = KCalloc_UNTRACE(sizeof(kint_t), newSize);
			memcpy(ia, p->ia, p->size * sizeof(kint_t));
			KFree(p->ia, p->size * sizeof(kint_t));
			p->ia = ia;
			p->size = newSize;
			break;
		}
		default:
			abort();
		}
	}
}
Esempio n. 2
0
static KonohaContextVar* new_KonohaContext(KonohaContext *kctx, PlatformApi *platApi)
{
	KonohaContextVar *newctx;
	static volatile size_t ctxid_counter = 0;
	ctxid_counter++;
	if(kctx == NULL) {  // NULL means first one
		KonohaLibVar *klib = (KonohaLibVar *)calloc(sizeof(KonohaLib) + sizeof(KonohaContextVar), 1);
		klib_Init(klib);
		klib->KRuntime_SetModule  = KRuntime_SetModule;
		klib->KonohaContext_Init = new_KonohaContext;
		klib->KonohaContext_Free = KonohaContext_Free;
		klib->ReftraceAll = ReftraceAll;
		klib->KonohaFactory_CreateKonoha = KonohaFactory_CreateKonoha;
		klib->Konoha_Destroy = Konoha_Destroy;
		newctx = (KonohaContextVar *)(klib + 1);
		newctx->klib = (KonohaLib *)klib;
		newctx->platApi = platApi;
		kctx = (KonohaContext *)newctx;
		newctx->runtimeModels = (KRuntimeModel**)calloc(sizeof(KRuntimeModel *), KRuntimeModel_MAXSIZE);
		newctx->localContexts = (KModelContext**)calloc(sizeof(KModelContext *), KRuntimeModel_MAXSIZE);
		DBG_ASSERT(PLATAPI GCModule.InitGcContext != NULL);
		PLATAPI GCModule.InitGcContext(newctx);
		PLATAPI JsonModule.InitJsonContext(newctx);
		KRuntime_Init(kctx, newctx);
	}
	else {   // others take ctx as its parent
		newctx = (KonohaContextVar *)KCalloc_UNTRACE(sizeof(KonohaContextVar), 1);
		newctx->klib = kctx->klib;
		newctx->platApi = kctx->platApi;
		newctx->share = kctx->share;
		newctx->runtimeModels = kctx->runtimeModels;
		newctx->localContexts = (KModelContext**)KCalloc_UNTRACE(sizeof(KModelContext *), KRuntimeModel_MAXSIZE);
		PLATAPI GCModule.InitGcContext(kctx);
		PLATAPI JsonModule.InitJsonContext(newctx);
	}
	KRuntimeContext_Init(kctx, newctx, platApi->stacksize);
	if(IS_RootKonohaContext(newctx)) {
		MODSUGAR_Init(kctx, newctx);
		LoadDefaultMethod(kctx, KNULL(NameSpace));
		LoadDefaultSugarMethod(kctx, KNULL(NameSpace));
	}
	else {
		int i;
		for(i = 0; i < KRuntimeModel_MAXSIZE; i++) {
			KRuntimeModel *mod = newctx->runtimeModels[i];
			if(mod == NULL) continue;
			if(mod->setupModelContext != NULL) {
				mod->setupModelContext((KonohaContext *)newctx, mod, true);
			}
		}
	}
	return newctx;
}
Esempio n. 3
0
static void KRuntimeContext_Init(KonohaContext *kctx, KonohaContextVar *ctx, size_t stacksize)
{
	size_t i;
	KRuntimeContextVar *base = (KRuntimeContextVar *)KCalloc_UNTRACE(sizeof(KRuntimeContextVar), 1);
	base->stacksize = stacksize;
	base->stack = (KonohaStack *)KCalloc_UNTRACE(sizeof(KonohaStack), stacksize);
	assert(stacksize>64);
	base->stack_uplimit = base->stack + (stacksize - 64);
	for(i = 0; i < stacksize; i++) {
		KUnsafeFieldInit(base->stack[i].asObject, K_NULL);
	}
	KUnsafeFieldInit(base->ContextConstList, new_(Array, 8, OnField));
	KUnsafeFieldInit(base->ThrownException, (kException *)K_NULL);
	base->gcStack = new_(Array, K_PAGESIZE/sizeof(void *), base->ContextConstList);
	KLIB KArray_Init(kctx, &base->cwb, K_PAGESIZE * 4);
	ctx->esp = base->stack;
	ctx->stack = base;
}
Esempio n. 4
0
static struct KVirtualCode *CompileVirtualCode(KonohaContext *kctx, KBuilder *builder, bblock_t beginId, bblock_t returnId)
{
	KVirtualCode *vcode;
	ByteCodeWriter writer = {NULL, 0, builder->InstructionSize * sizeof(KVirtualCode)};
	BasicBlock_Optimize(kctx, beginId, &writer);
	DBG_P(">>>>>> codesize=%d", writer.codesize);
	DBG_ASSERT(writer.codesize != 0);
	vcode = (KVirtualCode *)KCalloc_UNTRACE(writer.codesize, 1);
	writer.current = vcode;
	BasicBlock_WriteByteCode(kctx, beginId, &writer);
	BasicBlock_WriteByteCode(kctx, returnId, &writer);
	BasicBlock_SetJumpAddr(kctx, BasicBlock_FindById(kctx, beginId), (char *)vcode);
	vcode = MakeThreadedCode(kctx, builder, vcode, writer.codesize);
	DumpVirtualCode(kctx, vcode);
	return vcode;
}
Esempio n. 5
0
static KMETHOD Array_newArray(KonohaContext *kctx, KonohaStack *sfp)
{
	kArrayVar *a = (kArrayVar *)sfp[0].asObject;
	size_t asize = (size_t)sfp[1].intValue;
	a->bytemax = asize * sizeof(uintptr_t);
	kArray_SetSize(a, asize);
	a->ObjectItems = (kObject**)KCalloc_UNTRACE(a->bytemax, 1);
	if(!kArray_isUnboxData(a)) {
		size_t i;
		kObject *null = KLIB Knull(kctx, CT_(O_p0(a)));
		for(i = 0; i < asize; i++) {
			KFieldSet(a, a->ObjectItems[i], null);
		}
	}
	KReturn(a);
}
Esempio n. 6
0
static void SugarModule_Setup(KonohaContext *kctx, struct KRuntimeModel *def, int newctx)
{
	if(!newctx && kctx->localContexts[ParserModelIndex] == NULL) {
		KParserContext *base = (KParserContext *)KCalloc_UNTRACE(sizeof(KParserContext), 1);
		base->h.reftrace = KParserContext_Reftrace;
		base->h.free     = KParserContext_Free;

		base->errorMessageCount = 0;
		base->preparedTokenList = new_(TokenArray, K_PAGESIZE/sizeof(void *), OnContextConstList);
		base->errorMessageList  = new_(StringArray, 8, OnContextConstList);
		base->definedMethodList = new_(MethodArray, 8, OnContextConstList);

		KLIB KArray_Init(kctx, &base->errorMessageBuffer, K_PAGESIZE);
		kctx->localContexts[ParserModelIndex] = (KModelContext *)base;
	}
}
Esempio n. 7
0
static void SugarModule_Setup(KonohaContext *kctx, struct KonohaModule *def, int newctx)
{
	if(!newctx && kctx->modlocal[MOD_sugar] == NULL) {
		SugarContext *base = (SugarContext *)KCalloc_UNTRACE(sizeof(SugarContext), 1);
		base->h.reftrace = SugarContext_Reftrace;
		base->h.free     = SugarContext_Free;

		base->errorMessageCount = 0;
		base->preparedTokenList = new_(TokenArray, K_PAGESIZE/sizeof(void *), OnContextConstList);
		base->errorMessageList  = new_(StringArray, 8, OnContextConstList);
		base->definedMethodList = new_(MethodArray, 8, OnContextConstList);
		base->preparedGamma     = new_(Gamma, NULL, OnContextConstList);

		KLIB Karray_Init(kctx, &base->errorMessageBuffer, K_PAGESIZE);
		kctx->modlocal[MOD_sugar] = (KonohaModuleContext *)base;
	}
}
Esempio n. 8
0
static KVirtualCode *KonohaVirtualMachine_tryJump(KonohaContext *kctx, KonohaStack *sfp, KVirtualCode *pc)
{
	int jmpresult;
	INIT_GCSTACK();
	KRuntimeContextVar *base = kctx->stack;
	jmpbuf_i lbuf = {0};
	if(base->evaljmpbuf == NULL) {
		base->evaljmpbuf = (jmpbuf_i *)KCalloc_UNTRACE(sizeof(jmpbuf_i), 1);
	}
	memcpy(&lbuf, base->evaljmpbuf, sizeof(jmpbuf_i));
	if((jmpresult = PLATAPI setjmp_i(*base->evaljmpbuf)) == 0) {
		pc = MiniVM_RunVirtualMachine(kctx, sfp, pc);
	}
	else {
		DBG_P("Catch eval exception jmpresult=%d", jmpresult);
		//KSETv(sfp[exceptionIdx].e, ..);
		pc = NULL;
	}
	memcpy(base->evaljmpbuf, &lbuf, sizeof(jmpbuf_i));
	RESET_GCSTACK();
	return pc;
}
Esempio n. 9
0
static void KonohaClass_InitField(KonohaContext *kctx, KonohaClassVar *definedClass, KonohaClass *superClass, size_t fieldInitSize)
{
	size_t fieldsize = superClass->fieldsize + fieldInitSize;
	definedClass->cstruct_size = size64((fieldsize * sizeof(kObject *)) + sizeof(KonohaObjectHeader));
	DBG_P("superClass->fieldsize=%d, definedFieldSize=%d, cstruct_size=%d", superClass->fieldsize, fieldInitSize, definedClass->cstruct_size);
	if(fieldsize > 0) {
		definedClass->fieldItems = (KonohaClassField *)KCalloc_UNTRACE(fieldsize, sizeof(KonohaClassField));
		definedClass->fieldAllocSize = fieldsize;
		definedClass->fieldsize = superClass->fieldsize; /* supsize */
		if(superClass->fieldsize > 0) {
			memcpy(definedClass->fieldItems, superClass->fieldItems, sizeof(KonohaClassField) * superClass->fieldsize);
		}
	}
	definedClass->fnull(kctx, definedClass);  // first generation of DefaultValueAsNull
	superClass->fnull(kctx, superClass); // ensure default value of super class
	memcpy(definedClass->defaultNullValueVar_OnGlobalConstList->fieldObjectItems, superClass->defaultNullValueVar_OnGlobalConstList->fieldObjectItems, sizeof(kObject *) * superClass->fieldsize);
	definedClass->init     = ObjectField_Init;
	definedClass->reftrace = ObjectField_Reftrace;
	definedClass->superTypeId = superClass->typeId;
	definedClass->searchSuperMethodClassNULL = superClass;
	// add other functions
}
Esempio n. 10
0
void MODSUGAR_Init(KonohaContext *kctx, KonohaContextVar *ctx)
{
	KModuleSugar *mod = (KModuleSugar *)KCalloc_UNTRACE(sizeof(KModuleSugar), 1);
	mod->h.name     = "sugar";
	mod->h.allocSize = sizeof(KModuleSugar);
	mod->h.setupModuleContext    = SugarModule_Setup;
	KLIB KonohaRuntime_setModule(kctx, MOD_sugar, (KonohaModule *)mod, 0);

	KonohaLibVar* l = (KonohaLibVar *)ctx->klib;
	l->kNameSpace_GetClass       = kNameSpace_GetClass;
	l->kNameSpace_DefineClass    = kNameSpace_DefineClass;
	l->kNameSpace_LoadMethodData = kNameSpace_LoadMethodData;
	l->kNameSpace_SetConstData   = kNameSpace_SetConstData;
	l->kNameSpace_LoadConstData  = kNameSpace_LoadConstData;
	l->kNameSpace_GetGetterMethodNULL  = kNameSpace_GetGetterMethodNULL;
	l->kNameSpace_GetSetterMethodNULL  = kNameSpace_GetSetterMethodNULL;
	l->kNameSpace_GetCoercionMethodNULL = kNameSpace_GetCoercionMethodNULL;
	l->kNameSpace_GetMethodByParamSizeNULL  = kNameSpace_GetMethodByParamSizeNULL;
	l->kNameSpace_GetMethodBySignatureNULL  = kNameSpace_GetMethodBySignatureNULL;
	l->kMethod_DoLazyCompilation = kMethod_DoLazyCompilation;
//	l->kNameSpace_compileAllDefinedMethods  = kNameSpace_compileAllDefinedMethods;
	l->kNameSpace_FreeSugarExtension =  kNameSpace_FreeSugarExtension;
	l->Konoha_LoadScript = Konoha_LoadScript;
	l->Konoha_Eval       = Konoha_Eval;
	l->kMethod_GenCode   = kMethod_GenCode;
	l->kMethod_setFunc   = kMethod_setFunc;

	KDEFINE_CLASS defToken = {0};
	SETSTRUCTNAME(defToken, Token);
	defToken.init = kToken_Init;
	defToken.reftrace = kToken_Reftrace;
	defToken.p = kToken_p;
	
	KDEFINE_CLASS defExpr = {0};
	SETSTRUCTNAME(defExpr, Expr);
	defExpr.init = kExpr_Init;
	defExpr.reftrace = kExpr_Reftrace;
	defExpr.p        = kExpr_p;
	
	KDEFINE_CLASS defStmt = {0};
	SETSTRUCTNAME(defStmt, Stmt);
	defStmt.init = kStmt_Init;
	defStmt.reftrace = kStmt_Reftrace;
	defStmt.p        = kStmt_p;
	
	KDEFINE_CLASS defBlock = {0};
	SETSTRUCTNAME(defBlock, Block);
	defBlock.init = kBlock_Init;
	defBlock.reftrace = kBlock_Reftrace;
	
	KDEFINE_CLASS defGamma = {0};
	SETSTRUCTNAME(defGamma, Gamma);
	defGamma.init = Gamma_Init;

	mod->cToken =     KLIB KonohaClass_define(kctx, PackageId_sugar, NULL, &defToken, 0);
	mod->cExpr  =     KLIB KonohaClass_define(kctx, PackageId_sugar, NULL, &defExpr, 0);
	mod->cStmt  =     KLIB KonohaClass_define(kctx, PackageId_sugar, NULL, &defStmt, 0);
	mod->cBlock =     KLIB KonohaClass_define(kctx, PackageId_sugar, NULL, &defBlock, 0);
	mod->cGamma =     KLIB KonohaClass_define(kctx, PackageId_sugar, NULL, &defGamma, 0);
	mod->cTokenArray = CT_p0(kctx, CT_Array, mod->cToken->typeId);

	KLIB Knull(kctx, mod->cToken);
	KLIB Knull(kctx, mod->cExpr);
	kStmtVar *NullStmt = (kStmtVar *)KLIB Knull(kctx, mod->cStmt);
	KFieldSet(NullStmt, NullStmt->parentBlockNULL, (kBlock *)KLIB Knull(kctx, mod->cBlock));

	SugarModule_Setup(kctx, &mod->h, 0);

	KDEFINE_INT_CONST ClassData[] = {   // minikonoha defined class
		{"void", VirtualType_KonohaClass, (uintptr_t)CT_void},
		{"boolean", VirtualType_KonohaClass, (uintptr_t)CT_Boolean},
		{"int",    VirtualType_KonohaClass, (uintptr_t)CT_Int},
		{"String", VirtualType_KonohaClass, (uintptr_t)CT_String},
		{"Func",   VirtualType_KonohaClass, (uintptr_t)CT_Func},
		{"System", VirtualType_KonohaClass, (uintptr_t)CT_System},
		{NULL},
	};
	kNameSpace_LoadConstData(kctx, KNULL(NameSpace), KonohaConst_(ClassData), 0);

	mod->kNameSpace_SetTokenFunc       = kNameSpace_SetTokenFunc;
	mod->TokenSeq_Tokenize        = TokenSeq_Tokenize;
	mod->TokenSeq_ApplyMacro      = TokenSeq_ApplyMacro;
	mod->kNameSpace_SetMacroData       = kNameSpace_SetMacroData;
	mod->TokenSeq_Resolve        = TokenSeq_Resolve;
	mod->TokenSeq_Eval            = TokenSeq_Eval;
	mod->TokenUtils_ParseTypePattern     = TokenUtils_ParseTypePattern;
	mod->kToken_ToBraceGroup = kToken_ToBraceGroup;
	mod->kStmt_AddParsedObject      = kStmt_AddParsedObject;
	mod->kNameSpace_FindEndOfStatement = kNameSpace_FindEndOfStatement;
	mod->kStmt_ParseFlag            = kStmt_ParseFlag;
	mod->kStmt_GetToken             = kStmt_GetToken;
	mod->kStmt_GetBlock             = kStmt_GetBlock;
	mod->kStmt_GetExpr              = kStmt_GetExpr;
	mod->kStmt_GetText              = kStmt_GetText;
	mod->kExpr_SetConstValue        = kExpr_SetConstValue;
	mod->kExpr_SetUnboxConstValue   = kExpr_SetUnboxConstValue;
	mod->kExpr_SetVariable          = kExpr_SetVariable;
	mod->kStmt_TypeCheckExprAt        = kStmt_TypeCheckExprAt;
	mod->kStmt_TypeCheckByName        = kStmt_TypeCheckByName;
	mod->kBlock_TypeCheckAll          = kBlock_TypeCheckAll;
	mod->kStmtkExpr_TypeCheckCallParam = kStmtkExpr_TypeCheckCallParam;
	mod->new_TypedCallExpr          = new_TypedCallExpr;
	mod->kGamma_AddLocalVariable = kGamma_AddLocalVariable;
	mod->kStmt_DeclType             = kStmt_DeclType;
	mod->kStmt_TypeCheckVariableNULL  = kStmt_TypeCheckVariableNULL;

	mod->kNameSpace_DefineSyntax    = kNameSpace_DefineSyntax;
	mod->kNameSpace_GetSyntax       = kNameSpace_GetSyntax;
	mod->kArray_AddSyntaxRule       = kArray_AddSyntaxPattern;
//	mod->kNameSpace_SetSugarFunc    = kNameSpace_SetSugarFunc;
	mod->kNameSpace_AddSugarFunc    = kNameSpace_AddSugarFunc;
	mod->new_kBlock                 = new_kBlock;
	mod->new_kStmt                  = new_kStmt;
	mod->kBlock_InsertAfter         = kBlock_InsertAfter;
	mod->new_UntypedTermExpr        = new_UntypedTermExpr;
	mod->new_UntypedCallStyleExpr   = new_UntypedCallStyleExpr;
	mod->kStmt_ParseOperatorExpr    = kStmt_ParseOperatorExpr;
	mod->kStmt_ParseExpr            = kStmt_ParseExpr;
	mod->kStmt_AddExprParam         = kStmt_AddExprParam;
	mod->kStmt_RightJoinExpr        = kStmt_RightJoinExpr;
	mod->kToken_ToError        = kToken_ToError;
	mod->kStmt_Message2        = kStmt_Message2;

	mod->VisitStmt                  = VisitStmt;
	mod->VisitExpr                  = VisitExpr;
	mod->VisitBlock                 = VisitBlock;

#ifndef USE_SMALLBUILD
	mod->dumpToken      = dumpToken;
	mod->dumpTokenArray = dumpTokenArray;
	mod->dumpExpr       = dumpExpr;
#endif

	DefineDefaultSyntax(kctx, KNULL(NameSpace));
}
Esempio n. 11
0
		STRUCTNAME(AprTable),
		.init = AprTable_init,
		.free = AprTable_free,
	};

	static KDEFINE_CLASS aprTableEntryDef = {
		STRUCTNAME(AprTableEntry),
		.init = AprTableEntry_init,
		.free = AprTableEntry_free,
	};

	static KDEFINE_CLASS apacheDef = {
		STRUCTNAME(Apache),
	};

	kapacheshare_t *base = (kapacheshare_t *)KCalloc_UNTRACE(sizeof(kapacheshare_t), 1);
	base->h.name     = "apache";
	base->h.setup    = kapacheshare_setup;
	base->h.reftrace = kapacheshare_reftrace;
	base->h.free     = kapacheshare_free;
	KLIB KonohaRuntime_setModule(kctx, MOD_APACHE, &base->h, trace);
	base->cRequest = KLIB kNameSpace_defineClass(kctx, ns, NULL, &Def, 0);
	base->cAprTable = KLIB kNameSpace_defineClass(kctx, ns, NULL, &aprTableDef, 0);
	base->cAprTableEntry = KLIB kNameSpace_defineClass(kctx, ns, NULL, &aprTableEntryDef, 0);
	base->cApache = KLIB kNameSpace_defineClass(kctx, ns, NULL, &apacheDef, 0);

	KDEFINE_INT_CONST IntData[] = {
#define DEFINE_KEYWORD(KW) {#KW, TY_int, KW}
		{"APACHE_OK", TY_int, OK},
		{"APLOG_EMERG", TY_int, APLOG_EMERG},
		{"APLOG_ALERT", TY_int, APLOG_ALERT},
Esempio n. 12
0
		STRUCTNAME(AprTable),
		.init = AprTable_Init,
		.free = AprTable_Free,
	};

	static KDEFINE_CLASS aprTableEntryDef = {
		STRUCTNAME(AprTableEntry),
		.init = AprTableEntry_Init,
		.free = AprTableEntry_Free,
	};

	static KDEFINE_CLASS apacheDef = {
		STRUCTNAME(Apache),
	};

	KModuleApache *mod = (KModuleApache *)KCalloc_UNTRACE(sizeof(KModuleApache), 1);
	mod->h.name               = "apache";
	mod->h.allocSize          = sizeof(KModuleApache);
	mod->h.setupModuleContext = ApacheModule_Setup;
	mod->h.freeModule         = ApacheModule_Free;
	KLIB KonohaRuntime_setModule(kctx, MOD_APACHE, (KonohaModule *)mod, trace);
	mod->cRequest       = KLIB kNameSpace_DefineClass(kctx, ns, NULL, &Def, 0);
	mod->cAprTable      = KLIB kNameSpace_DefineClass(kctx, ns, NULL, &aprTableDef, 0);
	mod->cAprTableEntry = KLIB kNameSpace_DefineClass(kctx, ns, NULL, &aprTableEntryDef, 0);
	mod->cApache        = KLIB kNameSpace_DefineClass(kctx, ns, NULL, &apacheDef, 0);

	KDEFINE_INT_CONST IntData[] = {
#define DEFINE_KEYWORD(KW) {#KW, TY_int, KW}
		DEFINE_KEYWORD(OK),
		DEFINE_KEYWORD(APLOG_EMERG),
		DEFINE_KEYWORD(APLOG_ALERT),
Esempio n. 13
0
/* ------------------------------------------------------------------------ */
static void SockAddr_Init(KonohaContext *kctx, kObject *o, void *conf)
{
	struct _kSockAddr *sa = (struct _kSockAddr *)o;
	sa->sockaddr_in = (struct sockaddr_in *)KCalloc_UNTRACE(sizeof(struct sockaddr_in), 1);
}
Esempio n. 14
0
static kbool_t regexp_defineMethod(KonohaContext *kctx, kNameSpace *ns, KTraceInfo *trace)
{
	kregexpshare_t *base = (kregexpshare_t *)KCalloc_UNTRACE(sizeof(kregexpshare_t), 1);
	base->h.name     = "regexp";
	base->h.setup    = kregexpshare_setup;
	base->h.reftrace = kregexpshare_reftrace;
	base->h.free     = kregexpshare_free;
	KLIB KonohaRuntime_setModule(kctx, MOD_REGEXP, &base->h, trace);

	KDEFINE_CLASS RegExpDef = {
		STRUCTNAME(RegExp),
		.cflag = 0,
		.init = RegExp_init,
		.free = RegExp_free,
		.p    = RegExp_p,
	};
	base->cRegExp = KLIB kNameSpace_defineClass(kctx, ns, NULL, &RegExpDef, trace);

	ktype_t TY_StringArray0 = CT_StringArray0->typeId;
	KDEFINE_METHOD MethodData[] = {
		/*JS*/_Public|_Const|_Im, _F(RegExp_getglobal), TY_boolean, TY_RegExp, MN_("getglobal"), 0,
		/*JS*/_Public|_Const|_Im, _F(RegExp_getignoreCase), TY_boolean, TY_RegExp, MN_("getignoreCase"), 0,
		/*JS*/_Public|_Const|_Im, _F(RegExp_getmultiline), TY_boolean, TY_RegExp, MN_("getmultiline"), 0,
		/*JS*/_Public|_Const|_Im, _F(RegExp_getsource), TY_String, TY_RegExp, MN_("getsource"), 0,
		/*JS*/_Public|_Const|_Im, _F(RegExp_getlastIndex), TY_int, TY_RegExp, MN_("getlastIndex"), 0,
		/*JS*/_Public|_Im, _F(String_match), TY_StringArray0, TY_String, MN_("match"), 1, TY_RegExp, FN_("regexp"),
		/*JS*/_Public|_Const|_Im, _F(String_replace), TY_String, TY_String, MN_("replace"), 2, TY_RegExp, FN_("searchvalue"), TY_String, FN_("newvalue"),
		/*JS*/_Public|_Const|_Im, _F(String_search), TY_int, TY_String, MN_("search"), 1, TY_RegExp, FN_("searchvalue"),
		/*JS*/_Public|_Im, _F(String_split), TY_StringArray0, TY_String, MN_("split"), 1, TY_RegExp, FN_("separator"),
		/*JS*/_Public|_Im, _F(String_splitWithLimit), TY_StringArray0, TY_String, MN_("split"), 2, TY_RegExp, FN_("separator"), TY_int, FN_("limit"),
		/*JS*/_Public|_Const, _F(RegExp_new),     TY_RegExp,  TY_RegExp,  MN_("new"), 1, TY_String, FN_("pattern"),
		/*JS*/_Public|_Const, _F(RegExp_new2),     TY_RegExp,  TY_RegExp,  MN_("new"), 2, TY_String, FN_("pattern"), TY_String, FN_("option"),
		/*JS*/_Public|_Const, _F(RegExp_exec),    TY_StringArray0, TY_RegExp,  MN_("exec"), 1, TY_String, FN_("str"),
		/*JS*/_Public|_Const|_Im, _F(RegExp_test),    TY_boolean, TY_RegExp,  MN_("test"), 1, TY_String, FN_("str"),
		DEND,
	};
	KLIB kNameSpace_loadMethodData(kctx, ns, MethodData);
	return true;
}

static KMETHOD TokenFunc_JavaScriptRegExp(KonohaContext *kctx, KonohaStack *sfp)
{
	kTokenVar *tk = (kTokenVar *)sfp[1].asObject;
	int ch, prev = '/', pos = 1;
	const char *source = S_text(sfp[2].asString);
	if(source[pos] == '*' || source[pos] == '/') {
		KReturnUnboxValue(0);
	}
	/*FIXME: we need to care about context sensitive case*/
	//int tokenListize = kArray_size(tenv->tokenList);
	//if(tokenListize > 0) {
	//	kToken *tkPrev = tenv->tokenList->TokenItems[tokenListize - 1];
	//	if(tkPrev->unresolvedTokenType == TokenType_INT ||
	//		(tkPrev->topCharHint != '(' && tkPrev->unresolvedTokenType == TokenType_SYMBOL)) {
	//		KReturnUnboxValue(0);
	//	}
	//}
	while((ch = source[pos++]) != 0) {
		if(ch == '\n') {
			break;
		}
		if(ch == '/' && prev != '\\') {
			int pos0 = pos;
			while(isalpha(source[pos])) pos++;
			if(IS_NOTNULL(tk)) {
				kArray *a = (kArray *)KLIB new_kObject(kctx, OnField, CT_StringArray0, 2); // FIXME
				KFieldSet(tk, tk->subTokenList, a);
				KLIB new_kString(kctx, a, source + 1, (pos0-2), 0);
				KLIB new_kString(kctx, a, source + pos0, pos-pos0, 0);
				tk->unresolvedTokenType = SYM_("$RegExp");
			}
			KReturnUnboxValue(pos);
		}
		prev = ch;
	}
	if(IS_NOTNULL(tk)) {
		SUGAR kToken_printMessage(kctx, tk, ErrTag, "must close with %s", "/");
	}
	KReturnUnboxValue(pos-1);
}
Esempio n. 15
0
void MODSUGAR_Init(KonohaContext *kctx, KonohaContextVar *ctx)
{
	KParserModel *mod = (KParserModel *)KCalloc_UNTRACE(sizeof(KParserModel), 1);
	mod->h.name     = "sugar";
	mod->h.allocSize = sizeof(KParserModel);
	mod->h.setupModelContext    = SugarModule_Setup;
	KLIB KRuntime_SetModule(kctx, ParserModelIndex, (KRuntimeModel *)mod, 0);

	KonohaLibVar *l = (KonohaLibVar *)ctx->klib;
	l->kNameSpace_GetClassByFullName  = kNameSpace_GetClassByFullName;
	l->kNameSpace_DefineClass    = kNameSpace_DefineClass;
	l->kNameSpace_LoadMethodData = kNameSpace_LoadMethodData;
	l->kNameSpace_SetConstData   = kNameSpace_SetConstData;
	l->kNameSpace_LoadConstData  = kNameSpace_LoadConstData;
	l->kNameSpace_GetGetterMethodNULL  = kNameSpace_GetGetterMethodNULL;
	l->kNameSpace_GetSetterMethodNULL  = kNameSpace_GetSetterMethodNULL;
	l->kNameSpace_GetCoercionMethodNULL = kNameSpace_GetCoercionMethodNULL;
	l->kNameSpace_GetMethodByParamSizeNULL  = kNameSpace_GetMethodByParamSizeNULL;
	l->kNameSpace_GetMethodBySignatureNULL  = kNameSpace_GetMethodBySignatureNULL;
	l->kMethod_DoLazyCompilation = kMethod_DoLazyCompilation;
	l->kNameSpace_FreeSugarExtension =  kNameSpace_FreeSugarExtension;
	l->Konoha_LoadScript = Konoha_LoadScript;
	l->Konoha_Eval       = Konoha_Eval;
	l->kMethod_GenCode   = kMethod_GenCode;
	l->kMethod_SetFunc   = kMethod_SetFunc;

	KDEFINE_CLASS defSymbol = {0};
	defSymbol.structname = "Symbol";
	defSymbol.typeId = KTypeAttr_NewId;
	defSymbol.cflag = KClassFlag_int;
	defSymbol.init = KClass_(KType_Int)->init;
	defSymbol.unbox = KClass_(KType_Int)->unbox;
	defSymbol.format = kSymbol_format;

	KDEFINE_CLASS defSyntax = {0};
	SETSTRUCTNAME(defSyntax, Syntax);
	defSyntax.init = kSyntax_Init;
	//defSyntax.format = kSyntax_format;

	KDEFINE_CLASS defToken = {0};
	SETSTRUCTNAME(defToken, Token);
	defToken.init = kToken_Init;
	defToken.reftrace = kToken_Reftrace;
	defToken.format = kToken_format;

	KDEFINE_CLASS defNode = {0};
	SETSTRUCTNAME(defNode, Node);
	defNode.init = kUntypedNode_Init;
	defNode.reftrace = kUntypedNode_Reftrace;
	defNode.format        = kUntypedNode_format;

	InitNodeClass(kctx, mod);

	mod->cSymbol =    KLIB KClass_define(kctx, PackageId_sugar, NULL, &defSymbol, 0);
	mod->cSyntax =    KLIB KClass_define(kctx, PackageId_sugar, NULL, &defSyntax, 0);
	mod->cToken =     KLIB KClass_define(kctx, PackageId_sugar, NULL, &defToken, 0);
	mod->cNode  =     KLIB KClass_define(kctx, PackageId_sugar, NULL, &defNode, 0);
	mod->cTokenArray = KClass_p0(kctx, KClass_Array, mod->cToken->typeId);

	KLIB Knull(kctx, mod->cToken);
	KLIB Knull(kctx, mod->cNode);
	SugarModule_Setup(kctx, &mod->h, 0);

	KDEFINE_INT_CONST ClassData[] = {   // konoha defined class
		{"void", VirtualType_KClass,    (uintptr_t)KClass_void},
		{"boolean", VirtualType_KClass, (uintptr_t)KClass_Boolean},
		{"int",    VirtualType_KClass,  (uintptr_t)KClass_Int},
		{"String", VirtualType_KClass,  (uintptr_t)KClass_String},
		{"Func",   VirtualType_KClass,  (uintptr_t)KClass_Func},
		{"System", VirtualType_KClass,  (uintptr_t)KClass_System},
		{NULL},
	};
	kNameSpace_LoadConstData(kctx, KNULL(NameSpace), KConst_(ClassData), 0);

	l->Tokenize              = Tokenize;
	l->ApplyMacroData        = ApplyMacroData;
	l->SetMacroData          = SetMacroData;
	l->Preprocess            = Preprocess;
	l->EvalTokenList         = EvalTokenList;
	l->ParseTypePattern      = ParseTypePattern;
	l->kToken_ToBraceGroup   = kToken_ToBraceGroup;
	l->kUntypedNode_AddParsedObject = kUntypedNode_AddParsedObject;
	l->FindEndOfStatement    = FindEndOfStatement;
	l->kUntypedNode_ParseFlag       = kUntypedNode_ParseFlag;
	l->kUntypedNode_GetToken        = kUntypedNode_GetToken;
	l->kUntypedNode_GetNode         = kUntypedNode_GetNode;
	l->kUntypedNode_SetConst        = kUntypedNode_SetConst;
	l->kUntypedNode_SetUnboxConst   = kUntypedNode_SetUnboxConst;
	l->kUntypedNode_SetVariable     = kUntypedNode_SetVariable;
	l->TypeCheckNodeAt       = TypeCheckNodeAt;
	l->TypeCheckNodeByName   = TypeCheckNodeByName;
	l->TypeCheckMethodParam  = TypeCheckMethodParam;
	l->new_MethodNode        = new_MethodNode;
	l->AddLocalVariable      = AddLocalVariable;
	l->kUntypedNode_DeclType        = kUntypedNode_DeclType;
	l->TypeVariableNULL      = TypeVariableNULL;

	l->kNameSpace_DefineSyntax = kNameSpace_DefineSyntax;
	l->kNameSpace_GetSyntax    = kNameSpace_GetSyntax;
	l->kSyntax_AddPattern      = kSyntax_AddPattern;
	l->kNameSpace_AddSyntax    = kNameSpace_AddSyntax;
	l->kNameSpace_UseDefaultVirtualMachine = kNameSpace_UseDefaultVirtualMachine;
	l->kUntypedNode_InsertAfter       = kUntypedNode_InsertAfter;
	l->kUntypedNode_AddNode           = kUntypedNode_AddNode;
	l->kUntypedNode_Op                = kUntypedNode_Op;
	l->ParseSyntaxNode         = ParseSyntaxNode;
	l->ParseNode               = ParseNode;
	l->ParseNewNode            = ParseNewNode;
	l->AppendParsedNode        = AppendParsedNode;
	l->kToken_ToError          = kToken_ToError;
	l->MessageNode             = MessageNode;
	l->VisitNode               = VisitNode;

#ifndef USE_SMALLBUILD
	l->dumpToken      = dumpToken;
	l->dumpTokenArray = dumpTokenArray;
#endif

	DefineDefaultSyntax(kctx, KNULL(NameSpace));
}