Example #1
0
static void InitStaticBuilderApi(struct KBuilderAPI *builderApi)
{
	builderApi->target = "FuelVM";
#define DEFINE_BUILDER_API(NAME) builderApi->visit##NAME##Node = FuelVM_Visit##NAME##Node;
	KNodeList(DEFINE_BUILDER_API);
#undef DEFINE_BUILDER_API
	builderApi->GenerateVirtualCode = FuelVM_GenerateVirtualCode;
	builderApi->GenerateMethodFunc  = FuelVM_GenerateMethodFunc;
	builderApi->SetMethodCode        = FuelVM_SetMethodCode;
	builderApi->RunVirtualMachine    = FuelVM_Run;
}
Example #2
0
static kbool_t CollectLocalVar_VisitFunctionNode(KVISITOR_PARAM)
{
	size_t i, ParamSize = kArray_size(node->NodeList)-2;
	for(i = 0; i < ParamSize; i++) {
		kUntypedNode *expr = kUntypedNode_At(node, i+2);
		KLIB VisitNode(kctx, builder, expr, thunk);
	}
	return true;
}

#define DEFINE_LOCALVAR_COLLECTOR_API(NAME) CollectLocalVar_Visit##NAME##Node,
static const struct KBuilderAPI CollectLocalVar_BuilderAPI = {
	"CollectLocalVar",
	NULL,
	KNodeList(DEFINE_LOCALVAR_COLLECTOR_API)
};

/* end of Local Variable Analysis Visitor */
/*----------------------------------------------------------------------------*/

static void FreeVirtualCode(KonohaContext *kctx, struct KVirtualCode *vcode)
{
	OPTHCODE *opTHCODE = (OPTHCODE *)(vcode - 1);
	if(opTHCODE->opcode == OPCODE_THCODE && opTHCODE->codesize > 0) {
		KFree(opTHCODE, opTHCODE->codesize);
	}
}

static struct KVirtualCodeAPI vapi = {
		FreeVirtualCode, WriteVirtualCode