chiark / gitweb /
test/chimaera.sod: Introduce a macro for stack-allocating instances.
[sod] / test / chimaera.sod
index 63602d86a0fd45f55f0f48c24dd9aafd9904e956..ca775bc569985631b22c706229143305771521b4 100644 (file)
@@ -76,32 +76,32 @@ static void provoke_serpent(Serpent *s)
   s->_vt->serpent.bite(s);
 }
 
+#define SOD_DECL(cls_, var_)                                           \
+  struct cls_##__ilayout var_##__layout;                               \
+  cls_ *var_ = cls_##__class->cls.init(&var_##__layout)
+
 int main(void)
 {
   {
-    struct Lion__ilayout ll;
-    Lion *l = Lion__class->cls.init(&ll);
+    SOD_DECL(Lion, l);
     provoke_lion(l);
     tickle_animal(LION__CONV_NML(l));
   }
 
   {
-    struct Goat__ilayout gg;
-    Goat *g = Goat__class->cls.init(&gg);
+    SOD_DECL(Goat, g);
     provoke_goat(g);
     tickle_animal(GOAT__CONV_NML(g));
   }
 
   {
-    struct Serpent__ilayout ss;
-    Serpent *s = Serpent__class->cls.init(&ss);
+    SOD_DECL(Serpent, s);
     provoke_serpent(s);
     tickle_animal(SERPENT__CONV_NML(s));
   }
 
   {
-    struct Chimaera__ilayout cc;
-    Chimaera *c = Chimaera__class->cls.init(&cc);
+    SOD_DECL(Chimaera, c);
     provoke_lion(CHIMAERA__CONV_LION(c));
     provoke_goat(CHIMAERA__CONV_GOAT(c));
     provoke_serpent(CHIMAERA__CONV_SERPENT(c));