@@ -371,41 +371,78 @@ static void bind_pos_boxed(PARROT_INTERP, STable *st, void *data, INTVAL index,
371
371
}
372
372
373
373
static void push_boxed (PARROT_INTERP , STable * st , void * data , PMC * obj ) {
374
+ VMArrayBody * body = (VMArrayBody * ) data ;
374
375
VMArrayREPRData * repr_data = (VMArrayREPRData * ) st -> REPR_data ;
375
376
376
377
if (repr_data -> elem_size )
377
378
die_no_boxed (interp , "push" );
378
379
379
- /* TODO */
380
+ ensure_size (interp , body , repr_data , body -> elems + 1 );
381
+ set_pos_pmc ((PMC * * ) body -> slots , body -> start + body -> elems - 1 , obj );
380
382
}
381
383
382
384
static PMC * pop_boxed (PARROT_INTERP , STable * st , void * data ) {
385
+ VMArrayBody * body = (VMArrayBody * ) data ;
383
386
VMArrayREPRData * repr_data = (VMArrayREPRData * ) st -> REPR_data ;
384
387
385
388
if (repr_data -> elem_size )
386
389
die_no_boxed (interp , "pop" );
387
390
388
- /* TODO */
389
- return PMCNULL ;
391
+ if (body -> elems < 1 )
392
+ Parrot_ex_throw_from_c_args (interp , NULL , EXCEPTION_OUT_OF_BOUNDS ,
393
+ "VMArray: Can't pop from an empty array!" );
394
+
395
+ body -> elems -- ;
396
+ return get_pos_pmc ((PMC * * ) body -> slots , body -> start + body -> elems );
390
397
}
391
398
392
399
static void unshift_boxed (PARROT_INTERP , STable * st , void * data , PMC * obj ) {
400
+ VMArrayBody * body = (VMArrayBody * ) data ;
393
401
VMArrayREPRData * repr_data = (VMArrayREPRData * ) st -> REPR_data ;
394
402
395
403
if (repr_data -> elem_size )
396
404
die_no_boxed (interp , "unshift" );
397
405
398
- /* TODO */
406
+ /* If we don't have room at the beginning of the slots, make some room (8
407
+ * slots) for unshifting */
408
+ if (body -> start < 1 ) {
409
+ INTVAL n = 8 ;
410
+ INTVAL elems = body -> elems ;
411
+ INTVAL i ;
412
+
413
+ /* Grow the array */
414
+ ensure_size (interp , body , repr_data , elems + n );
415
+ /* Move elements and set start */
416
+ memmove (body -> slots + n , body -> slots , elems * sizeof (PMC * ));
417
+ body -> start = n ;
418
+ body -> elems = elems ;
419
+ /* Clear out beginning elements */
420
+ for (i = 0 ; i < n ; i ++ )
421
+ set_pos_pmc ((PMC * * ) body -> slots , i , PMCNULL );
422
+ }
423
+
424
+ /* Now do the unshift */
425
+ body -> start -- ;
426
+ set_pos_pmc ((PMC * * ) body -> slots , body -> start , obj );
427
+ body -> elems ++ ;
399
428
}
400
429
401
430
static PMC * shift_boxed (PARROT_INTERP , STable * st , void * data ) {
431
+ VMArrayBody * body = (VMArrayBody * ) data ;
402
432
VMArrayREPRData * repr_data = (VMArrayREPRData * ) st -> REPR_data ;
433
+ PMC * value ;
403
434
404
435
if (repr_data -> elem_size )
405
436
die_no_boxed (interp , "shift" );
406
437
407
- /* TODO */
408
- return PMCNULL ;
438
+ if (body -> elems < 1 )
439
+ Parrot_ex_throw_from_c_args (interp , NULL , EXCEPTION_OUT_OF_BOUNDS ,
440
+ "VMArray: Can't shift from an empty array!" );
441
+
442
+ value = get_pos_pmc ((PMC * * ) body -> slots , body -> start );
443
+ body -> start ++ ;
444
+ body -> elems -- ;
445
+ return value ;
409
446
}
410
447
411
448
/* Initializes the VMArray representation. */
0 commit comments