redesign mruby/data.h API; use DATA_PTR() for raw data pointer, DATA_GET_PTR()...

redesign mruby/data.h API; use DATA_PTR() for raw data pointer, DATA_GET_PTR() to type safe retrieval (TypeError will be raised), DATA_CHECK_GET_PTR() to get nil if type mismatched
parent babc8d00
...@@ -39,7 +39,12 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void * ...@@ -39,7 +39,12 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *
#define DATA_TYPE(d) (RDATA(d)->type) #define DATA_TYPE(d) (RDATA(d)->type)
void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*); void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*); void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
void *mrb_data_check_and_get(mrb_state *mrb, mrb_value, const mrb_data_type*); #define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
#define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
/* obsolete functions and macros */
#define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
#define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type) #define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
#define mrb_check_datatype(mrb,val,type) mrb_data_check_and_get(mrb, val, type) #define mrb_check_datatype(mrb,val,type) mrb_data_check_and_get(mrb, val, type)
#define Data_Get_Struct(mrb,obj,type,sval) do {\ #define Data_Get_Struct(mrb,obj,type,sval) do {\
......
...@@ -30,9 +30,7 @@ static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self) ...@@ -30,9 +30,7 @@ static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self)
mrb_value context; mrb_value context;
context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN)); context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN));
t = (mt_state*)mrb_data_get_ptr(mrb, context, &mt_state_type); t = DATA_GET_PTR(mrb, context, &mt_state_type, mt_state);
if (!t)
mrb_raise(mrb, E_RUNTIME_ERROR, "mt_state get from mrb_iv_get failed");
return t; return t;
} }
...@@ -228,4 +226,3 @@ void mrb_mruby_random_gem_init(mrb_state *mrb) ...@@ -228,4 +226,3 @@ void mrb_mruby_random_gem_init(mrb_state *mrb)
void mrb_mruby_random_gem_final(mrb_state *mrb) void mrb_mruby_random_gem_final(mrb_state *mrb)
{ {
} }
...@@ -299,8 +299,8 @@ mrb_time_eq(mrb_state *mrb, mrb_value self) ...@@ -299,8 +299,8 @@ mrb_time_eq(mrb_state *mrb, mrb_value self)
mrb_bool eq_p; mrb_bool eq_p;
mrb_get_args(mrb, "o", &other); mrb_get_args(mrb, "o", &other);
tm1 = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
tm2 = (struct mrb_time*)mrb_data_get_ptr(mrb, other, &mrb_time_type); tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec; eq_p = tm1 && tm2 && tm1->sec == tm2->sec && tm1->usec == tm2->usec;
return mrb_bool_value(eq_p); return mrb_bool_value(eq_p);
...@@ -313,8 +313,8 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self) ...@@ -313,8 +313,8 @@ mrb_time_cmp(mrb_state *mrb, mrb_value self)
struct mrb_time *tm1, *tm2; struct mrb_time *tm1, *tm2;
mrb_get_args(mrb, "o", &other); mrb_get_args(mrb, "o", &other);
tm1 = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm1 = DATA_CHECK_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
tm2 = (struct mrb_time*)mrb_data_get_ptr(mrb, other, &mrb_time_type); tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
if (!tm1 || !tm2) return mrb_nil_value(); if (!tm1 || !tm2) return mrb_nil_value();
if (tm1->sec > tm2->sec) { if (tm1->sec > tm2->sec) {
return mrb_fixnum_value(1); return mrb_fixnum_value(1);
...@@ -339,8 +339,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self) ...@@ -339,8 +339,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self)
struct mrb_time *tm; struct mrb_time *tm;
mrb_get_args(mrb, "f", &f); mrb_get_args(mrb, "f", &f);
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, tm->usec, tm->timezone); return mrb_time_make(mrb, mrb_obj_class(mrb, self), (double)tm->sec+f, tm->usec, tm->timezone);
} }
...@@ -352,10 +351,9 @@ mrb_time_minus(mrb_state *mrb, mrb_value self) ...@@ -352,10 +351,9 @@ mrb_time_minus(mrb_state *mrb, mrb_value self)
struct mrb_time *tm, *tm2; struct mrb_time *tm, *tm2;
mrb_get_args(mrb, "o", &other); mrb_get_args(mrb, "o", &other);
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
tm2 = (struct mrb_time*)mrb_data_get_ptr(mrb, other, &mrb_time_type); tm2 = DATA_CHECK_GET_PTR(mrb, other, &mrb_time_type, struct mrb_time);
if (tm2) { if (tm2) {
f = (mrb_float)(tm->sec - tm2->sec) f = (mrb_float)(tm->sec - tm2->sec)
+ (mrb_float)(tm->usec - tm2->usec) / 1.0e6; + (mrb_float)(tm->usec - tm2->usec) / 1.0e6;
...@@ -374,8 +372,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self) ...@@ -374,8 +372,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_wday); return mrb_fixnum_value(tm->datetime.tm_wday);
} }
...@@ -386,8 +383,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self) ...@@ -386,8 +383,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_yday + 1); return mrb_fixnum_value(tm->datetime.tm_yday + 1);
} }
...@@ -398,8 +394,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self) ...@@ -398,8 +394,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_year + 1900); return mrb_fixnum_value(tm->datetime.tm_year + 1900);
} }
...@@ -410,8 +405,7 @@ mrb_time_zone(mrb_state *mrb, mrb_value self) ...@@ -410,8 +405,7 @@ mrb_time_zone(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value();
if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value();
return mrb_str_new_cstr(mrb, timezone_names[tm->timezone]); return mrb_str_new_cstr(mrb, timezone_names[tm->timezone]);
...@@ -427,8 +421,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self) ...@@ -427,8 +421,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self)
char buf[256]; char buf[256];
int len; int len;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
d = &tm->datetime; d = &tm->datetime;
len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d", len = snprintf(buf, sizeof(buf), "%s %s %02d %02d:%02d:%02d %s%d",
wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday, wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday,
...@@ -445,7 +438,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self) ...@@ -445,7 +438,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value(); if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_mday); return mrb_fixnum_value(tm->datetime.tm_mday);
} }
...@@ -454,12 +447,11 @@ mrb_time_day(mrb_state *mrb, mrb_value self) ...@@ -454,12 +447,11 @@ mrb_time_day(mrb_state *mrb, mrb_value self)
/* 15.2.19.7.7 */ /* 15.2.19.7.7 */
/* Returns true if daylight saving was applied for this time. */ /* Returns true if daylight saving was applied for this time. */
static mrb_value static mrb_value
mrb_time_dstp(mrb_state *mrb, mrb_value self) mrb_time_dst_p(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_bool_value(tm->datetime.tm_isdst); return mrb_bool_value(tm->datetime.tm_isdst);
} }
...@@ -471,8 +463,7 @@ mrb_time_getutc(mrb_state *mrb, mrb_value self) ...@@ -471,8 +463,7 @@ mrb_time_getutc(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm, *tm2; struct mrb_time *tm, *tm2;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return self;
tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm));
*tm2 = *tm; *tm2 = *tm;
tm2->timezone = MRB_TIMEZONE_UTC; tm2->timezone = MRB_TIMEZONE_UTC;
...@@ -487,8 +478,7 @@ mrb_time_getlocal(mrb_state *mrb, mrb_value self) ...@@ -487,8 +478,7 @@ mrb_time_getlocal(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm, *tm2; struct mrb_time *tm, *tm2;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return self;
tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm)); tm2 = (struct mrb_time *)mrb_malloc(mrb, sizeof(*tm));
*tm2 = *tm; *tm2 = *tm;
tm2->timezone = MRB_TIMEZONE_LOCAL; tm2->timezone = MRB_TIMEZONE_LOCAL;
...@@ -503,8 +493,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self) ...@@ -503,8 +493,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_hour); return mrb_fixnum_value(tm->datetime.tm_hour);
} }
...@@ -564,8 +553,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self) ...@@ -564,8 +553,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return self;
tm->timezone = MRB_TIMEZONE_LOCAL; tm->timezone = MRB_TIMEZONE_LOCAL;
mrb_time_update_datetime(tm); mrb_time_update_datetime(tm);
return self; return self;
...@@ -578,8 +566,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self) ...@@ -578,8 +566,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_mday); return mrb_fixnum_value(tm->datetime.tm_mday);
} }
...@@ -590,8 +577,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self) ...@@ -590,8 +577,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_min); return mrb_fixnum_value(tm->datetime.tm_min);
} }
...@@ -602,8 +588,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self) ...@@ -602,8 +588,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_mon + 1); return mrb_fixnum_value(tm->datetime.tm_mon + 1);
} }
...@@ -614,8 +599,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self) ...@@ -614,8 +599,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_sec); return mrb_fixnum_value(tm->datetime.tm_sec);
} }
...@@ -627,8 +611,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self) ...@@ -627,8 +611,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6); return mrb_float_value(mrb, (mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6);
} }
...@@ -639,8 +622,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self) ...@@ -639,8 +622,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->sec); return mrb_fixnum_value(tm->sec);
} }
...@@ -651,8 +633,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self) ...@@ -651,8 +633,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->usec); return mrb_fixnum_value(tm->usec);
} }
...@@ -663,27 +644,24 @@ mrb_time_utc(mrb_state *mrb, mrb_value self) ...@@ -663,27 +644,24 @@ mrb_time_utc(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
if (tm) {
tm->timezone = MRB_TIMEZONE_UTC; tm->timezone = MRB_TIMEZONE_UTC;
mrb_time_update_datetime(tm); mrb_time_update_datetime(tm);
}
return self; return self;
} }
/* 15.2.19.7.28 */ /* 15.2.19.7.28 */
/* Returns true if this time is in the UTC timezone false if not. */ /* Returns true if this time is in the UTC timezone false if not. */
static mrb_value static mrb_value
mrb_time_utcp(mrb_state *mrb, mrb_value self) mrb_time_utc_p(mrb_state *mrb, mrb_value self)
{ {
struct mrb_time *tm; struct mrb_time *tm;
tm = (struct mrb_time*)mrb_data_get_ptr(mrb, self, &mrb_time_type);
if (!tm) return mrb_nil_value(); tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time);
return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC); return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC);
} }
void void
mrb_mruby_time_gem_init(mrb_state* mrb) mrb_mruby_time_gem_init(mrb_state* mrb)
{ {
...@@ -709,11 +687,11 @@ mrb_mruby_time_gem_init(mrb_state* mrb) ...@@ -709,11 +687,11 @@ mrb_mruby_time_gem_init(mrb_state* mrb)
mrb_define_method(mrb, tc, "asctime", mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.4 */ mrb_define_method(mrb, tc, "asctime", mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.4 */
mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.5 */ mrb_define_method(mrb, tc, "ctime" , mrb_time_asctime, MRB_ARGS_NONE()); /* 15.2.19.7.5 */
mrb_define_method(mrb, tc, "day" , mrb_time_day , MRB_ARGS_NONE()); /* 15.2.19.7.6 */ mrb_define_method(mrb, tc, "day" , mrb_time_day , MRB_ARGS_NONE()); /* 15.2.19.7.6 */
mrb_define_method(mrb, tc, "dst?" , mrb_time_dstp , MRB_ARGS_NONE()); /* 15.2.19.7.7 */ mrb_define_method(mrb, tc, "dst?" , mrb_time_dst_p , MRB_ARGS_NONE()); /* 15.2.19.7.7 */
mrb_define_method(mrb, tc, "getgm" , mrb_time_getutc , MRB_ARGS_NONE()); /* 15.2.19.7.8 */ mrb_define_method(mrb, tc, "getgm" , mrb_time_getutc , MRB_ARGS_NONE()); /* 15.2.19.7.8 */
mrb_define_method(mrb, tc, "getlocal",mrb_time_getlocal,MRB_ARGS_NONE()); /* 15.2.19.7.9 */ mrb_define_method(mrb, tc, "getlocal",mrb_time_getlocal,MRB_ARGS_NONE()); /* 15.2.19.7.9 */
mrb_define_method(mrb, tc, "getutc" , mrb_time_getutc , MRB_ARGS_NONE()); /* 15.2.19.7.10 */ mrb_define_method(mrb, tc, "getutc" , mrb_time_getutc , MRB_ARGS_NONE()); /* 15.2.19.7.10 */
mrb_define_method(mrb, tc, "gmt?" , mrb_time_utcp , MRB_ARGS_NONE()); /* 15.2.19.7.11 */ mrb_define_method(mrb, tc, "gmt?" , mrb_time_utc_p , MRB_ARGS_NONE()); /* 15.2.19.7.11 */
mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , MRB_ARGS_NONE()); /* 15.2.19.7.13 */ mrb_define_method(mrb, tc, "gmtime" , mrb_time_utc , MRB_ARGS_NONE()); /* 15.2.19.7.13 */
mrb_define_method(mrb, tc, "hour" , mrb_time_hour, MRB_ARGS_NONE()); /* 15.2.19.7.15 */ mrb_define_method(mrb, tc, "hour" , mrb_time_hour, MRB_ARGS_NONE()); /* 15.2.19.7.15 */
mrb_define_method(mrb, tc, "localtime", mrb_time_localtime, MRB_ARGS_NONE()); /* 15.2.19.7.18 */ mrb_define_method(mrb, tc, "localtime", mrb_time_localtime, MRB_ARGS_NONE()); /* 15.2.19.7.18 */
...@@ -728,7 +706,7 @@ mrb_mruby_time_gem_init(mrb_state* mrb) ...@@ -728,7 +706,7 @@ mrb_mruby_time_gem_init(mrb_state* mrb)
mrb_define_method(mrb, tc, "to_f", mrb_time_to_f, MRB_ARGS_NONE()); /* 15.2.19.7.24 */ mrb_define_method(mrb, tc, "to_f", mrb_time_to_f, MRB_ARGS_NONE()); /* 15.2.19.7.24 */
mrb_define_method(mrb, tc, "usec", mrb_time_usec, MRB_ARGS_NONE()); /* 15.2.19.7.26 */ mrb_define_method(mrb, tc, "usec", mrb_time_usec, MRB_ARGS_NONE()); /* 15.2.19.7.26 */
mrb_define_method(mrb, tc, "utc" , mrb_time_utc, MRB_ARGS_NONE()); /* 15.2.19.7.27 */ mrb_define_method(mrb, tc, "utc" , mrb_time_utc, MRB_ARGS_NONE()); /* 15.2.19.7.27 */
mrb_define_method(mrb, tc, "utc?", mrb_time_utcp, MRB_ARGS_NONE()); /* 15.2.19.7.28 */ mrb_define_method(mrb, tc, "utc?", mrb_time_utc_p,MRB_ARGS_NONE()); /* 15.2.19.7.28 */
mrb_define_method(mrb, tc, "wday", mrb_time_wday, MRB_ARGS_NONE()); /* 15.2.19.7.30 */ mrb_define_method(mrb, tc, "wday", mrb_time_wday, MRB_ARGS_NONE()); /* 15.2.19.7.30 */
mrb_define_method(mrb, tc, "yday", mrb_time_yday, MRB_ARGS_NONE()); /* 15.2.19.7.31 */ mrb_define_method(mrb, tc, "yday", mrb_time_yday, MRB_ARGS_NONE()); /* 15.2.19.7.31 */
mrb_define_method(mrb, tc, "year", mrb_time_year, MRB_ARGS_NONE()); /* 15.2.19.7.32 */ mrb_define_method(mrb, tc, "year", mrb_time_year, MRB_ARGS_NONE()); /* 15.2.19.7.32 */
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "error.h" #include "error.h"
#include "mruby/numeric.h" #include "mruby/numeric.h"
#include "mruby/data.h" #include "mruby/data.h"
#include "mruby/class.h"
struct RData* struct RData*
mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type) mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
...@@ -35,18 +36,17 @@ mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) ...@@ -35,18 +36,17 @@ mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)", mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name)); mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name));
} }
} else {
} struct RClass *c = mrb_class(mrb, obj);
void * mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)",
mrb_data_check_and_get(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name));
{ }
mrb_data_check_type(mrb, obj, type); }
return DATA_PTR(obj);
} }
void * void *
mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
{ {
if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
return NULL; return NULL;
...@@ -57,6 +57,13 @@ mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) ...@@ -57,6 +57,13 @@ mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
return DATA_PTR(obj); return DATA_PTR(obj);
} }
void *
mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
{
mrb_data_check_type(mrb, obj, type);
return DATA_PTR(obj);
}
mrb_value mrb_value
mrb_lastline_get(mrb_state *mrb) mrb_lastline_get(mrb_state *mrb)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment