Jim's answer is correct.
So, what changed? JMP 13 or 14 added a return code to the <<save message.
dt = open("$sample_data/big class.jmp");
x = dt<<save("$desktop/big class.jmp");
show(x); // 1
The C++ developer decides to return a value (like 1 for <<save in JMP 14), or not, for each message. If no value is returned (like in JMP 12) then the OBJ is returned. I don't like that it works that way, because it makes it hard to fix the language later, as you've discovered. Adding a return code to tell if the save succeeded caused your JSL to fail because you depended on the default behavior that returned the data table object from <<save.
Anyone still reading: writing JSL that chains more than one method and checks for the result is also a potential problem. Don't use chaining, and don't depend on the default behavior to help future-proof your JSL:
dt = Open( "$sample_data/big class.jmp" );
// prefer to send messages one at a time. Three messages:
x = dt << getname;
Write( Eval Insert( "\!ngetname ^x^" ) ); // big class
x = dt << save( "$desktop/big class.jmp" );
Write( Eval Insert( "\!nsave ^x^" ) ); // 1
x = dt << end data update;
Write( Eval Insert( "\!nend data update ^x^ ^x<<getname^" ) ); // Scriptable[] (this is the default, dt is copied into x)
// don't do this, can you guess what x will be? same three messages...chained together
x = dt << getname << save( "$desktop/big class.jmp" ) << end data update;
Write( Eval Insert( "\!nWhat will the answer be? ^x^" ) );
(I don't have JMP before 14, but I think this will be correct...)
The answer to the chained question where << is used three times will depend on the version of JMP. The <<getname will set a answer in JMP 12 and 14. In 14, the <<save will overwrite the answer. The <<EndDataUpdate uses the default behavior, but that only applies if there is no other answer. Confused? Don't chain.
Craige