leb128.h revision 15c1975f5fa5ae646ae87b57394bfdae1090a236
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 161fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_LEB128_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_LEB128_H_ 191fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 20578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h" 211e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko#include "utils.h" 221fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 231fb8620309a4e94d11879aabc33364acfa733904Carl Shapironamespace art { 241fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 251fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// Reads an unsigned LEB128 value, updating the given pointer to point 261fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// just past the end of the read value. This function tolerates 271fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// non-zero high-order bits in the fifth encoded byte. 2896faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersstatic inline uint32_t DecodeUnsignedLeb128(const uint8_t** data) { 2996faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogers const uint8_t* ptr = *data; 301fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro int result = *(ptr++); 311ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers if (UNLIKELY(result > 0x7f)) { 321fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro int cur = *(ptr++); 331fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result = (result & 0x7f) | ((cur & 0x7f) << 7); 341fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (cur > 0x7f) { 351fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro cur = *(ptr++); 361fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result |= (cur & 0x7f) << 14; 371fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (cur > 0x7f) { 381fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro cur = *(ptr++); 391fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result |= (cur & 0x7f) << 21; 401fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (cur > 0x7f) { 411fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro // Note: We don't check to see if cur is out of range here, 421fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro // meaning we tolerate garbage in the four high-order bits. 431fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro cur = *(ptr++); 441fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result |= cur << 28; 451fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 461fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 471fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 481fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 491fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro *data = ptr; 50cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee return static_cast<uint32_t>(result); 511fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro} 521fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 53195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// Reads an unsigned LEB128 + 1 value. updating the given pointer to point 54195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// just past the end of the read value. This function tolerates 55195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// non-zero high-order bits in the fifth encoded byte. 56195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// It is possible for this function to return -1. 5796faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersstatic inline int32_t DecodeUnsignedLeb128P1(const uint8_t** data) { 58195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao return DecodeUnsignedLeb128(data) - 1; 59195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao} 60195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao 611fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// Reads a signed LEB128 value, updating the given pointer to point 621fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// just past the end of the read value. This function tolerates 631fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// non-zero high-order bits in the fifth encoded byte. 6496faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersstatic inline int32_t DecodeSignedLeb128(const uint8_t** data) { 6596faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogers const uint8_t* ptr = *data; 661fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro int32_t result = *(ptr++); 671fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (result <= 0x7f) { 681fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result = (result << 25) >> 25; 691fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } else { 701fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro int cur = *(ptr++); 711fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result = (result & 0x7f) | ((cur & 0x7f) << 7); 721fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (cur <= 0x7f) { 731fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result = (result << 18) >> 18; 741fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } else { 751fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro cur = *(ptr++); 761fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result |= (cur & 0x7f) << 14; 771fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (cur <= 0x7f) { 781fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result = (result << 11) >> 11; 791fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } else { 801fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro cur = *(ptr++); 811fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result |= (cur & 0x7f) << 21; 821fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro if (cur <= 0x7f) { 831fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result = (result << 4) >> 4; 841fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } else { 851fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro // Note: We don't check to see if cur is out of range here, 861fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro // meaning we tolerate garbage in the four high-order bits. 871fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro cur = *(ptr++); 881fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro result |= cur << 28; 891fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 901fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 911fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 921fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro } 931fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro *data = ptr; 941fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro return result; 951fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro} 961fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 97d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhao// Returns the number of bytes needed to encode the value in unsigned LEB128. 98d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhaostatic inline uint32_t UnsignedLeb128Size(uint32_t data) { 991e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko // bits_to_encode = (data != 0) ? 32 - CLZ(x) : 1 // 32 - CLZ(data | 1) 1001e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko // bytes = ceil(bits_to_encode / 7.0); // (6 + bits_to_encode) / 7 1011e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko uint32_t x = 6 + 32 - CLZ(data | 1); 1021e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko // Division by 7 is done by (x * 37) >> 8 where 37 = ceil(256 / 7). 1031e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko // This works for 0 <= x < 256 / (7 * 37 - 256), i.e. 0 <= x <= 85. 1041e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko return (x * 37) >> 8; 1051e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko} 1061e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko 1071e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko// Returns the number of bytes needed to encode the value in unsigned LEB128. 1081e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Markostatic inline uint32_t SignedLeb128Size(int32_t data) { 1091e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko // Like UnsignedLeb128Size(), but we need one bit beyond the highest bit that differs from sign. 1101e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko data = data ^ (data >> 31); 1111e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko uint32_t x = 1 /* we need to encode the sign bit */ + 6 + 32 - CLZ(data | 1); 1121e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko return (x * 37) >> 8; 113d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhao} 114d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhao 115a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromstatic inline uint8_t* EncodeUnsignedLeb128(uint8_t* dest, uint32_t value) { 116a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom uint8_t out = value & 0x7f; 117a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom value >>= 7; 118a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom while (value != 0) { 119a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom *dest++ = out | 0x80; 120a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom out = value & 0x7f; 121a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom value >>= 7; 122a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 123a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom *dest++ = out; 124a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return dest; 125a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom} 126a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 12715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckytemplate<typename Allocator> 12815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckystatic inline void EncodeUnsignedLeb128(std::vector<uint8_t, Allocator>* dest, uint32_t value) { 12915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky uint8_t out = value & 0x7f; 13015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky value >>= 7; 13115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky while (value != 0) { 13215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky dest->push_back(out | 0x80); 13315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky out = value & 0x7f; 13415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky value >>= 7; 13515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky } 13615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky dest->push_back(out); 13715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky} 13815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 139a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromstatic inline uint8_t* EncodeSignedLeb128(uint8_t* dest, int32_t value) { 140a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom uint32_t extra_bits = static_cast<uint32_t>(value ^ (value >> 31)) >> 6; 141a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom uint8_t out = value & 0x7f; 142a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom while (extra_bits != 0u) { 143a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom *dest++ = out | 0x80; 144a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom value >>= 7; 145a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom out = value & 0x7f; 146a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom extra_bits >>= 7; 147a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 148a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom *dest++ = out; 149a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom return dest; 150a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom} 151a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 15215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckytemplate<typename Allocator> 15315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckystatic inline void EncodeSignedLeb128(std::vector<uint8_t, Allocator>* dest, int32_t value) { 15415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky uint32_t extra_bits = static_cast<uint32_t>(value ^ (value >> 31)) >> 6; 15515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky uint8_t out = value & 0x7f; 15615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky while (extra_bits != 0u) { 15715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky dest->push_back(out | 0x80); 15815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky value >>= 7; 15915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky out = value & 0x7f; 16015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky extra_bits >>= 7; 16115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky } 16215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky dest->push_back(out); 16315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky} 16415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 165e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban// An encoder that pushed uint32_t data onto the given std::vector. 166e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Roubanclass Leb128Encoder { 167a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public: 168e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban explicit Leb128Encoder(std::vector<uint8_t>* data) : data_(data) { 169e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban DCHECK(data != nullptr); 170a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 171a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 172a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom void Reserve(uint32_t size) { 173e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban data_->reserve(size); 174a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 175a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 176a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom void PushBackUnsigned(uint32_t value) { 17715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky EncodeUnsignedLeb128(data_, value); 178a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 179a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 180a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom template<typename It> 181a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom void InsertBackUnsigned(It cur, It end) { 182a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom for (; cur != end; ++cur) { 183a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom PushBackUnsigned(*cur); 184a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 185a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 186a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 187a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom void PushBackSigned(int32_t value) { 18815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky EncodeSignedLeb128(data_, value); 189a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 190a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 191a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom template<typename It> 192a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom void InsertBackSigned(It cur, It end) { 193a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom for (; cur != end; ++cur) { 194a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom PushBackSigned(*cur); 195a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 196a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 197a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 198a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom const std::vector<uint8_t>& GetData() const { 199e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban return *data_; 200a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom } 201a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 202e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban protected: 203e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban std::vector<uint8_t>* const data_; 204e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban 205a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private: 206e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban DISALLOW_COPY_AND_ASSIGN(Leb128Encoder); 207e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban}; 208e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban 209e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban// An encoder with an API similar to vector<uint32_t> where the data is captured in ULEB128 format. 210e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Roubanclass Leb128EncodingVector FINAL : private std::vector<uint8_t>, public Leb128Encoder { 211e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban public: 212e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban Leb128EncodingVector() : Leb128Encoder(this) { 213e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban } 214a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 215e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban private: 216a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom DISALLOW_COPY_AND_ASSIGN(Leb128EncodingVector); 217a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}; 218a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 2191fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro} // namespace art 2201fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro 221fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_LEB128_H_ 222