public JsonParser constructParser(int features, ObjectCodec codec, BytesToNameCanonicalizer rootByteSymbols, CharsToNameCanonicalizer rootCharSymbols) throws IOException, JsonParseException { JsonEncoding enc = detectEncoding(); // As per [JACKSON-259], may want to fully disable canonicalization: boolean canonicalize = JsonParser.Feature.CANONICALIZE_FIELD_NAMES.enabledIn(features); boolean intern = JsonParser.Feature.INTERN_FIELD_NAMES.enabledIn(features); if (enc == JsonEncoding.UTF8) { /* and without canonicalization, byte-based approach is not performance; just use std UTF-8 reader * (which is ok for larger input; not so hot for smaller; but this is not a common case) */ if (canonicalize) { BytesToNameCanonicalizer can = rootByteSymbols.makeChild(canonicalize, intern); return new Utf8StreamParser(_context, features, _in, codec, can, _inputBuffer, _inputPtr, _inputEnd, _bufferRecyclable); } } return new ReaderBasedParser(_context, features, constructReader(), codec, rootCharSymbols.makeChild(canonicalize, intern)); }
private final Name findName(int q1, int lastQuadBytes) throws JsonParseException { // Usually we'll find it from the canonical symbol table already Name name = _symbols.findName(q1); if (name != null) { return name; } // If not, more work. We'll need add stuff to buffer _quadBuffer[0] = q1; return addName(_quadBuffer, 1, lastQuadBytes); }
@Override public void close() throws IOException { super.close(); // Merge found symbols, if any: _symbols.release(); }
public Name addName(String symbolStr, int q1, int q2) { if (_intern) { symbolStr = InternCache.instance.intern(symbolStr); } int hash = (q2 == 0) ? calcHash(q1) : calcHash(q1, q2); Name symbol = constructName(hash, symbolStr, q1, q2); _addSymbol(hash, symbol); return symbol; }
private void _addSymbol(int hash, Name symbol) unshareMain(); rehash(); _mainHash[ix] = (hash << 8); if (_mainNamesShared) { unshareNames(); unshareCollision(); // also allocates if list was null expandCollision(); bucket = findBestBucket(); reportTooManyCollisions(MAX_COLL_CHAIN_LENGTH);
nukeSymbols(); return; expandCollision(); bucket = findBestBucket();
return BytesToNameCanonicalizer.getEmptyName(); Name name = _symbols.findName(quads, qlen); if (name == null) { name = addName(quads, qlen, currQuadBytes);
quads[qlen-1] = lastQuad; return _symbols.addName(baseName, quads, qlen);
/** * Factory method that should only be called from unit tests, where seed * value should remain the same. */ protected static BytesToNameCanonicalizer createRoot(int hashSeed) { return new BytesToNameCanonicalizer(DEFAULT_TABLE_SIZE, true, hashSeed); }
private void _addSymbol(int hash, Name symbol) unshareMain(); rehash(); _mainHash[ix] = (hash << 8); if (_mainNamesShared) { unshareNames(); unshareCollision(); // also allocates if list was null expandCollision(); bucket = findBestBucket(); reportTooManyCollisions(MAX_COLL_CHAIN_LENGTH);
public Name addName(String symbolStr, int[] quads, int qlen) { if (_intern) { symbolStr = InternCache.instance.intern(symbolStr); } int hash; if (qlen < 3) { hash = (qlen == 1) ? calcHash(quads[0]) : calcHash(quads[0], quads[1]); } else { hash = calcHash(quads, qlen); } Name symbol = constructName(hash, symbolStr, quads, qlen); _addSymbol(hash, symbol); return symbol; }
nukeSymbols(); return; expandCollision(); bucket = findBestBucket();
return BytesToNameCanonicalizer.getEmptyName(); Name name = _symbols.findName(quads, qlen); if (name == null) { name = addName(quads, qlen, currQuadBytes);
int hash = calcHash(firstQuad); int ix = (hash & _mainHashMask); int val = _mainHash[ix];
quads[qlen-1] = lastQuad; return _symbols.addName(baseName, quads, qlen);
/** * Factory method used to create actual symbol table instance to * use for parsing. * * @param intern Whether canonical symbol Strings should be interned * or not */ public BytesToNameCanonicalizer makeChild(boolean canonicalize, boolean intern) { return new BytesToNameCanonicalizer(this, intern, _hashSeed, _tableInfo.get()); }
private void _addSymbol(int hash, Name symbol) unshareMain(); rehash(); _mainHash[ix] = (hash << 8); if (_mainNamesShared) { unshareNames(); unshareCollision(); // also allocates if list was null expandCollision(); bucket = findBestBucket();