static SQInteger sq_lib_bind_var(HSQUIRRELVM v) { void **modbuf; void *mod; void *sym; const SQChar *symname; const char *type; sq_getuserdata(v, 1, (void**)&modbuf, NULL); mod = *modbuf; sq_getstring(v, 2, &type); sq_getstring(v, 3, &symname); sym = GET_SYM(mod, symname); if (!sym) return sq_throwerror(v, "Cannot find symbol"); FFIVar *ffibuf = (FFIVar*)sq_newuserdata(v, sizeof(FFIVar)); sq_push_delegate_table(v, FFI_LIB_VAR_TAG); sq_setdelegate(v, -2); ffibuf->var = sym; ffibuf->type = *type; return 1; }
void Squirrel::AddMethod(const char *method_name, SQFUNCTION proc, uint nparam, const char *params, void *userdata, int size) { sq_pushstring(this->vm, OTTD2SQ(method_name), -1); if (size != 0) { void *ptr = sq_newuserdata(vm, size); memcpy(ptr, userdata, size); } sq_newclosure(this->vm, proc, size != 0 ? 1 : 0); if (nparam != 0) sq_setparamscheck(this->vm, nparam, OTTD2SQ(params)); sq_setnativeclosurename(this->vm, -1, OTTD2SQ(method_name)); sq_newslot(this->vm, -3, SQFalse); }
static SQInteger sq_ffi_sym(HSQUIRRELVM v) { void *mod; const SQChar *symname; sq_getuserpointer(v, 2, &mod); sq_getstring(v, 3, &symname); void *sym = GET_SYM(mod, symname); printf("GET_SYM(%s) = %p\n", symname, sym); if (!sym) return sq_throwerror(v, "Cannot find symbol"); void **p = (void**)sq_newuserdata(v, sizeof(sym)); *p = sym; return 1; }
static SQInteger sq_ffi_load(HSQUIRRELVM v) { const SQChar *fname; sq_getstring(v, 2, &fname); void *mod = OPEN_LIB(fname); if (!mod) return sq_throwerror(v, "Cannot load library"); sq_pushuserpointer(v, mod); void **p = (void**)sq_newuserdata(v, sizeof(mod)); *p = mod; sq_push_delegate_table(v, FFI_LIB_LIB_TAG); sq_setdelegate(v, -2); return 1; }
static SQInteger sq_lib_bind_func(HSQUIRRELVM v) { void **modbuf; void *mod; void *sym; const SQChar *symname; const char *rettype; sq_getuserdata(v, 1, (void**)&modbuf, NULL); mod = *modbuf; sq_getstring(v, 2, &rettype); sq_getstring(v, 3, &symname); sym = GET_SYM(mod, symname); if (!sym) return sq_throwerror(v, "Cannot find symbol"); int nparam = sq_getsize(v, 4); int size = sizeof(FFIFunc) + sizeof(ffi_type*) * nparam; FFIFunc *ffibuf = (FFIFunc*)sq_newuserdata(v, size); sq_push_delegate_table(v, FFI_LIB_FUNC_TAG); sq_setdelegate(v, -2); // printf("Allocated %d bytes at %p\n", size, ffibuf); ffibuf->func = sym; ffibuf->rettype = *rettype; int i; for (i = 0; i < nparam; i++) { sq_pushinteger(v, i); sq_get(v, 4); ffibuf->params[i] = get_ffi_type(v, -1); if (!ffibuf->params[i]) return SQ_ERROR; sq_poptop(v); } int res = ffi_prep_cif(&ffibuf->cif, FFI_DEFAULT_ABI, nparam, char2ffi_type(*rettype), ffibuf->params); if (res != FFI_OK) return sq_throwerror(v, "Error in ffi_prep_cif"); return 1; }