94#define OSEVM_ADDR_INPUT "/_i"
95#define OSEVM_ADDR_STACK "/_s"
96#define OSEVM_ADDR_ENV "/_e"
97#define OSEVM_ADDR_CONTROL "/_c"
98#define OSEVM_ADDR_DUMP "/_d"
99#define OSEVM_ADDR_STDLIB "/_l"
100#define OSEVM_ADDR_HOST "/_x"
101#define OSEVM_ADDR_CACHE "/_0"
102#define OSEVM_ADDR_FAULT "/_h"
112#define OSEVM_ADDR_PARAMS "/_p"
136#define OSEVM_DECL_NREGISTERS 6
137extern const char *
const
138osevm_decl_registers[OSEVM_DECL_NREGISTERS];
143 OSEVM_DECL_I = 1 << 0,
144 OSEVM_DECL_S = 1 << 1,
145 OSEVM_DECL_E = 1 << 2,
146 OSEVM_DECL_C = 1 << 3,
147 OSEVM_DECL_D = 1 << 4,
148 OSEVM_DECL_P = 1 << 5
176#define OSEVM_ADDR_assign "/@"
177#define OSEVM_ADDR_quote "/'"
178#define OSEVM_ADDR_funcall "/!"
179#define OSEVM_ADDR_lookup "/$"
180#define OSEVM_ADDR_copyRegisterToElem "/>"
181#define OSEVM_ADDR_appendElemToRegister "/<<"
182#define OSEVM_ADDR_replaceRegisterWithElem "/<"
183#define OSEVM_ADDR_moveElemToRegister "/-"
184#define OSEVM_ADDR_toType "/,"
185#define OSEVM_ADDR_toInt32 "/,/i"
186#define OSEVM_ADDR_toFloat "/,/f"
187#define OSEVM_ADDR_toString "/,/s"
188#define OSEVM_ADDR_toBlob "/,/b"
189#define OSEVM_ADDR_appendByte "/&"
197#define OSEVM_CACHE_SIZE 30
198#define OSEVM_CACHE_MSG_SIZE OSE_CONTEXT_MESSAGE_OVERHEAD \
199 + 4 + 4 + 32 + (OSEVM_CACHE_SIZE * 4)
200#define OSEVM_CACHE_OFFSET_0 OSE_BUNDLE_HEADER_LEN \
201 + OSE_CONTEXT_BUNDLE_OFFSET \
202 + OSE_BUNDLE_HEADER_LEN \
204#define OSEVM_CACHE_OFFSET_1 OSEVM_CACHE_OFFSET_0 + 4
205#define OSEVM_CACHE_OFFSET_2 OSEVM_CACHE_OFFSET_1 + 4
206#define OSEVM_CACHE_OFFSET_3 OSEVM_CACHE_OFFSET_2 + 4
207#define OSEVM_CACHE_OFFSET_4 OSEVM_CACHE_OFFSET_3 + 4
208#define OSEVM_CACHE_OFFSET_5 OSEVM_CACHE_OFFSET_4 + 4
209#define OSEVM_CACHE_OFFSET_6 OSEVM_CACHE_OFFSET_5 + 4
210#define OSEVM_CACHE_OFFSET_7 OSEVM_CACHE_OFFSET_6 + 4
211#define OSEVM_CACHE_OFFSET_8 OSEVM_CACHE_OFFSET_7 + 4
212#define OSEVM_CACHE_OFFSET_9 OSEVM_CACHE_OFFSET_8 + 4
213#define OSEVM_CACHE_OFFSET_10 OSEVM_CACHE_OFFSET_9 + 4
214#define OSEVM_CACHE_OFFSET_11 OSEVM_CACHE_OFFSET_10 + 4
215#define OSEVM_CACHE_OFFSET_12 OSEVM_CACHE_OFFSET_11 + 4
216#define OSEVM_CACHE_OFFSET_13 OSEVM_CACHE_OFFSET_12 + 4
217#define OSEVM_CACHE_OFFSET_14 OSEVM_CACHE_OFFSET_13 + 4
218#define OSEVM_CACHE_OFFSET_15 OSEVM_CACHE_OFFSET_14 + 4
219#define OSEVM_CACHE_OFFSET_16 OSEVM_CACHE_OFFSET_15 + 4
220#define OSEVM_CACHE_OFFSET_17 OSEVM_CACHE_OFFSET_16 + 4
221#define OSEVM_CACHE_OFFSET_18 OSEVM_CACHE_OFFSET_17 + 4
222#define OSEVM_CACHE_OFFSET_19 OSEVM_CACHE_OFFSET_18 + 4
223#define OSEVM_CACHE_OFFSET_20 OSEVM_CACHE_OFFSET_19 + 4
224#define OSEVM_CACHE_OFFSET_21 OSEVM_CACHE_OFFSET_20 + 4
225#define OSEVM_CACHE_OFFSET_22 OSEVM_CACHE_OFFSET_21 + 4
226#define OSEVM_CACHE_OFFSET_23 OSEVM_CACHE_OFFSET_22 + 4
227#define OSEVM_CACHE_OFFSET_24 OSEVM_CACHE_OFFSET_23 + 4
228#define OSEVM_CACHE_OFFSET_25 OSEVM_CACHE_OFFSET_24 + 4
229#define OSEVM_CACHE_OFFSET_26 OSEVM_CACHE_OFFSET_25 + 4
230#define OSEVM_CACHE_OFFSET_27 OSEVM_CACHE_OFFSET_26 + 4
231#define OSEVM_CACHE_OFFSET_28 OSEVM_CACHE_OFFSET_27 + 4
232#define OSEVM_CACHE_OFFSET_29 OSEVM_CACHE_OFFSET_28 + 4
233#define OSEVM_CACHE_OFFSET_30 OSEVM_CACHE_OFFSET_29 + 4
235#define OSEVM_CACHE_POINTER OSEVM_CACHE_OFFSET_0
236#define OSEVM_CACHE_FLAGS OSEVM_CACHE_OFFSET_1
237#define OSEVM_CACHE_OFFSET_INPUT OSEVM_CACHE_OFFSET_2
238#define OSEVM_CACHE_OFFSET_STACK OSEVM_CACHE_OFFSET_3
239#define OSEVM_CACHE_OFFSET_ENV OSEVM_CACHE_OFFSET_4
240#define OSEVM_CACHE_OFFSET_CONTROL OSEVM_CACHE_OFFSET_5
241#define OSEVM_CACHE_OFFSET_DUMP OSEVM_CACHE_OFFSET_6
242#define OSEVM_CACHE_OFFSET_FAULT OSEVM_CACHE_OFFSET_7
255#define OSE_CONF_VM_INPUT_SIZE
256#define OSE_CONF_VM_STACK_SIZE
257#define OSE_CONF_VM_ENV_SIZE
258#define OSE_CONF_VM_CONTROL_SIZE
259#define OSE_CONF_VM_DUMP_SIZE
260#undef OSE_CONF_VM_INPUT_SIZE
261#undef OSE_CONF_VM_STACK_SIZE
262#undef OSE_CONF_VM_ENV_SIZE
263#undef OSE_CONF_VM_CONTROL_SIZE
264#undef OSE_CONF_VM_DUMP_SIZE
275#define OSEVM_FAULT_SIZE 128
277#if defined(OSE_CONF_VM_INPUT_SIZE) \
278 && defined(OSE_CONF_VM_STACK_SIZE) \
279 && defined(OSE_CONF_VM_ENV_SIZE) \
280 && defined(OSE_CONF_VM_CONTROL_SIZE) \
281 && defined(OSE_CONF_VM_DUMP_SIZE)
282#define OSEVM_HAVE_SIZES
283static const int32_t OSEVM_INPUT_SIZE = OSE_CONF_VM_INPUT_SIZE;
284static const int32_t OSEVM_STACK_SIZE = OSE_CONF_VM_STACK_SIZE;
285static const int32_t OSEVM_ENV_SIZE = OSE_CONF_VM_ENV_SIZE;
286static const int32_t OSEVM_CONTROL_SIZE = OSE_CONF_VM_CONTROL_SIZE;
287static const int32_t OSEVM_DUMP_SIZE = OSE_CONF_VM_DUMP_SIZE;
290static const int32_t OSEVM_TOTAL_SIZE =
291 (OSEVM_CACHE_MSG_SIZE
299#elif !defined(OSE_CONF_VM_INPUT_SIZE) \
300 && !defined(OSE_CONF_VM_STACK_SIZE) \
301 && !defined(OSE_CONF_VM_ENV_SIZE) \
302 && !defined(OSE_CONF_VM_CONTROL_SIZE) \
303 && !defined(OSE_CONF_VM_DUMP_SIZE)
305#pragma message ( "Sizes were specified for some, but not all of the VM "\
306 "stacks. Sizes specified will be ignored during compilation, "\
307 "and must be passed to osevm_init() at runtime."\
312#ifdef OSEVM_HAVE_SIZES
318#define OSEVM_INPUT_CONTEXT_MESSAGE_OFFSET \
319 OSE_BUNDLE_HEADER_LEN + OSEVM_CACHE_MSG_SIZE
320#define OSEVM_INPUT_BUNDLE_OFFSET \
321 OSEVM_INPUT_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
323#define OSEVM_STACK_CONTEXT_MESSAGE_OFFSET \
324 OSEVM_INPUT_CONTEXT_MESSAGE_OFFSET \
325 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_INPUT_SIZE
326#define OSEVM_STACK_BUNDLE_OFFSET \
327 OSEVM_STACK_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
329#define OSEVM_ENV_CONTEXT_MESSAGE_OFFSET \
330 OSEVM_STACK_CONTEXT_MESSAGE_OFFSET \
331 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_STACK_SIZE
332#define OSEVM_ENV_BUNDLE_OFFSET \
333 OSEVM_ENV_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
335#define OSEVM_CONTROL_CONTEXT_MESSAGE_OFFSET \
336 OSEVM_ENV_CONTEXT_MESSAGE_OFFSET \
337 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_ENV_SIZE
338#define OSEVM_CONTROL_BUNDLE_OFFSET \
339 OSEVM_CONTROL_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
341#define OSEVM_DUMP_CONTEXT_MESSAGE_OFFSET \
342 OSEVM_CONTROL_CONTEXT_MESSAGE_OFFSET \
343 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_CONTROL_SIZE
344#define OSEVM_DUMP_BUNDLE_OFFSET \
345 OSEVM_DUMP_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
347#define OSEVM_FAULT_CONTEXT_MESSAGE_OFFSET \
348 OSEVM_DUMP_CONTEXT_MESSAGE_OFFSET \
349 + OSE_CONTEXT_MESSAGE_OVERHEAD + OSEVM_DUMP_SIZE
350#define OSEVM_FAULT_BUNDLE_OFFSET \
351 OSEVM_FAULT_CONTEXT_MESSAGE_OFFSET + OSE_CONTEXT_BUNDLE_OFFSET
362#define OSEVM_INPUT(osevm) \
363 ose_makeBundle(ose_getBundlePtr(osevm) \
364 + OSEVM_INPUT_BUNDLE_OFFSET)
368#define OSEVM_STACK(osevm) \
369 ose_makeBundle(ose_getBundlePtr(osevm) \
370 + OSEVM_STACK_BUNDLE_OFFSET)
374#define OSEVM_ENV(osevm) \
375 ose_makeBundle(ose_getBundlePtr(osevm) \
376 + OSEVM_ENV_BUNDLE_OFFSET)
380#define OSEVM_CONTROL(osevm) \
381 ose_makeBundle(ose_getBundlePtr(osevm) \
382 + OSEVM_CONTROL_BUNDLE_OFFSET)
386#define OSEVM_DUMP(osevm) \
387 ose_makeBundle(ose_getBundlePtr(osevm) \
388 + OSEVM_DUMP_BUNDLE_OFFSET)
392#define OSEVM_FAULT(osevm) \
393 ose_makeBundle(ose_getBundlePtr(osevm) \
394 + OSEVM_FAULT_BUNDLE_OFFSET)
417#define OSEVM_INPUT(osevm) \
418 ose_makeBundle(ose_getBundlePtr(osevm) \
419 + ose_readInt32(osevm, \
420 OSEVM_CACHE_OFFSET_INPUT))
421#define OSEVM_STACK(osevm) \
422 ose_makeBundle(ose_getBundlePtr(osevm) \
423 + ose_readInt32(osevm, \
424 OSEVM_CACHE_OFFSET_STACK))
425#define OSEVM_ENV(osevm) \
426 ose_makeBundle(ose_getBundlePtr(osevm) \
427 + ose_readInt32(osevm, \
428 OSEVM_CACHE_OFFSET_ENV))
429#define OSEVM_CONTROL(osevm) \
430 ose_makeBundle(ose_getBundlePtr(osevm) \
431 + ose_readInt32(osevm, \
432 OSEVM_CACHE_OFFSET_CONTROL))
433#define OSEVM_DUMP(osevm) \
434 ose_makeBundle(ose_getBundlePtr(osevm) \
435 + ose_readInt32(osevm, \
436 OSEVM_CACHE_OFFSET_DUMP))
437#define OSEVM_FAULT(osevm) \
438 ose_makeBundle(ose_getBundlePtr(osevm) \
439 + ose_readInt32(osevm, \
440 OSEVM_CACHE_OFFSET_FAULT))
473 int32_t control_size,
518#define OSEVM_GET_FLAGS(osevm) \
519 ose_readInt32(osevm, OSEVM_CACHE_FLAGS)
520#define OSEVM_SET_FLAGS(osevm, flags) \
521 ose_writeInt32(osevm, OSEVM_CACHE_FLAGS, flags)
523#define OSEVM_GET_CACHE_VALUE(osevm, idx) \
524 (ose_assert((idx) < OSEVM_CACHE_SIZE), \
525 ose_readInt32(osevm, OSEVM_CACHE_OFFSET_0 + (4 * (idx))))
526#define OSEVM_SET_CACHE_VALUE(osevm, idx, val) \
527 (ose_assert((idx) < OSEVM_CACHE_SIZE), \
528 ose_writeInt32(osevm, OSEVM_CACHE_OFFSET_0 + (4 * (idx)), val))
541void osevm_popInputToControl(
ose_bundle osevm);
578#define OSEVM_ASSIGN osevm_assignStackToEnv
584#define OSEVM_LOOKUP osevm_lookupInEnv_impl
590#define OSEVM_FUNCALL osevm_funcall
596#define OSEVM_QUOTE osevm_quote
601#ifndef OSEVM_COPYREGISTERTOELEM
602#define OSEVM_COPYREGISTERTOELEM osevm_copyRegisterToElem
604extern void OSEVM_COPYREGISTERTOELEM (
ose_bundle osevm);
607#ifndef OSEVM_APPENDELEMTOREGISTER
608#define OSEVM_APPENDELEMTOREGISTER osevm_appendElemToRegister
610extern void OSEVM_APPENDELEMTOREGISTER (
ose_bundle osevm);
613#ifndef OSEVM_REPLACEREGISTERWITHELEM
614#define OSEVM_REPLACEREGISTERWITHELEM osevm_replaceRegisterWithElem
616extern void OSEVM_REPLACEREGISTERWITHELEM (
ose_bundle osevm);
619#ifndef OSEVM_MOVEELEMTOREGISTER
620#define OSEVM_MOVEELEMTOREGISTER osevm_moveElemToRegister
622extern void OSEVM_MOVEELEMTOREGISTER (
ose_bundle osevm);
626#define OSEVM_TOTYPE osevm_toType
632#define OSEVM_TOINT32 osevm_toInt32
638#define OSEVM_TOFLOAT osevm_toFloat
643#ifndef OSEVM_TOSTRING
644#define OSEVM_TOSTRING osevm_toString
650#define OSEVM_TOBLOB osevm_toBlob
655#ifdef OSE_PROVIDE_TYPE_SYMBOL
656#ifndef OSEVM_TOSYMBOL
657#define OSEVM_TOSYMBOL osevm_toSymbol
663#ifdef OSE_PROVIDE_TYPE_DOUBLE
664#ifndef OSEVM_TODOUBLE
665#define OSEVM_TODOUBLE osevm_toDouble
671#ifdef OSE_PROVIDE_TYPE_INT8
673#define OSEVM_TOINT8 osevm_toInt8
679#ifdef OSE_PROVIDE_TYPE_UINT8
681#define OSEVM_TOUINT8 osevm_toUInt8
687#ifdef OSE_PROVIDE_TYPE_INT16
689#define OSEVM_TOINT16 osevm_toInt16
695#ifdef OSE_PROVIDE_TYPE_UINT16
696#ifndef OSEVM_TOUINT16
697#define OSEVM_TOUINT16 osevm_toUInt16
703#ifdef OSE_PROVIDE_TYPE_UINT32
704#ifndef OSEVM_TOUINT32
705#define OSEVM_TOUINT32 osevm_toUInt32
711#ifdef OSE_PROVIDE_TYPE_INT64
713#define OSEVM_TOINT64 osevm_toInt64
719#ifdef OSE_PROVIDE_TYPE_UINT64
720#ifndef OSEVM_TOUINT64
721#define OSEVM_TOUINT64 osevm_toUInt64
727#ifdef OSE_PROVIDE_TYPE_TIMETAG
728#ifndef OSEVM_TOTIMETAG
729#define OSEVM_TOTIMETAG osevm_toTimetag
731extern void OSEVM_TOTIMETAG (
ose_bundle osevm);
735#ifdef OSE_PROVIDE_TYPE_TRUE
737#define OSEVM_TOTRUE osevm_toTrue
743#ifdef OSE_PROVIDE_TYPE_FALSE
745#define OSEVM_TOFALSE osevm_toFalse
751#ifdef OSE_PROVIDE_TYPE_NIL
753#define OSEVM_TONIL osevm_toNil
759#ifdef OSE_PROVIDE_TYPE_INFINITUM
760#ifndef OSEVM_TOINFINITUM
761#define OSEVM_TOINFINITUM osevm_toInfinitum
763extern void OSEVM_TOINFINITUM (
ose_bundle osevm);
767#ifndef OSEVM_APPENDBYTE
768#define OSEVM_APPENDBYTE osevm_appendByte
770extern void OSEVM_APPENDBYTE (
ose_bundle osevm);
773#ifndef OSEVM_RESPONDTOSTRING
774#define OSEVM_RESPONDTOSTRING osevm_respondToString
776extern void OSEVM_RESPONDTOSTRING (
ose_bundle osevm);
779#ifndef OSEVM_PREINPUT
780#define OSEVM_PREINPUT osevm_preInput
785#ifndef OSEVM_POSTINPUT
786#define OSEVM_POSTINPUT osevm_postInput
788extern void OSEVM_POSTINPUT (
ose_bundle osevm);
791#ifndef OSEVM_POPINPUTTOCONTROL
792#define OSEVM_POPINPUTTOCONTROL osevm_popInputToControl
794extern void OSEVM_POPINPUTTOCONTROL (
ose_bundle osevm);
797#ifndef OSEVM_POSTCONTROL
798#define OSEVM_POSTCONTROL osevm_postControl
800extern void OSEVM_POSTCONTROL (
ose_bundle osevm);
803#define OSEVM_TYPE_ADDR_EVALTYPE_SUFFIX "/EVTY"
804#define OSEVM_EVALTYPE_ADDR \
805 OSE_TYPE_ADDR_PREFIX "%c" OSEVM_TYPE_ADDR_EVALTYPE_SUFFIX
806#define OSEVM_EVALTYPE_ADDR_LEN sizeof(OSEVM_EVALTYPE_ADDR)
807#ifndef OSEVM_EVALTYPE
809#define OSEVM_EVALTYPE osevm_evalType_hook
833 int32_t size,
const char *
const bundle);
838 int32_t size,
const char *
const bundle);
848 int32_t size,
const char *
const message);
858#ifdef OSE_CONF_PROBE_COUNTS
866extern uint32_t ose_vm_nsteps;
869#ifdef OSE_CONF_PROBE_STEPS
883#define OSEVM_PROBE_TRACE 1
884#define OSEVM_PROBE_SIZES 2
885void osevm_probeSteps_trace(
int flags);
886void osevm_probeSteps_reset(
void);
887void osevm_probeSteps_dump(FILE *fp);
890int osevm_probeSteps_rows(
void);
891const char *osevm_probeSteps_row(
int i, uint64_t *n, uint64_t *t);
893extern uint64_t (*osevm_probeSteps_clock)(void);
897uint64_t osevm_probeSteps_time(
void);
898void osevm_probeSteps_zone(
const char *
const name, uint64_t t);
915#ifdef OSEVM_HAVE_SIZES
933 int32_t control_size,
#define OSEVM_FAULT_SIZE
Usable bytes of the fault register.
Definition ose_vm.h:275
contains functions that structure an OSC bundle for use with other parts of this library
#define OSE_CONTEXT_MESSAGE_OVERHEAD
The overhead in bytes of a context message.
Definition ose_context.h:194
Status codes for context bundles.
ose_errno
Definition ose_errno.h:37
#define B(...)
Instantiate a top-level OSC bundle.
Definition ose_test_ctosc.h:339
contains basic utilities for reading, writing, and querying an OSC bundle
void osevm_run(ose_bundle bundle)
Run the VM.
Definition ose_vm.c:1779
int32_t osevm_inputMessage(ose_bundle osevm, int32_t size, const char *const message)
Copy a single OSC element into the input bundle of the VM.
Definition ose_vm.c:2059
int32_t osevm_inputMessages(ose_bundle osevm, int32_t size, const char *const bundle)
Copy the contents of an OSC bundle into the input bundle of the VM.
Definition ose_vm.c:1983
ose_bundle osevm_init(ose_bundle bundle)
Initialize the VM.
Definition ose_vm.c:469
void osevm_setFault(ose_bundle osevm, enum ose_errno e)
Record a fault in /_h.
Definition ose_vm.c:439
enum ose_errno osevm_getFault(ose_bundle osevm)
The fault this machine is in, or OSE_ERR_NONE.
Definition ose_vm.c:446
int32_t osevm_declaresAtOffset(ose_bundle B, int32_t offset)
Which registers the bundle ELEMENT at offset declares.
Definition ose_vm.c:366
void osevm_clearFault(ose_bundle osevm)
Declare the fault handled.
Definition ose_vm.c:456
int32_t osevm_computeSizeReqs(int n,...)
Compute the size requirements of the VM given a list of sizes of each of additional VM bundle to be c...
Definition ose_vm.c:2081
char osevm_step(ose_bundle osevm)
Step the VM.
Definition ose_vm.c:1618
int32_t osevm_declares(ose_bundle src)
Which registers src declares.
Definition ose_vm.c:341