summaryrefslogtreecommitdiff
path: root/time.c
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-13 17:37:39 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-13 17:37:39 +0000
commit08c3e8edbd0ccb2b3c193545e0d735dbd9c3adca (patch)
tree6175b95aa2851343313dde1c020d151720448c7f /time.c
parent59f8d5d103948dc1628dc220677f0bf2ebe22493 (diff)
merge revision(s) 39766,39769: [Backport #8101]
* time.c (GetTimeval): check if already initialized instance. * time.c (GetNewTimeval): check if newly created instance. * time.c (time_init_0, time_init_1, time_init_copy, time_mload): must be newly created instance. [ruby-core:53436] [Bug #8099] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@40282 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r--time.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/time.c b/time.c
index 606cbdf17b..7a877186e2 100644
--- a/time.c
+++ b/time.c
@@ -1827,10 +1827,11 @@ struct time_object {
int tm_got;
};
-#define GetTimeval(obj, tobj) \
- TypedData_Get_Struct((obj), struct time_object, &time_data_type, (tobj))
+#define GetTimeval(obj, tobj) ((tobj) = get_timeval(obj))
+#define GetNewTimeval(obj, tobj) ((tobj) = get_new_timeval(obj))
#define IsTimeval(obj) rb_typeddata_is_kind_of((obj), &time_data_type)
+#define TIME_INIT_P(tobj) ((tobj)->gmt != -1)
#define TIME_UTC_P(tobj) ((tobj)->gmt == 1)
#define TIME_SET_UTC(tobj) ((tobj)->gmt = 1)
@@ -1893,12 +1894,35 @@ time_s_alloc(VALUE klass)
struct time_object *tobj;
obj = TypedData_Make_Struct(klass, struct time_object, &time_data_type, tobj);
+ tobj->gmt = -1;
tobj->tm_got=0;
tobj->timew = WINT2FIXWV(0);
return obj;
}
+static struct time_object *
+get_timeval(VALUE obj)
+{
+ struct time_object *tobj;
+ TypedData_Get_Struct(obj, struct time_object, &time_data_type, tobj);
+ if (!TIME_INIT_P(tobj)) {
+ rb_raise(rb_eTypeError, "uninitialized %"PRIsVALUE, CLASS_OF(obj));
+ }
+ return tobj;
+}
+
+static struct time_object *
+get_new_timeval(VALUE obj)
+{
+ struct time_object *tobj;
+ TypedData_Get_Struct(obj, struct time_object, &time_data_type, tobj);
+ if (TIME_INIT_P(tobj)) {
+ rb_raise(rb_eTypeError, "already initialized %"PRIsVALUE, CLASS_OF(obj));
+ }
+ return tobj;
+}
+
static void
time_modify(VALUE time)
{
@@ -1964,7 +1988,8 @@ time_init_0(VALUE time)
struct timespec ts;
time_modify(time);
- GetTimeval(time, tobj);
+ GetNewTimeval(time, tobj);
+ tobj->gmt = 0;
tobj->tm_got=0;
tobj->timew = WINT2FIXWV(0);
#ifdef HAVE_CLOCK_GETTIME
@@ -2207,7 +2232,8 @@ time_init_1(int argc, VALUE *argv, VALUE time)
validate_vtm(&vtm);
time_modify(time);
- GetTimeval(time, tobj);
+ GetNewTimeval(time, tobj);
+ tobj->gmt = 0;
tobj->tm_got=0;
tobj->timew = WINT2FIXWV(0);
@@ -2324,7 +2350,8 @@ time_new_timew(VALUE klass, wideval_t timew)
VALUE time = time_s_alloc(klass);
struct time_object *tobj;
- GetTimeval(time, tobj);
+ tobj = DATA_PTR(time); /* skip type check */
+ tobj->gmt = 0;
tobj->timew = timew;
return time;
@@ -3451,7 +3478,7 @@ time_init_copy(VALUE copy, VALUE time)
if (!OBJ_INIT_COPY(copy, time)) return copy;
GetTimeval(time, tobj);
- GetTimeval(copy, tcopy);
+ GetNewTimeval(copy, tcopy);
MEMCPY(tcopy, tobj, struct time_object, 1);
return copy;
@@ -4836,7 +4863,8 @@ end_submicro: ;
timew = timegmw(&vtm);
}
- GetTimeval(time, tobj);
+ GetNewTimeval(time, tobj);
+ tobj->gmt = 0;
tobj->tm_got = 0;
tobj->timew = timew;
if (gmt) {