// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // This module provides implementations for the thread-local encoding and // decoding context traits in rustc::middle::cstore::tls. use rbml::opaque::Encoder as OpaqueEncoder; use rbml::opaque::Decoder as OpaqueDecoder; use rustc::middle::cstore::tls; use rustc::hir::def_id::DefId; use rustc::ty::subst::Substs; use rustc::ty::{self, TyCtxt}; use decoder::{self, Cmd}; use encoder; use tydecode::TyDecoder; use tyencode; impl<'a, 'tcx: 'a> tls::EncodingContext<'tcx> for encoder::EncodeContext<'a, 'tcx> { fn tcx<'s>(&'s self) -> TyCtxt<'s, 'tcx, 'tcx> { self.tcx } fn encode_ty(&self, encoder: &mut OpaqueEncoder, t: ty::Ty<'tcx>) { tyencode::enc_ty(encoder.cursor, &self.ty_str_ctxt(), t); } fn encode_substs(&self, encoder: &mut OpaqueEncoder, substs: &Substs<'tcx>) { tyencode::enc_substs(encoder.cursor, &self.ty_str_ctxt(), substs); } } pub struct DecodingContext<'a, 'tcx: 'a> { pub crate_metadata: Cmd<'a>, pub tcx: TyCtxt<'a, 'tcx, 'tcx>, } impl<'a, 'tcx: 'a> tls::DecodingContext<'tcx> for DecodingContext<'a, 'tcx> { fn tcx<'s>(&'s self) -> TyCtxt<'s, 'tcx, 'tcx> { self.tcx } fn decode_ty(&self, decoder: &mut OpaqueDecoder) -> ty::Ty<'tcx> { let def_id_convert = &mut |did| { decoder::translate_def_id(self.crate_metadata, did) }; let starting_position = decoder.position(); let mut ty_decoder = TyDecoder::new( self.crate_metadata.data.as_slice(), self.crate_metadata.cnum, starting_position, self.tcx, def_id_convert); let ty = ty_decoder.parse_ty(); let end_position = ty_decoder.position(); // We can just reuse the tydecode implementation for parsing types, but // we have to make sure to leave the rbml reader at the position just // after the type. decoder.advance(end_position - starting_position); ty } fn decode_substs(&self, decoder: &mut OpaqueDecoder) -> &'tcx Substs<'tcx> { let def_id_convert = &mut |did| { decoder::translate_def_id(self.crate_metadata, did) }; let starting_position = decoder.position(); let mut ty_decoder = TyDecoder::new( self.crate_metadata.data.as_slice(), self.crate_metadata.cnum, starting_position, self.tcx, def_id_convert); let substs = ty_decoder.parse_substs(); let end_position = ty_decoder.position(); decoder.advance(end_position - starting_position); substs } fn translate_def_id(&self, def_id: DefId) -> DefId { decoder::translate_def_id(self.crate_metadata, def_id) } }