in src/com/amazon/ion/impl/lite/IonDatagramLite.java [995:1074]
void load_current_symbol_table(IonValueLite prev_user_value)
{
IonValueLite curr_value = __current_user_value;
int curr_index = __user_index;
IonValueLite prev_value = prev_user_value;
SymbolTable prev_symtab = __current_symbols;
int prev_index = __current_symbols_index;
// set our new position symbol table
__current_symbols = null;
__current_symbols_index = curr_index;
SymbolTable curr_symtab = null;
if (curr_value != null) {
curr_symtab = curr_value.getAssignedSymbolTable();
__current_symbols = curr_symtab;
}
// if we need to we reset the previous values here
// this happens when the caller is scanning backwards
if (curr_index - 1 != prev_index) {
prev_index = curr_index - 1;
prev_symtab = null;
if (prev_index >= 0 && prev_index < __iterator.get_datagram_child_count()) {
prev_value = __iterator.get_datagram_child(prev_index);
prev_symtab = prev_value.getAssignedSymbolTable();
}
}
// Now if there was a change push the local symbol
// tables onto our system value stack
// note that our chain of preceding symbol tables
// might match our list of previous structs in the
// user list. Until there's a difference we don't
// push the symbol tables (because they've already
// been processed as real values).
if (curr_symtab != prev_symtab) {
SymbolTable new_symbol_table = curr_symtab;
while (new_symbol_table != null)
{
final boolean new_symbol_table_is_system = new_symbol_table.isSystemTable();
IonValue rep;
if (new_symbol_table_is_system) {
rep = __iterator.get_datagram_ivm();
}
else {
IonSystem sys = __iterator.get_datagram_system();
rep = _Private_Utils.symtabTree(new_symbol_table);
}
assert(rep != null && __iterator.get_datagram_system() == rep.getSystem());
if (rep == prev_value || (is_ivm(curr_value) && new_symbol_table_is_system)) {
int prev_idx = (prev_value == null) ? -1 : (prev_value._elementid() - 1);
if (prev_idx >= 0) {
prev_value = __iterator.get_datagram_child(prev_idx);
}
else {
prev_value = null;
}
}
else {
push_system_value((IonValueLite)rep);
prev_value = null; // end of the matches
}
new_symbol_table = rep.getSymbolTable();
if (new_symbol_table == null || new_symbol_table.isSystemTable()) {
break;
}
}
}
// and at the front we need to put in the ion version marker
if (curr_index == 0 && !is_ivm(curr_value)) {
// TODO this is wrong, because we may have already pushed
// a rep above. This is just making up an additional symtab
// where one was not placed by the user.
IonValueLite ivm = __iterator.get_datagram_ivm();
push_system_value(ivm);
}
}