CRB_Value new_array_sub(CRB_Interpreter *inter, CRB_LocalEnvironment *env, int arg_count, CRB_Value *args, int arg_idx) { CRB_Value ret; int size; int i; if (args[arg_idx].type != CRB_INT_VALUE) { crb_runtime_error(0, NEW_ARRAY_ARGUMENT_TYPE_ERR, MESSAGE_ARGUMENT_END); } size = args[arg_idx].u.int_value; ret.type = CRB_ARRAY_VALUE; ret.u.object = CRB_create_array(inter, env, size); if (arg_idx == arg_count-1) { for (i = 0; i < size; i++) { ret.u.object->u.array.array[i].type = CRB_NULL_VALUE; } } else { for (i = 0; i < size; i++) { ret.u.object->u.array.array[i] = new_array_sub(inter, env, arg_count, args, arg_idx+1); } } return ret; }
CRB_Value new_array_sub(CRB_Interpreter *inter, CRB_LocalEnvironment *env, int arg_count, CRB_Value *args, int arg_idx) { CRB_Value ret; CRB_Value value; int size; int i; if (args[arg_idx].type != CRB_INT_VALUE) { CRB_error(inter, env, &st_lib_info, __LINE__, (int)NEW_ARRAY_ARGUMENT_TYPE_ERR, CRB_MESSAGE_ARGUMENT_END); } size = args[arg_idx].u.int_value; ret.type = CRB_ARRAY_VALUE; ret.u.object = CRB_create_array(inter, env, size); if (arg_idx == arg_count-1) { value.type = CRB_NULL_VALUE; for (i = 0; i < size; i++) { CRB_array_set(inter, env, ret.u.object, i, &value); } } else { for (i = 0; i < size; i++) { value = new_array_sub(inter, env, arg_count, args, arg_idx+1); CRB_array_set(inter, env, ret.u.object, i, &value); } } return ret; }