+static void listTypeInsert(robj *subject, listTypeEntry *old_entry, robj *new_obj, int where) {
+ listTypeTryConversion(subject,new_obj);
+ if (subject->encoding == REDIS_ENCODING_ZIPLIST) {
+ if (where == REDIS_HEAD) {
+ unsigned char *next = ziplistNext(subject->ptr,old_entry->zi);
+ if (next == NULL) {
+ listTypePush(subject,new_obj,REDIS_TAIL);
+ } else {
+ subject->ptr = ziplistInsert(subject->ptr,next,new_obj->ptr,sdslen(new_obj->ptr));
+ }
+ } else {
+ subject->ptr = ziplistInsert(subject->ptr,old_entry->zi,new_obj->ptr,sdslen(new_obj->ptr));
+ }
+ } else if (subject->encoding == REDIS_ENCODING_LIST) {
+ if (where == REDIS_HEAD) {
+ listInsertNode(subject->ptr,old_entry->ln,new_obj,1);
+ } else {
+ listInsertNode(subject->ptr,old_entry->ln,new_obj,0);
+ }
+ incrRefCount(new_obj);
+ } else {
+ redisPanic("Unknown list encoding");
+ }
+}
+