コード例 #1
0
ファイル: sq_slave_vm.cpp プロジェクト: The-Mad-Pirate/squilu
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;
}
コード例 #2
0
ファイル: sq_mysql.cpp プロジェクト: mingodad/squilu
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);
}
コード例 #3
0
ファイル: sq_slave_vm.cpp プロジェクト: The-Mad-Pirate/squilu
/*
** 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;
}
コード例 #4
0
ファイル: sq_bitvector.cpp プロジェクト: mingodad/squilu
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);
}