static SQRESULT sq_slave_vm_call(HSQUIRRELVM v) { SQ_FUNC_VARS_NO_TOP(v); GET_sq_slave_vm_INSTANCE(v, 1); SQ_GET_BOOL(v, 2, has_ret_val); SQ_GET_STRING(v, 3, func_name); SQInteger top = sq_gettop(self); SQRESULT result = SQ_ERROR; sq_pushroottable(self); sq_pushstring(self, func_name, func_name_size); if(sq_get(self, -2) == SQ_OK) { switch(sq_gettype(self, -1)) { case OT_CLOSURE: case OT_NATIVECLOSURE: case OT_CLASS: { sq_pushroottable(self); int argc = sq_gettop(v) - 3; if(argc && copy_values_between_vms(self, v, argc, 4) != SQ_OK) { sq_throwerror(v, sq_getlasterror_str(self)); goto cleanup; } if(sq_call(self, argc+1, has_ret_val, SQFalse) != SQ_OK) { sq_throwerror(v, sq_getlasterror_str(self)); goto cleanup; } if(has_ret_val) { if(copy_values_between_vms(v, self, 1, sq_gettop(self)) == SQ_OK) result = 1; } else result = SQ_OK; } } } else { sq_throwerror(v, sq_getlasterror_str(self)); } cleanup: sq_settop(self, top); return result; }
static SQRESULT sq_mysql_statement_bind_base(HSQUIRRELVM v, SQInteger top, SQ_MysqlStatement *self){ SQRESULT _rc_; if((top - 1) != self->param_count){ return sq_throwerror(v, "Expect %d params but got %d !", (int)self->param_count, (int)top-1); } memset(self->bind_data_buffer, 0, self->bind_data_buffer_size); int offset = 0; for (int argn = 2; argn <= top; ++argn) { SQObjectType ptype = sq_gettype(v, argn); int i = argn - 2; MYSQL_BIND &bind_info = self->bind_params_info[i]; SQInteger *boolean_or_int; switch(ptype) { case OT_NULL:{ bind_info.buffer_type = MYSQL_TYPE_NULL; bind_info.is_null = (my_bool*)1; } break; case OT_BOOL:{ SQ_GET_BOOL(v, argn, param_bool); boolean_or_int = (SQInteger *)(((char*)self->bind_params_data) + offset); offset += sizeof(SQInteger); *boolean_or_int = (SQInteger)param_bool; bind_info.buffer_type = MYSQL_TYPE_LONG; bind_info.is_null = (my_bool*)0; bind_info.buffer = (char *)boolean_or_int; bind_info.length = 0; } break; case OT_INTEGER:{ SQ_GET_INTEGER(v, argn, param_int); boolean_or_int = (SQInteger *)(((char*)self->bind_params_data) + offset); offset += sizeof(SQInteger); *boolean_or_int = param_int; bind_info.buffer_type = ((sizeof(SQInteger) == sizeof(int64_t)) ? MYSQL_TYPE_LONGLONG : MYSQL_TYPE_LONG); bind_info.is_null = (my_bool*)0; bind_info.buffer = (char *)boolean_or_int; bind_info.length = 0; } break; case OT_FLOAT:{ /* * num needs to be it's own * memory here */ SQFloat *num = (SQFloat *)(((char*)self->bind_params_data) + offset); offset += sizeof(SQFloat); SQ_GET_FLOAT(v, argn, param_float); *num = param_float; bind_info.buffer_type = ((sizeof(SQFloat) == sizeof(float)) ? MYSQL_TYPE_FLOAT : MYSQL_TYPE_DOUBLE); bind_info.is_null = (my_bool*)0; bind_info.buffer = (char *)num; bind_info.length = 0; } break; case OT_STRING:{ SQ_GET_STRING(v, argn, param_string); offset += sizeof(char*); bind_info.buffer_type = MYSQL_TYPE_STRING; bind_info.is_null = (my_bool*)0; bind_info.buffer = (char *)param_string; bind_info.length_value = param_string_size; bind_info.length = &bind_info.length_value; } break; default:{ return sq_throwerror(v, "Unsupported bind parameter type %d", i); } } } return dlmysql_stmt_bind_param(self->stmt, self->bind_params_info); }
/* ** Copies values from State src to State dst. */ static SQRESULT copy_values_between_vms (HSQUIRRELVM dst, HSQUIRRELVM src, int argc, int argIdx) { SQRESULT _rc_; sq_reservestack(dst, argc + 20); argc += argIdx; //we will work with argc args starting at argIdx for (; argIdx < argc; argIdx++) { switch (sq_gettype(src, argIdx)) { case OT_INTEGER: SQ_GET_INTEGER(src, argIdx, vint); sq_pushinteger(dst, vint); break; case OT_FLOAT: SQ_GET_FLOAT(src, argIdx, vfloat); sq_pushfloat (dst, vfloat); break; case OT_BOOL: SQ_GET_BOOL(src, argIdx, vbool); sq_pushbool (dst, vbool); break; case OT_STRING: { SQ_GET_STRING(src, argIdx, vstr) sq_pushstring (dst, vstr, vstr_size); } break; case OT_ARRAY: { SQInteger size = sq_getsize(src, argIdx); sq_newarray(dst, size); for(SQInteger i=0; i<size; ++i) { sq_pushinteger(src, i); sq_get(src, -2); sq_pushinteger(dst, i); if(copy_values_between_vms(dst, src, 1, sq_gettop(src)) != SQ_OK) return SQ_ERROR; sq_poptop(src); sq_set(dst, -3); } } break; case OT_TABLE: { sq_newtable(dst); sq_pushnull(src); while(sq_next(src, -2) == SQ_OK) { SQInteger src_top = sq_gettop(src); if(copy_values_between_vms(dst, src, 1, src_top-1) != SQ_OK || copy_values_between_vms(dst, src, 1, src_top) != SQ_OK) return SQ_ERROR; sq_newslot(dst, -3, SQFalse); sq_pop(src, 2); } sq_pop(src,1); } break; case OT_USERPOINTER: { SQUserPointer ptr; sq_getuserpointer(src, argIdx, &ptr); sq_pushuserpointer(dst, ptr); } break; case OT_NULL: sq_pushnull(dst); break; default: return SQ_ERROR; } } return SQ_OK; }
static SQRESULT sq_BitVector__set(HSQUIRRELVM v){ SQ_FUNC_VARS_NO_TOP(v); SQ_GET_BOOL(v, 3, bval); if(bval) return sq_BitVector_set(v); return sq_BitVector_clear(v); }