(DEFUN RECEIVE-OBJECT (STREAM &AUX TEMP1 TEMP2 INDEX) (SETQ TEMP1 (SEND STREAM :TYI)) (COND ((= TEMP1 (OPCODE OBJECT-ASSIGN-INDEX)) (SETQ INDEX (RECEIVEI STREAM)) (SETQ TEMP1 (SEND STREAM :TYI)))) (COND ((= TEMP1 (OPCODE OBJECT-OF-INDEX)) (AREF *OBJ-ARRAY* (RECEIVEI STREAM))) ((= TEMP1 (OPCODE OBJECT-NIL)) NIL) ((= TEMP1 (OPCODE OBJECT-T)) T) ((= TEMP1 (OPCODE POSITIVE-INTEGER)) (RECEIVEI STREAM)) ((= TEMP1 (OPCODE NEGATIVE-INTEGER)) (- (RECEIVEI STREAM))) ((= TEMP1 (OPCODE SYMBOL)) (SETQ TEMP1 (INTERN (RECEIVE-OBJECT STREAM) (RECEIVE-OBJECT STREAM))) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP1)) TEMP1) ((= TEMP1 (OPCODE SIMPLE-STRING)) (SETQ TEMP1 (RECEIVEI STREAM)) (SETQ TEMP2 (MAKE-ARRAY TEMP1 :TYPE (QUOTE ART-STRING))) (SEND STREAM :STRING-IN NIL TEMP2 0 TEMP1) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP2)) TEMP2) ((= TEMP1 (OPCODE SIMPLE-ARRAY-ART-8B)) (SETQ TEMP1 (RECEIVEI STREAM)) (SETQ TEMP2 (MAKE-ARRAY TEMP1 :TYPE (QUOTE ART-8B))) (SEND STREAM :STRING-IN NIL TEMP2 0 TEMP1) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP2)) TEMP2) ((= TEMP1 (OPCODE SIMPLE-NAMED-STRUCTURE)) (SETQ TEMP1 (RECEIVEI STREAM)) (SETQ TEMP2 (RECEIVE-OBJECT STREAM)) (SETQ TEMP2 (MAKE-ARRAY TEMP1 :NAMED-STRUCTURE-SYMBOL TEMP2 :TYPE (QUOTE ART-Q))) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP2)) (RECEIVE-OBJECT STREAM) (DO ((J 1 (1+ J))) ((= J TEMP1)) (SETF (AREF TEMP2 J) (RECEIVE-OBJECT STREAM))) TEMP2) ((= TEMP1 (OPCODE SIMPLE-ARRAY-ART-Q)) (SETQ TEMP1 (RECEIVEI STREAM)) (SETQ TEMP2 (MAKE-ARRAY TEMP1)) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP2)) (DOTIMES (J TEMP1) (SETF (AREF TEMP2 J) (RECEIVE-OBJECT STREAM))) TEMP2) ((= TEMP1 (OPCODE SIMPLE-CHARACTER)) (CODE-CHAR (SEND STREAM :TYI))) ((= TEMP1 (OPCODE HAIRY-CHARACTER)) (CODE-CHAR (SEND STREAM :TYI) (SEND STREAM :TYI) (SEND STREAM :TYI))) ((= TEMP1 (OPCODE LIST)) (SETQ TEMP1 (RECEIVEI STREAM)) (SETQ TEMP2 (MAKE-LIST TEMP1)) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP2)) (DO ((TEMP1 TEMP2 (CDR TEMP1))) ((NULL TEMP1)) (RPLACA TEMP1 (RECEIVE-OBJECT STREAM))) TEMP2) ((= TEMP1 (OPCODE LIST*)) (SETQ TEMP1 (RECEIVEI STREAM)) (SETQ TEMP2 (MAKE-LIST* TEMP1)) (IF INDEX (SET-OBJ-ARRAY INDEX TEMP2)) (DO ((TEMP1 TEMP2 (CDR TEMP1))) (NIL) (RPLACA TEMP1 (RECEIVE-OBJECT STREAM)) (IF (NULL (CDR TEMP1)) (RETURN (RPLACD TEMP1 (RECEIVE-OBJECT STREAM))))) TEMP2) (T (CERROR "return NIL" "unknown object opcode received: ~D" TEMP1) NIL)))