summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-06-26 07:40:38 +0900
committerGitHub <[email protected]>2019-06-26 07:40:38 +0900
commit45c99155d8f0e91e87682710d5bf0b0edb59a81d (patch)
treefb39afa5b72132be2296b54d8e7054a75aa8ff82 /mrbgems
parentf268ecaf0de6856c4fc477ff2291102b108851bf (diff)
parent82831c6acd116852e918094e940266152897056e (diff)
downloadmruby-45c99155d8f0e91e87682710d5bf0b0edb59a81d.tar.gz
mruby-45c99155d8f0e91e87682710d5bf0b0edb59a81d.zip
Merge pull request #4492 from dearblue/fix-complex-new
Fix complex new on 32 bits mode
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-complex/src/complex.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c
index 5371332cd..8a0569d68 100644
--- a/mrbgems/mruby-complex/src/complex.c
+++ b/mrbgems/mruby-complex/src/complex.c
@@ -15,18 +15,15 @@ struct mrb_complex {
#define complex_ptr(mrb, v) (struct mrb_complex*)mrb_istruct_ptr(v)
-static mrb_value
-complex_new(mrb_state *mrb, mrb_float real, mrb_float imaginary)
+static struct RBasic*
+complex_alloc(mrb_state *mrb, struct RClass *c, struct mrb_complex **p)
{
- struct RClass *c = mrb_class_get(mrb, "Complex");
- struct RIStruct *s = (struct RIStruct*)mrb_obj_alloc(mrb, MRB_TT_ISTRUCT, c);
- mrb_value comp = mrb_obj_value(s);
- struct mrb_complex *p = complex_ptr(mrb, comp);
- p->real = real;
- p->imaginary = imaginary;
- MRB_SET_FROZEN_FLAG(s);
+ struct RIStruct *s;
+
+ s = (struct RIStruct*)mrb_obj_alloc(mrb, MRB_TT_ISTRUCT, c);
+ *p = (struct mrb_complex*)s->inline_data;
- return comp;
+ return (struct RBasic*)s;
}
#else
@@ -35,17 +32,14 @@ complex_new(mrb_state *mrb, mrb_float real, mrb_float imaginary)
static const struct mrb_data_type mrb_complex_type = {"Complex", mrb_free};
-static mrb_value
-complex_new(mrb_state *mrb, mrb_float real, mrb_float imaginary)
+static struct RBasic*
+complex_alloc(mrb_state *mrb, struct RClass *c, struct mrb_complex **p)
{
- struct RClass *c = mrb_class_get(mrb, "Complex");
- struct mrb_complex *p;
+ struct RData *d;
- p = (struct mrb_complex*)mrb_malloc(mrb, sizeof(struct mrb_complex));
- p->real = real;
- p->imaginary = imaginary;
+ Data_Make_Struct(mrb, c, struct mrb_complex, &mrb_complex_type, *p, d);
- return mrb_obj_value(Data_Wrap_Struct(mrb, c, &mrb_complex_type, p));
+ return (struct RBasic*)d;
}
static struct mrb_complex*
@@ -62,6 +56,19 @@ complex_ptr(mrb_state *mrb, mrb_value v)
#endif
static mrb_value
+complex_new(mrb_state *mrb, mrb_float real, mrb_float imaginary)
+{
+ struct RClass *c = mrb_class_get(mrb, "Complex");
+ struct mrb_complex *p;
+ struct RBasic *comp = complex_alloc(mrb, c, &p);
+ p->real = real;
+ p->imaginary = imaginary;
+ MRB_SET_FROZEN_FLAG(comp);
+
+ return mrb_obj_value(comp);
+}
+
+static mrb_value
complex_real(mrb_state *mrb, mrb_value self)
{
struct mrb_complex *p = complex_ptr(mrb, self);