Skip to content

Commit 2bb47ad

Browse files
committed
Prohibit instantiation of immediate objects
1 parent f7c0024 commit 2bb47ad

File tree

4 files changed

+13
-0
lines changed

4 files changed

+13
-0
lines changed

src/class.c

+3
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,9 @@ mrb_instance_alloc(mrb_state *mrb, mrb_value cv)
13481348
mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class");
13491349

13501350
if (ttype == 0) ttype = MRB_TT_OBJECT;
1351+
if (ttype <= MRB_TT_CPTR) {
1352+
mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %S", cv);
1353+
}
13511354
o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
13521355
return mrb_obj_value(o);
13531356
}

src/numeric.c

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <mruby/array.h>
1414
#include <mruby/numeric.h>
1515
#include <mruby/string.h>
16+
#include <mruby/class.h>
1617

1718
#ifdef MRB_USE_FLOAT
1819
#define trunc(f) truncf(f)
@@ -1265,6 +1266,7 @@ mrb_init_numeric(mrb_state *mrb)
12651266

12661267
/* Integer Class */
12671268
integer = mrb_define_class(mrb, "Integer", numeric); /* 15.2.8 */
1269+
MRB_SET_INSTANCE_TT(integer, MRB_TT_FIXNUM);
12681270
mrb_undef_class_method(mrb, integer, "new");
12691271
mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */
12701272
mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
@@ -1291,6 +1293,7 @@ mrb_init_numeric(mrb_state *mrb)
12911293

12921294
/* Float Class */
12931295
mrb->float_class = fl = mrb_define_class(mrb, "Float", numeric); /* 15.2.9 */
1296+
MRB_SET_INSTANCE_TT(fl, MRB_TT_FLOAT);
12941297
mrb_undef_class_method(mrb, fl, "new");
12951298
mrb_define_method(mrb, fl, "+", flo_plus, MRB_ARGS_REQ(1)); /* 15.2.9.3.1 */
12961299
mrb_define_method(mrb, fl, "-", flo_minus, MRB_ARGS_REQ(1)); /* 15.2.9.3.2 */

src/object.c

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <mruby/class.h>
99
#include <mruby/numeric.h>
1010
#include <mruby/string.h>
11+
#include <mruby/class.h>
1112

1213
MRB_API mrb_bool
1314
mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2)
@@ -265,6 +266,7 @@ mrb_init_object(mrb_state *mrb)
265266
struct RClass *f;
266267

267268
mrb->nil_class = n = mrb_define_class(mrb, "NilClass", mrb->object_class);
269+
MRB_SET_INSTANCE_TT(n, MRB_TT_TRUE);
268270
mrb_undef_class_method(mrb, n, "new");
269271
mrb_define_method(mrb, n, "&", false_and, MRB_ARGS_REQ(1)); /* 15.2.4.3.1 */
270272
mrb_define_method(mrb, n, "^", false_xor, MRB_ARGS_REQ(1)); /* 15.2.4.3.2 */
@@ -274,6 +276,7 @@ mrb_init_object(mrb_state *mrb)
274276
mrb_define_method(mrb, n, "inspect", nil_inspect, MRB_ARGS_NONE());
275277

276278
mrb->true_class = t = mrb_define_class(mrb, "TrueClass", mrb->object_class);
279+
MRB_SET_INSTANCE_TT(t, MRB_TT_TRUE);
277280
mrb_undef_class_method(mrb, t, "new");
278281
mrb_define_method(mrb, t, "&", true_and, MRB_ARGS_REQ(1)); /* 15.2.5.3.1 */
279282
mrb_define_method(mrb, t, "^", true_xor, MRB_ARGS_REQ(1)); /* 15.2.5.3.2 */
@@ -282,6 +285,7 @@ mrb_init_object(mrb_state *mrb)
282285
mrb_define_method(mrb, t, "inspect", true_to_s, MRB_ARGS_NONE());
283286

284287
mrb->false_class = f = mrb_define_class(mrb, "FalseClass", mrb->object_class);
288+
MRB_SET_INSTANCE_TT(f, MRB_TT_TRUE);
285289
mrb_undef_class_method(mrb, f, "new");
286290
mrb_define_method(mrb, f, "&", false_and, MRB_ARGS_REQ(1)); /* 15.2.6.3.1 */
287291
mrb_define_method(mrb, f, "^", false_xor, MRB_ARGS_REQ(1)); /* 15.2.6.3.2 */

src/symbol.c

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <mruby/khash.h>
1111
#include <mruby/string.h>
1212
#include <mruby/dump.h>
13+
#include <mruby/class.h>
1314

1415
/* ------------------------------------------------------ */
1516
typedef struct symbol_name {
@@ -481,6 +482,8 @@ mrb_init_symbol(mrb_state *mrb)
481482
struct RClass *sym;
482483

483484
mrb->symbol_class = sym = mrb_define_class(mrb, "Symbol", mrb->object_class); /* 15.2.11 */
485+
MRB_SET_INSTANCE_TT(sym, MRB_TT_SYMBOL);
486+
mrb_undef_class_method(mrb, sym, "new");
484487

485488
mrb_define_method(mrb, sym, "===", sym_equal, MRB_ARGS_REQ(1)); /* 15.2.11.3.1 */
486489
mrb_define_method(mrb, sym, "id2name", mrb_sym_to_s, MRB_ARGS_NONE()); /* 15.2.11.3.2 */

0 commit comments

Comments
 (0)