11#include "jacs_internal.h"
22#include <limits.h>
33
4+ void * jacs_buffer_ptr (jacs_ctx_t * ctx , unsigned idx ) {
5+ if (idx == 0 )
6+ return ctx -> packet .data ;
7+ return ctx -> buffers + ctx -> buffers [idx - 1 ];
8+ }
9+
410// shift_val(10) = 1024
511// shift_val(0) = 1
612// shift_val(-10) = 1/1024
@@ -31,7 +37,7 @@ static double clamp_double(value_t v, double l, double h) {
3137#define SET_VAL (SZ , l , h ) \
3238 case JACS_NUMFMT_##SZ: \
3339 SZ = clamp_int(q, l, h); \
34- memcpy(pkt-> data + offset , &SZ, sizeof(SZ)); \
40+ memcpy(data, &SZ, sizeof(SZ)); \
3541 break
3642
3743#define SET_VAL_U (SZ , l , h ) \
@@ -40,24 +46,24 @@ static double clamp_double(value_t v, double l, double h) {
4046 SZ = q.val_int32; \
4147 else \
4248 SZ = clamp_double(q, l, h); \
43- memcpy(pkt-> data + offset , &SZ, sizeof(SZ)); \
49+ memcpy(data, &SZ, sizeof(SZ)); \
4450 break
4551
4652#define SET_VAL_R (SZ ) \
4753 case JACS_NUMFMT_##SZ: \
4854 SZ = jacs_value_to_double(q); \
49- memcpy(pkt-> data + offset , &SZ, sizeof(SZ)); \
55+ memcpy(data, &SZ, sizeof(SZ)); \
5056 break
5157
5258#define GET_VAL_INT (SZ ) \
5359 case JACS_NUMFMT_##SZ: \
54- memcpy(&SZ, pkt-> data + offset , sizeof(SZ)); \
60+ memcpy(&SZ, data, sizeof(SZ)); \
5561 I32 = SZ; \
5662 break;
5763
5864#define GET_VAL_UINT (SZ ) \
5965 case JACS_NUMFMT_##SZ: \
60- memcpy(&SZ, pkt-> data + offset , sizeof(SZ)); \
66+ memcpy(&SZ, data, sizeof(SZ)); \
6167 if (SZ <= INT_MAX) \
6268 I32 = SZ; \
6369 else { \
@@ -68,12 +74,12 @@ static double clamp_double(value_t v, double l, double h) {
6874
6975#define GET_VAL_DBL (SZ ) \
7076 case JACS_NUMFMT_##SZ: \
71- memcpy(&SZ, pkt-> data + offset , sizeof(SZ)); \
77+ memcpy(&SZ, data, sizeof(SZ)); \
7278 is_float = 1; \
7379 F64 = SZ; \
7480 break;
7581
76- value_t jacs_buffer_op (jacs_activation_t * frame , uint16_t offset , uint16_t fmt0 , uint16_t buffer ,
82+ value_t jacs_buffer_op (jacs_activation_t * frame , uint16_t fmt0 , uint16_t offset , uint16_t buffer ,
7783 value_t * setv ) {
7884 int is_float = 0 ;
7985
@@ -92,20 +98,28 @@ value_t jacs_buffer_op(jacs_activation_t *frame, uint16_t offset, uint16_t fmt0,
9298 unsigned shift = fmt0 >> 4 ;
9399 unsigned sz = 1 << (fmt & 0b11 );
94100
101+ //if (!setv)
102+ // DMESG("GET @%d fmt=%x buf=%d", offset, fmt0, buffer);
103+
95104 jacs_ctx_t * ctx = frame -> fiber -> ctx ;
96105 jd_packet_t * pkt = & ctx -> packet ;
97106
98- if ((fmt == 0b1000 || fmt == 0b1001 ) || shift > sz * 8 )
99- jacs_runtime_failure (ctx );
107+ if ((fmt == 0b1000 || fmt == 0b1001 ) || shift > sz * 8 ||
108+ buffer >= jacs_img_num_buffers (& ctx -> img ))
109+ return jacs_runtime_failure (ctx );
100110
101- if (offset + sz > pkt -> service_size ) {
111+ unsigned bufsz = buffer == 0 ? pkt -> service_size : jacs_img_get_buffer (& ctx -> img , buffer )-> size ;
112+
113+ if (offset + sz > bufsz ) {
102114 // DMESG("gv NAN at pc=%d sz=%d %x", frame->pc, pkt->service_size, pkt->service_command);
103115 if (setv )
104116 return jacs_runtime_failure (ctx );
105117 else
106118 return jacs_nan ;
107119 }
108120
121+ uint8_t * data = jacs_buffer_ptr (ctx , buffer ) + offset ;
122+
109123 if (setv ) {
110124 value_t q = * setv ;
111125 if (shift || !jacs_is_tagged_int (q )) {
0 commit comments