private IRubyObject ensureParsedAndDecoded(ThreadContext ctx, String ivname) { ErrorCollector collector = new ErrorCollector(); try { if (!template.isParsed()) { ParseStrategy s = template.accept(ctx, CodecStrategyVisitor.INSTANCE); parse(ctx, this, template, s, collector); collector.clear(); } RubyAsn1Template v = (RubyAsn1Template) getInstanceVariable(ivname); if (v == null) return ctx.getRuntime().getNil(); Asn1Template valueTemplate = v.getTemplate(); if (!(valueTemplate.isParsed() && valueTemplate.isDecoded())) { ParseStrategy s = valueTemplate.accept(ctx, CodecStrategyVisitor.INSTANCE); if (!valueTemplate.isParsed()) { parse(ctx, v, valueTemplate, s, collector); collector.clear(); } if (!valueTemplate.isDecoded()) { decode(ctx, v, valueTemplate, s, collector); } } return valueTemplate.getValue(); } catch (RuntimeException ex) { throw templateError(ctx, collector.getErrorMessages(), template.getDefinition()); } }
@JRubyMethod(name = {"_set_callback"}) public IRubyObject set_callback(ThreadContext ctx, IRubyObject ivname, IRubyObject value) { String name = ivname.asJavaString().substring(1); RubyAsn1Template container = (RubyAsn1Template) getInstanceVariable(name); if (container == null) { Asn1Template t = new Asn1Template(null, null, null); t.setParsed(true); t.setDecoded(true); container = new RubyAsn1Template(ctx.getRuntime(), cTemplateValue, t); setInstanceVariable(name, container); } container.getTemplate().setValue(value); template.setModified(true); return value; }