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; }
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