From 44fdd53f2e5bac6fe1cbc2ceb653aa5f2de965e6 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 5 Sep 2018 13:30:14 +0900 Subject: Add `mruby-sleep` gem to the core. --- mrbgems/mruby-sleep/src/mrb_sleep.c | 137 ++++++++++++++++++++++++++++++++++++ mrbgems/mruby-sleep/src/mrb_sleep.h | 12 ++++ 2 files changed, 149 insertions(+) create mode 100644 mrbgems/mruby-sleep/src/mrb_sleep.c create mode 100644 mrbgems/mruby-sleep/src/mrb_sleep.h (limited to 'mrbgems/mruby-sleep/src') diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c new file mode 100644 index 000000000..b711dd5c9 --- /dev/null +++ b/mrbgems/mruby-sleep/src/mrb_sleep.c @@ -0,0 +1,137 @@ +/* +** mrb_sleep - sleep class for mruby +** +** Copyright (c) mod_mruby developers 2012- +** +** Permission is hereby granted, free of charge, to any person obtaining +** a copy of this software and associated documentation files (the +** "Software"), to deal in the Software without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Software, and to +** permit persons to whom the Software is furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] +*/ + +#include +#ifdef _WIN32 + #include + #define sleep(x) Sleep(x * 1000) + #define usleep(x) Sleep(((x)<1000) ? 1 : ((x)/1000)) +#else + #include + #include +#endif + +#include "mruby.h" + +mrb_value mrb_f_sleep_sleep(mrb_state *mrb, mrb_value self) +{ + time_t beg, end; + mrb_value *argv; + mrb_int argc; + int iargc; + + beg = time(0); + mrb_get_args(mrb, "*", &argv, &argc); + + iargc = (int)argc; + + /* not implemented forever sleep (called without an argument)*/ + if (iargc == 0 || iargc >= 2) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + } + + if (mrb_fixnum_p(argv[0]) && mrb_fixnum(argv[0]) >= 0) { + sleep(mrb_fixnum(argv[0])); + } else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); + } + end = time(0) - beg; + + return mrb_fixnum_value(end); +} + +mrb_value mrb_f_usleep_usleep(mrb_state *mrb, mrb_value self) +{ + mrb_int argc; + mrb_value *argv; +#ifdef _WIN32 + FILETIME st_ft,ed_ft; + unsigned __int64 st_time = 0; + unsigned __int64 ed_time = 0; +#else + struct timeval st_tm,ed_tm; +#endif + time_t slp_tm; + +#ifdef _WIN32 + GetSystemTimeAsFileTime(&st_ft); +#else + gettimeofday( &st_tm, NULL ); +#endif + + mrb_get_args(mrb, "*", &argv, &argc); + + /* not implemented forever sleep (called without an argument)*/ + if(argc == 0 || argc >= 2) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); + } + + if (mrb_fixnum_p(argv[0]) && mrb_fixnum(argv[0]) >= 0) { + usleep(mrb_fixnum(argv[0])); + } else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); + } + +#ifdef _WIN32 + GetSystemTimeAsFileTime(&ed_ft); + + st_time |= st_ft.dwHighDateTime; + st_time <<=32; + st_time |= st_ft.dwLowDateTime; + ed_time |= ed_ft.dwHighDateTime; + ed_time <<=32; + ed_time |= ed_ft.dwLowDateTime; + + slp_tm = (ed_time - st_time) / 10; +#else + gettimeofday( &ed_tm, NULL ); + + if ( st_tm.tv_usec > ed_tm.tv_usec ) { + slp_tm = 1000000 + ed_tm.tv_usec - st_tm.tv_usec; + } else { + slp_tm = ed_tm.tv_usec - st_tm.tv_usec; + } +#endif + + return mrb_fixnum_value(slp_tm); +} + +void mrb_mruby_sleep_gem_init(mrb_state *mrb) +{ + struct RClass *sleep; + + sleep = mrb_define_module(mrb, "Sleep"); + mrb_define_class_method(mrb, sleep, "sleep", mrb_f_sleep_sleep, MRB_ARGS_REQ(1)); + mrb_define_class_method(mrb, sleep, "usleep", mrb_f_usleep_usleep, MRB_ARGS_REQ(1)); + + mrb_define_method(mrb, mrb->kernel_module, "sleep", mrb_f_sleep_sleep, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, mrb->kernel_module, "usleep", mrb_f_usleep_usleep, MRB_ARGS_REQ(1)); +} + +void mrb_mruby_sleep_gem_final(mrb_state *mrb) +{ +} diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.h b/mrbgems/mruby-sleep/src/mrb_sleep.h new file mode 100644 index 000000000..bf71d91f4 --- /dev/null +++ b/mrbgems/mruby-sleep/src/mrb_sleep.h @@ -0,0 +1,12 @@ +/* +// mrb_sleep.h - to provide sleep methods +// +// See Copyright Notice in mrb_sleep.c +*/ + +#ifndef MRB_SLEEP_H +#define MRB_SLEEP_H + +void mrb_mruby_sleep_gem_init(mrb_state *mrb); + +#endif -- cgit v1.2.3 From a170c1dd7072120ba2c2cae8e1ed23bdd4b7b532 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 5 Sep 2018 14:54:14 +0900 Subject: Refactored `mruby-sleep` gem. * Method implementation functions made `static`. * Function declaration style has been changed. * Unnecessary header file `mrb_sleep.h` removed. * Used `mrb_get_args()` instead of self parsing. * Indentation kept untouched. --- mrbgems/mruby-sleep/src/mrb_sleep.c | 65 ++++++++++++++++--------------------- mrbgems/mruby-sleep/src/mrb_sleep.h | 12 ------- 2 files changed, 28 insertions(+), 49 deletions(-) delete mode 100644 mrbgems/mruby-sleep/src/mrb_sleep.h (limited to 'mrbgems/mruby-sleep/src') diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c index b711dd5c9..19a4f082f 100644 --- a/mrbgems/mruby-sleep/src/mrb_sleep.c +++ b/mrbgems/mruby-sleep/src/mrb_sleep.c @@ -37,25 +37,17 @@ #include "mruby.h" -mrb_value mrb_f_sleep_sleep(mrb_state *mrb, mrb_value self) -{ +static mrb_value +mrb_f_sleep(mrb_state *mrb, mrb_value self) +{ time_t beg, end; - mrb_value *argv; - mrb_int argc; - int iargc; - + mrb_int sec; + beg = time(0); - mrb_get_args(mrb, "*", &argv, &argc); - - iargc = (int)argc; - /* not implemented forever sleep (called without an argument)*/ - if (iargc == 0 || iargc >= 2) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - } - - if (mrb_fixnum_p(argv[0]) && mrb_fixnum(argv[0]) >= 0) { - sleep(mrb_fixnum(argv[0])); + mrb_get_args(mrb, "i", &sec); + if (sec >= 0) { + sleep(sec); } else { mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); } @@ -64,10 +56,10 @@ mrb_value mrb_f_sleep_sleep(mrb_state *mrb, mrb_value self) return mrb_fixnum_value(end); } -mrb_value mrb_f_usleep_usleep(mrb_state *mrb, mrb_value self) -{ - mrb_int argc; - mrb_value *argv; +static mrb_value +mrb_f_usleep(mrb_state *mrb, mrb_value self) +{ + mrb_int usec; #ifdef _WIN32 FILETIME st_ft,ed_ft; unsigned __int64 st_time = 0; @@ -80,18 +72,14 @@ mrb_value mrb_f_usleep_usleep(mrb_state *mrb, mrb_value self) #ifdef _WIN32 GetSystemTimeAsFileTime(&st_ft); #else - gettimeofday( &st_tm, NULL ); + gettimeofday(&st_tm, NULL); #endif - mrb_get_args(mrb, "*", &argv, &argc); - /* not implemented forever sleep (called without an argument)*/ - if(argc == 0 || argc >= 2) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - } + mrb_get_args(mrb, "i", &usec); - if (mrb_fixnum_p(argv[0]) && mrb_fixnum(argv[0]) >= 0) { - usleep(mrb_fixnum(argv[0])); + if (usec >= 0) { + usleep(usec); } else { mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); } @@ -108,11 +96,12 @@ mrb_value mrb_f_usleep_usleep(mrb_state *mrb, mrb_value self) slp_tm = (ed_time - st_time) / 10; #else - gettimeofday( &ed_tm, NULL ); + gettimeofday(&ed_tm, NULL); - if ( st_tm.tv_usec > ed_tm.tv_usec ) { + if (st_tm.tv_usec > ed_tm.tv_usec) { slp_tm = 1000000 + ed_tm.tv_usec - st_tm.tv_usec; - } else { + } + else { slp_tm = ed_tm.tv_usec - st_tm.tv_usec; } #endif @@ -120,18 +109,20 @@ mrb_value mrb_f_usleep_usleep(mrb_state *mrb, mrb_value self) return mrb_fixnum_value(slp_tm); } -void mrb_mruby_sleep_gem_init(mrb_state *mrb) +void +mrb_mruby_sleep_gem_init(mrb_state *mrb) { struct RClass *sleep; sleep = mrb_define_module(mrb, "Sleep"); - mrb_define_class_method(mrb, sleep, "sleep", mrb_f_sleep_sleep, MRB_ARGS_REQ(1)); - mrb_define_class_method(mrb, sleep, "usleep", mrb_f_usleep_usleep, MRB_ARGS_REQ(1)); + mrb_define_class_method(mrb, sleep, "sleep", mrb_f_sleep, MRB_ARGS_REQ(1)); + mrb_define_class_method(mrb, sleep, "usleep", mrb_f_usleep, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, mrb->kernel_module, "sleep", mrb_f_sleep_sleep, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, mrb->kernel_module, "usleep", mrb_f_usleep_usleep, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, mrb->kernel_module, "sleep", mrb_f_sleep, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, mrb->kernel_module, "usleep", mrb_f_usleep, MRB_ARGS_REQ(1)); } -void mrb_mruby_sleep_gem_final(mrb_state *mrb) +void +mrb_mruby_sleep_gem_final(mrb_state *mrb) { } diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.h b/mrbgems/mruby-sleep/src/mrb_sleep.h deleted file mode 100644 index bf71d91f4..000000000 --- a/mrbgems/mruby-sleep/src/mrb_sleep.h +++ /dev/null @@ -1,12 +0,0 @@ -/* -// mrb_sleep.h - to provide sleep methods -// -// See Copyright Notice in mrb_sleep.c -*/ - -#ifndef MRB_SLEEP_H -#define MRB_SLEEP_H - -void mrb_mruby_sleep_gem_init(mrb_state *mrb); - -#endif -- cgit v1.2.3 From 72522f8e0ecd7a94af4df0cf7c892fb5ed971deb Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 6 Sep 2018 23:33:53 +0900 Subject: Remove `Sleep` module that does not exist in CRuby. --- mrbgems/mruby-sleep/src/mrb_sleep.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'mrbgems/mruby-sleep/src') diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c index 19a4f082f..37d18e482 100644 --- a/mrbgems/mruby-sleep/src/mrb_sleep.c +++ b/mrbgems/mruby-sleep/src/mrb_sleep.c @@ -1,5 +1,5 @@ /* -** mrb_sleep - sleep class for mruby +** mrb_sleep - sleep methods for mruby ** ** Copyright (c) mod_mruby developers 2012- ** @@ -112,12 +112,6 @@ mrb_f_usleep(mrb_state *mrb, mrb_value self) void mrb_mruby_sleep_gem_init(mrb_state *mrb) { - struct RClass *sleep; - - sleep = mrb_define_module(mrb, "Sleep"); - mrb_define_class_method(mrb, sleep, "sleep", mrb_f_sleep, MRB_ARGS_REQ(1)); - mrb_define_class_method(mrb, sleep, "usleep", mrb_f_usleep, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, mrb->kernel_module, "sleep", mrb_f_sleep, MRB_ARGS_REQ(1)); mrb_define_method(mrb, mrb->kernel_module, "usleep", mrb_f_usleep, MRB_ARGS_REQ(1)); } -- cgit v1.2.3 From fdaec907802c11867e977b30b2e1dddcb7a0ebcd Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 6 Sep 2018 23:42:05 +0900 Subject: Make `Kernel#sleep` to accept float as a duration time. But when `MRB_WITHOUT_FLOAT` is set, there's no way to sleep for sub seconds. So mruby specific `usleep` is provided. --- mrbgems/mruby-sleep/src/mrb_sleep.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'mrbgems/mruby-sleep/src') diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c index 37d18e482..ce643cf12 100644 --- a/mrbgems/mruby-sleep/src/mrb_sleep.c +++ b/mrbgems/mruby-sleep/src/mrb_sleep.c @@ -37,25 +37,38 @@ #include "mruby.h" +/* not implemented forever sleep (called without an argument)*/ static mrb_value mrb_f_sleep(mrb_state *mrb, mrb_value self) { - time_t beg, end; + time_t beg = time(0); + time_t end; +#ifndef MRB_WITHOUT_FLOAT + mrb_float sec; + + mrb_get_args(mrb, "f", &sec); + if (sec >= 0) { + usleep(sec * 1000000); + } + else { + mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); + } +#else mrb_int sec; - beg = time(0); - /* not implemented forever sleep (called without an argument)*/ mrb_get_args(mrb, "i", &sec); if (sec >= 0) { sleep(sec); } else { mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); } +#endif end = time(0) - beg; return mrb_fixnum_value(end); } +/* mruby special; needed for mruby without float numbers */ static mrb_value mrb_f_usleep(mrb_state *mrb, mrb_value self) { -- cgit v1.2.3 From 7ad53273a2c5346557a233d040ad233019c03277 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 1 Nov 2018 22:52:12 +0900 Subject: Silence Appveyor's VC compilation warnings. --- mrbgems/mruby-pack/src/pack.c | 2 +- mrbgems/mruby-sleep/src/mrb_sleep.c | 2 +- mrbgems/mruby-string-ext/src/string.c | 5 +++-- src/vm.c | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) (limited to 'mrbgems/mruby-sleep/src') diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c index f970d9339..796ba4d34 100644 --- a/mrbgems/mruby-pack/src/pack.c +++ b/mrbgems/mruby-pack/src/pack.c @@ -64,7 +64,7 @@ static int littleendian = 0; const static unsigned char base64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static signed char base64_dec_tab[128]; +static unsigned char base64_dec_tab[128]; static int diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c index ce643cf12..0428f29eb 100644 --- a/mrbgems/mruby-sleep/src/mrb_sleep.c +++ b/mrbgems/mruby-sleep/src/mrb_sleep.c @@ -29,7 +29,7 @@ #ifdef _WIN32 #include #define sleep(x) Sleep(x * 1000) - #define usleep(x) Sleep(((x)<1000) ? 1 : ((x)/1000)) + #define usleep(x) Sleep((DWORD)((x)<1000) ? 1 : ((x)/1000)) #else #include #include diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index 9fd84af7b..c0105fbd9 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -279,7 +279,7 @@ static struct tr_pattern* tr_parse_pattern(mrb_state *mrb, struct tr_pattern *ret, const mrb_value v_pattern, mrb_bool flag_reverse_enable) { const char *pattern = RSTRING_PTR(v_pattern); - int pattern_length = RSTRING_LEN(v_pattern); + mrb_int pattern_length = RSTRING_LEN(v_pattern); mrb_bool flag_reverse = FALSE; struct tr_pattern *pat1; int i = 0; @@ -438,7 +438,8 @@ str_tr(mrb_state *mrb, mrb_value str, mrb_value p1, mrb_value p2, mrb_bool squee mrb_raisef(mrb, E_ARGUMENT_ERROR, "character (%S) out of range", mrb_fixnum_value((mrb_int)c)); } - lastch = s[i] = c; + lastch = c; + s[i] = (char)c; } } } diff --git a/src/vm.c b/src/vm.c index 28b375c68..8157f6ca0 100644 --- a/src/vm.c +++ b/src/vm.c @@ -186,7 +186,7 @@ stack_extend_alloc(mrb_state *mrb, mrb_int room) if (off > size) size = off; #ifdef MRB_STACK_EXTEND_DOUBLING - if (room <= (size_t)size) + if ((size_t)room <= size) size *= 2; else size += room; -- cgit v1.2.3 From 1cd57006f37c9f86b85491ceacf6ab285bb85475 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Sat, 26 Jan 2019 18:37:53 +0900 Subject: Refine error message for time interval Time interval value can be zero, and float (in `Kernel#sleep`) --- mrbgems/mruby-sleep/src/mrb_sleep.c | 6 +++--- mrbgems/mruby-sleep/test/sleep_test.rb | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) (limited to 'mrbgems/mruby-sleep/src') diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c index 0428f29eb..3f8ef90cf 100644 --- a/mrbgems/mruby-sleep/src/mrb_sleep.c +++ b/mrbgems/mruby-sleep/src/mrb_sleep.c @@ -51,7 +51,7 @@ mrb_f_sleep(mrb_state *mrb, mrb_value self) usleep(sec * 1000000); } else { - mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must not be negative"); } #else mrb_int sec; @@ -60,7 +60,7 @@ mrb_f_sleep(mrb_state *mrb, mrb_value self) if (sec >= 0) { sleep(sec); } else { - mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must not be negative"); } #endif end = time(0) - beg; @@ -94,7 +94,7 @@ mrb_f_usleep(mrb_state *mrb, mrb_value self) if (usec >= 0) { usleep(usec); } else { - mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must not be negative integer"); } #ifdef _WIN32 diff --git a/mrbgems/mruby-sleep/test/sleep_test.rb b/mrbgems/mruby-sleep/test/sleep_test.rb index 06a6d73fa..f05b7a30b 100644 --- a/mrbgems/mruby-sleep/test/sleep_test.rb +++ b/mrbgems/mruby-sleep/test/sleep_test.rb @@ -1,13 +1,27 @@ assert("sleep works") do assert_nothing_raised { sleep(1) } + assert_nothing_raised { sleep(0) } end -assert("sleep would not accept negative value") do +assert("sleep would accept non-negative float value") do + skip unless Object.const_defined?(:Float) + assert_nothing_raised { sleep(0.01) } + assert_nothing_raised { sleep(0.0) } + assert_nothing_raised { sleep(-0.0) } +end + +assert("sleep would not accept negative integer value") do assert_raise(ArgumentError) { sleep(-1) } end +assert("sleep would not accept negative float value") do + skip unless Object.const_defined?(:Float) + assert_raise(ArgumentError) { sleep(-0.1) } +end + assert("usleep works") do assert_nothing_raised { usleep(100) } + assert_nothing_raised { usleep(0) } end assert("usleep would not accept negative value") do -- cgit v1.2.3