private static object ConstructRubyStruct(RubyConstructor /*!*/ ctor, string /*!*/ structName, Node /*!*/ node) { MappingNode mapping = node as MappingNode; if (mapping == null) { throw new ConstructorException("can only construct struct from mapping node"); } if (structName.Length == 0) { // TODO: throw new NotSupportedException("anonymous structs not supported"); } RubyContext context = ctor.GlobalScope.Context; RubyModule module; // TODO: MRI calls "members" on an arbitrary object // MRI checks Struct first, then falls back to Object if (!context.TryGetModule(ctor.GlobalScope, "Struct::" + structName, out module) && !context.TryGetModule(ctor.GlobalScope, structName, out module)) { throw RubyExceptions.CreateTypeError("Undefined struct `{0}'", structName); } RubyClass cls = module as RubyClass; if (cls == null) { throw RubyExceptions.CreateTypeError("`{0}' is not a class", structName); } RubyStruct newStruct = RubyStruct.Create(cls); foreach (var pair in ctor.ConstructMapping(mapping)) { var attributeName = pair.Key as MutableString; int index; // TODO: encoding if (attributeName != null && newStruct.TryGetIndex(attributeName.ToString(), out index)) { newStruct[index] = pair.Value; } } return(newStruct); }