protected void doReflect() { // ensure master type is reflected Type master = m_base; master.finish(); List masterSlots = master.slots(); // allocate slot data structures m_fields = new List(Sys.FieldType, master.fields().sz()); m_methods = new List(Sys.MethodType, master.methods().sz()); m_slots = new List(Sys.SlotType, masterSlots.sz()); m_slotsByName = new Hashtable(masterSlots.sz() * 3); // parameterize master's slots for (int i = 0; i < masterSlots.sz(); i++) { Slot slot = (Slot)masterSlots.get(i); if (slot is Method) { slot = parameterize((Method)slot); m_methods.add(slot); } else { slot = parameterize((Field)slot); m_fields.add(slot); } m_slots.add(slot); m_slotsByName[slot.m_name] = slot; } }
/// <summary> /// simple := type "(" str ")" /// </summary> private object readSimple(int line, Type t) { // parse: type(str) consume(Token.LPAREN, "Expected ( in simple"); string str = consumeStr("Expected string literal for simple"); consume(Token.RPAREN, "Expected ) in simple"); // lookup the fromStr method t.finish(); Method m = t.method("fromStr", false); if (m == null) throw err("Missing method: " + t.qname() + ".fromStr", line); // invoke parse method to translate into instance try { return m.invoke(null, new object[] { str }); } catch (ParseErr.Val e) { throw ParseErr.make(e.err().msg() + " [Line " + line + "]").val; } catch (System.Exception e) { throw ParseErr.make(e.ToString() + " [Line " + line + "]", e).val; } }