def to_rain(self, val):
if isinstance(val, (list, tuple)):
table_box = T.cbox.to_rain(None)
self.rain_set_table(table_box)
meta_ptr = self.get_global('core.types.array.module', T.carg)
self.rain_set_env(table_box, meta_ptr)
for i, n in enumerate(val):
self.rain_put_py(table_box, i, self.to_rain(n))
return table_box
elif isinstance(val, A.node):
table_box = T.cbox.to_rain(None)
self.rain_set_table(table_box)
ast_ptr = self.get_global('core.ast.module', T.carg)
meta_ptr = self.rain_get_ptr_py(ast_ptr, val.__tag__)
if not ct.cast(meta_ptr, ct.c_void_p).value:
Q.abort('Unable to look up core.ast.{}'.format(val.__tag__))
self.rain_set_env(table_box, meta_ptr)
slots = [self.to_rain(getattr(val, key, None)) for key in val.__slots__]
for key, box in zip(val.__slots__, slots):
self.rain_put_py(table_box, key, box)
return table_box
elif isinstance(val, K.value_token):
return T.cbox.to_rain(val.value)
return T.cbox.to_rain(val)
评论列表
文章目录