static void _define_builtin_function(Scope *builtin_scope, Type rtype, char *name, builtin_function fn, int nparams, ...) { Symbol *fn_symbol = symbol_new(S_BUILTIN, name); fn_symbol->eval_type = rtype; fn_symbol->fn = fn; scope_define(builtin_scope, fn_symbol); fn_symbol->args = scope_new(NULL); va_list params; va_start(params, nparams); for(int i = 0; i < nparams; i++) { Type t = va_arg(params, Type); /* the n-th parameter is called "n" */ char buf[32]; snprintf(buf, 32, "%d", i); Symbol *sy = symbol_new(S_VARIABLE, buf); sy->eval_type = t; scope_define(fn_symbol->args, sy); } va_end(params); }
symbol *mangle_tbl( int flag, // 0: vtbl, 1: vbtbl type *t, // type for symbol Classsym *stag, // class we're putting tbl in baseclass_t *b) // base class (NULL if none) { const char *id; symbol *s; #if 0 dbg_printf("mangle_tbl(stag = '%s', sbase = '%s', parent = '%s')\n", stag->Sident,b ? b->BCbase->Sident : "NULL", b ? b->parent->Sident : "NULL"); #endif if (flag == 0) id = config.flags3 & CFG3rtti ? "?_Q" : "?_7"; else id = "?_8"; MangleInuse m; mangle.znamei = 0; mangle.argi = 0; mangle.np = mangle.buf; CHAR('?'); cpp_zname(id); cpp_scope(stag); CHAR('@'); CHAR('6' + flag); cpp_ecsu_data_indirect_type(t); #if 1 while (b) { cpp_scope(b->BCbase); CHAR('@'); b = b->BCpbase; } #else if (b) { cpp_scope(b->BCbase); CHAR('@'); // BUG: what if b is more than one level down? if (b->parent != stag) { cpp_scope(b->BCparent); CHAR('@'); } } #endif CHAR('@'); *mangle.np = 0; // 0-terminate mangle.buf[] assert(strlen(mangle.buf) <= BUFIDMAX); s = scope_define(mangle.buf,SCTglobal | SCTnspace | SCTlocal,SCunde); s->Stype = t; t->Tcount++; return s; }