module: dfmc-modeling author: jonathan bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// /// PRIMITIVES /// define class () end class; define method dood-make-binding-value-proxy (dood :: , object :: <&primitive>) => (proxy) make(, binding: model-variable-binding(object)) end method; define method dood-make-binding-value-proxy (dood :: , object :: <&raw-type>) => (proxy) make(, binding: model-variable-binding(object)) end method; define method dood-restore-proxy (dood :: , proxy :: ) => (object) with-dood-context (dood-root(dood)) without-dependency-tracking let defn = binding-definition(dood-proxy-binding(proxy)); let object = binding-model-object(dood-proxy-binding(proxy)); if (instance?(object, )) break("CIRCULARITY %=", proxy); end if; object end without-dependency-tracking; end with-dood-context; end method; define method dood-disk-object (dood :: , object :: <&primitive>) => (proxy :: type-union(, <&primitive>)) // real primitive versus (ffi function) if (model-has-definition?(object)) dood-as-proxy(dood, object, dood-make-binding-value-proxy) else object end if end method; define method dood-disk-object (dood :: , object :: <&raw-type>) => (proxy :: type-union(, <&raw-type>)) dood-as-proxy(dood, object, dood-make-binding-value-proxy) end method; define method dood-disk-object (dood :: , object :: <&raw-object>) => (res :: <&raw-object>) object end method; // Reminder: here are the recognised adjectives ... // // side-effecting, side-effect-free, // stateless, stateful, // dynamic-extent, indefinite-extent // indefinite-extent if the primitive may embed one of the arguments // in another object or an argument is returned by the primitive, // and the argument may be heap allocated. // // We don't use defaults for these as previously this was error-prone. /* !@#$ needed? */ define method make-compile-time-literal (object :: ) make(<&primitive>, value: object) end method; define sideways method compile-stage (object) => (object) object end; define sideways method run-stage (object) => (object) object end; define method compile-stage (object :: <&primitive>) => (object) object.primitive-value end; /// SUPPORT define side-effecting stateful dynamic-extent &primitive primitive-break () => (); define side-effecting stateful dynamic-extent &primitive primitive-invoke-debugger (format-string :: , arguments :: ) => (); define side-effecting stateless dynamic-extent &primitive primitive-inside-debugger? () => (debugging? :: ); define side-effecting stateless dynamic-extent &primitive primitive-debug-message (format-string :: , arguments :: ) => (); /// MACHINE define side-effect-free stateless dynamic-extent &primitive-and-override primitive-word-size () => (word-size :: ) make-raw-literal(word-size()) end; define side-effect-free stateless dynamic-extent &primitive primitive-header-size () => (header-size :: ); /// RAW-TYPE /// ALLOCATION define side-effect-free stateful indefinite-extent &primitive primitive-allocate (number-words :: ) => (pointer :: ); define side-effect-free stateful indefinite-extent &primitive primitive-byte-allocate (number-words :: , number-bytes :: ) => (pointer :: ); define side-effect-free stateful indefinite-extent &primitive primitive-untraced-allocate (number-bytes :: ) => (pointer :: ); define side-effect-free stateful indefinite-extent &primitive primitive-manual-allocate (number-bytes :: ) => (pointer :: ); define side-effecting indefinite-extent &primitive primitive-manual-free (pointer :: ) => (); define side-effect-free stateful indefinite-extent &primitive primitive-allocate-wrapper (number-words :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: ) => (object :: ); define side-effect-free stateful indefinite-extent &primitive primitive-byte-allocate-filled-terminated (number-words :: , number-bytes :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: ) => (object :: ); define side-effect-free stateful indefinite-extent &primitive primitive-byte-allocate-leaf-filled-terminated (number-words :: , number-bytes :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: ) => (object :: ); define macro repeated-allocator-primitive-definer { define repeated-allocator-primitive (?:name, ?type:name) } => { define side-effect-free stateful indefinite-extent &primitive "primitive-" ## ?name ## "-allocate-filled" (number-words :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: , repeated-fill-value :: ?type) => (object :: ) } end macro; define repeated-allocator-primitive(object, ); define repeated-allocator-primitive(byte, ); define repeated-allocator-primitive(double-byte, ); define repeated-allocator-primitive(word, ); define repeated-allocator-primitive(double-word, ); define repeated-allocator-primitive(single-float, ); define repeated-allocator-primitive(double-float, ); define side-effect-free stateful indefinite-extent &primitive primitive-byte-allocate-leaf-filled (number-words :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: , repeated-fill-value :: ) => (object :: ); define side-effect-free stateful indefinite-extent &primitive primitive-allocate-in-awl-pool (number-words :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: , assoc-link :: ) => (object :: ); define side-effect-free stateful indefinite-extent &primitive primitive-allocate-weak-in-awl-pool (number-words :: , class-wrapper :: , number-slots :: , fill-value :: , repeated-size :: , repeated-size-offset :: , assoc-link :: ) => (object :: ); /// Breakpoints on class allocation define side-effecting &primitive primitive-set-class-breakpoint (dylan-class :: , count :: ) => (); define side-effecting &primitive primitive-clear-class-breakpoint (dylan-class :: ) => (); define side-effecting &primitive primitive-display-class-breakpoints (string-buffer :: ) => (number-written :: ); /// ACCESSORS define side-effect-free dynamic-extent &primitive primitive-element (x :: , offset :: , byte-offset :: ) => (obj :: ); define side-effecting stateless dynamic-extent &primitive primitive-element-setter (new-value :: , x :: , offset :: , byte-offset :: ) => (obj :: ); define side-effect-free dynamic-extent &primitive primitive-byte-element (x :: , offset :: , byte-offset :: ) => (obj :: ); define side-effecting stateless dynamic-extent &primitive primitive-byte-element-setter (new-value :: , x :: , offset :: , byte-offset :: ) => (obj :: ); define side-effect-free dynamic-extent &primitive primitive-bit-element (x :: , word-offset :: , byte-offset :: , bit-offset :: ) => (obj :: ); define side-effecting stateless dynamic-extent &primitive primitive-bit-element-setter (new-value :: , x :: , offset :: , byte-offset :: , bit-offset :: ) => (obj :: ); define side-effect-free dynamic-extent &primitive primitive-bit-field (pointer :: , bit-offset :: , bit-size :: ) => (field :: ); define side-effecting stateless dynamic-extent &primitive primitive-bit-field-setter (new-field :: , pointer :: , bit-offset :: , bit-size :: ) => (new-field :: ); define side-effecting stateless dynamic-extent &primitive primitive-fill! (dst :: , base-offset :: , offset :: , size :: , value :: ) => (); define side-effecting stateless dynamic-extent &primitive primitive-fill-bytes! (dst :: , base-offset :: , offset :: , size :: , value :: ) => (); define side-effecting stateless dynamic-extent &primitive primitive-replace! (dst :: , dst-base-offset :: , dst-offset :: , src :: , src-base-offset :: , src-offset :: , size :: ) => (); define side-effecting stateless dynamic-extent &primitive primitive-replace-bytes! (dst :: , dst-base-offset :: , dst-offset :: , src :: , src-base-offset :: , src-offset :: , size :: ) => (); /// GC define side-effecting stateless dynamic-extent &primitive primitive-pin-object (object :: ) => (object :: ); define side-effecting stateless dynamic-extent &primitive primitive-unpin-object (object :: ) => (); define side-effecting &primitive primitive-mps-finalize (object :: ) => (); define side-effecting stateful &primitive primitive-mps-finalization-queue-first () => (object :: ); define side-effecting stateful &primitive primitive-mps-park () => (); define side-effecting stateful &primitive primitive-mps-clamp () => (); define side-effecting stateful &primitive primitive-mps-release () => (); define side-effecting stateful &primitive primitive-mps-collect (print-stats? :: ) => (); define side-effecting stateful &primitive primitive-mps-collection-stats (object :: ) => (found? :: ); define side-effecting stateful &primitive primitive-mps-enable-gc-messages () => (); define side-effecting stateful &primitive primitive-mps-committed () => (bytes :: ); define side-effecting stateful &primitive primitive-mps-begin-ramp-alloc () => (); define side-effecting stateful &primitive primitive-mps-end-ramp-alloc () => (); define side-effecting stateful &primitive primitive-mps-begin-ramp-alloc-all () => (); define side-effecting stateful &primitive primitive-mps-end-ramp-alloc-all () => (); define side-effecting stateless dynamic-extent &primitive primitive-mps-ld-reset (primitive-hash-state) => (); define side-effecting stateless dynamic-extent &primitive primitive-mps-ld-add (primitive-hash-state, object) => (); define side-effecting stateless dynamic-extent &primitive primitive-mps-ld-merge (primitive-hash-state-1, primitive-hash-state-2) => (); define side-effect-free stateless dynamic-extent &primitive primitive-mps-ld-isstale (primitive-hash-state) => (is-stale? :: ); define side-effect-free stateful &primitive primitive-allocation-count () => (count :: ); define side-effecting stateful &primitive primitive-initialize-allocation-count () => (); define side-effecting stateful &primitive primitive-begin-heap-alloc-stats () => (); define side-effecting stateful &primitive primitive-end-heap-alloc-stats (string-buffer :: ) => (number-read :: ); // DLL Support define side-effecting &primitive primitive-runtime-module-handle () => (handle :: ); // Support for keyboard-break handling define side-effect-free &primitive primitive-keyboard-interrupt-signaled () => (interrupt? :: ); define side-effecting &primitive primitive-keyboard-interrupt-signaled-setter (interrupt? :: ) => (); define side-effect-free &primitive primitive-keyboard-interrupt-polling () => (interrupt-polling? :: ); define side-effecting &primitive primitive-keyboard-interrupt-polling-setter (interrupt-polling? :: ) => (); define side-effect-free &primitive primitive-keyboard-interrupt-polling-thread (hThread :: ) => (interrupt-polling? :: ); define side-effecting &primitive primitive-keyboard-interrupt-polling-thread-setter (interrupt-polling? :: , hThread :: ) => (); /// UNICODE CHARACTER // TODO: NEED UNICODE SUPPORT IN COMPILER's RUNTIME define side-effect-free stateless dynamic-extent &primitive primitive-unicode-character-as-raw (x :: ) => (r :: ); define side-effect-free stateless dynamic-extent &primitive primitive-raw-as-unicode-character (r :: ) => (x :: ); /// BYTE-CHARACTER define side-effect-free stateless dynamic-extent &primitive-and-override primitive-byte-character-as-raw (x :: ) => (r :: ) make-raw-literal(as(, x)) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-raw-as-byte-character (r :: ) => (x :: ) as(, ^raw-object-value(r)) end; /// INTEGER /// SMALL-INTEGER /// BIG-INTEGERS /// MACHINE-INTEGERS /// UNSIGNED-MACHINE-INTEGERS /// ADDRESSES /// POINTER define side-effect-free stateless indefinite-extent &primitive primitive-cast-pointer-as-raw (x :: ) => (z :: ); define side-effect-free stateless indefinite-extent &primitive primitive-cast-raw-as-pointer (x :: ) => (z :: ); /// TYPE-CHECKS define side-effect-free stateless dynamic-extent &primitive-and-override primitive-instance? (x :: , t :: ) => (true? :: ) ^instance?(x, t) end; define side-effect-free stateless dynamic-extent &primitive primitive-type-check (x :: , t :: ) => (true? :: ); define side-effect-free stateless dynamic-extent &primitive primitive-range-check (i :: , low :: , high :: ) => (true? :: ); /// COMPARISONS define side-effect-free stateless dynamic-extent &primitive-and-override primitive-raw-as-boolean (x :: ) => (true? :: ) ^raw-object-value(x) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-boolean-as-raw (x) => (true? :: ) make-raw-literal(if (x) 1 else 0 end) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-as-boolean (x) => (true? :: ) x ~== #f end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-not (x :: ) => (not-x :: ) ~(^raw-object-value(x)) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-id? (x :: , y :: ) => (id? :: ) x == y end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-not-id? (x :: , y :: ) => (not-id? :: ) x ~== y end; define side-effect-free stateless dynamic-extent &primitive primitive-compare-bytes (base1 :: , offset1 :: , base2 :: , offset2 :: , size-in-bytes :: ) => (same? :: ); define side-effect-free stateless dynamic-extent &primitive primitive-compare-words (base1 :: , offset1 :: , base2 :: , offset2 :: , size-in-words :: ) => (same? :: ); /// REPEATED define side-effect-free stateless indefinite-extent &primitive primitive-repeated-slot-as-raw (x :: , offset :: ) => (r :: ); define side-effect-free stateless indefinite-extent &primitive primitive-repeated-slot-offset (x :: ) => (r :: ); /// VECTOR define side-effect-free stateless indefinite-extent &primitive-and-override primitive-vector (size :: , #rest arguments) => (value :: ) as(, arguments) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-copy-vector (x :: ) => (value :: ) copy-sequence(x) end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-vector-element (x :: , index :: ) => (value :: ) element(x, index) end; define side-effecting stateless indefinite-extent &primitive-and-override primitive-vector-element-setter (new-value :: , x :: , index :: ) => (value :: ) element(x, index) := new-value; end; define side-effect-free stateless dynamic-extent &primitive-and-override primitive-vector-size (x :: ) => (size :: ) size(x) end; define side-effect-free stateless indefinite-extent &primitive primitive-vector-as-raw (x :: ) => (r :: ); define side-effect-free stateless indefinite-extent &primitive primitive-raw-as-vector (n :: , r :: ) => (x :: ); /// STRING define side-effect-free stateless dynamic-extent &primitive-and-override primitive-strlen (x :: ) => (size :: ) size(x) end; define side-effect-free stateless indefinite-extent &primitive primitive-string-as-raw (x :: ) => (r :: ); define side-effect-free stateless indefinite-extent &primitive primitive-raw-as-string (n :: , r :: ) => (x :: ); /// INSTANCE define side-effect-free stateless dynamic-extent &primitive-and-override primitive-object-class (x :: ) => (c :: ) &object-class(x) end; define side-effect-free stateless dynamic-extent &primitive primitive-slot-value (x :: , position :: ) => (value :: ); define side-effect-free stateless dynamic-extent &primitive primitive-initialized-slot-value (x :: , position :: ) => (value :: ); define side-effecting stateless indefinite-extent &primitive primitive-slot-value-setter (value :: , x :: , position :: ) => (value :: ); define side-effect-free stateless dynamic-extent &primitive primitive-repeated-slot-value (x :: , base-position :: , position :: ) => (value :: ); define side-effecting stateless indefinite-extent &primitive primitive-repeated-slot-value-setter (value :: , x :: , base-position :: , position :: ) => (value :: ); /// CALLING CONVENTION define side-effect-free stateless dynamic-extent &primitive primitive-function-parameter () => (fn :: ); define side-effect-free stateless dynamic-extent &primitive primitive-lambda-parameter () => (fn :: ); // !@#$ where used? define side-effect-free stateless dynamic-extent &primitive primitive-next-methods-parameter // ?? () => (nm :: ); define side-effecting stateless indefinite-extent &primitive primitive-next-methods-parameter-setter // ?? (new-value :: ) => (nm :: ); define side-effecting stateless dynamic-extent &primitive primitive-set-generic-function-entrypoints (gf :: ) => (); define side-effecting stateless dynamic-extent &primitive primitive-set-accessor-method-xep (accessor-method :: ) => (accessor-method :: ); /// APPLY define side-effecting stateless indefinite-extent &primitive primitive-xep-apply (function :: , buffer-size :: , buffer :: ) => (#rest values); define side-effecting stateless indefinite-extent &primitive primitive-mep-apply (function :: , next-methods :: , args :: ) => (#rest values); define side-effecting stateless indefinite-extent &primitive primitive-mep-apply-with-optionals (function :: , next-methods :: , args :: ) => (#rest values); define side-effecting stateless indefinite-extent &primitive primitive-engine-node-apply-with-optionals (function :: , next-methods :: , args :: ) => (#rest values); define side-effecting stateless indefinite-extent &primitive primitive-iep-apply (function :: , buffer-size :: , buffer :: ) => (#rest values); // !@#$ needs to be built-in define side-effecting stateless indefinite-extent &primitive primitive-apply // !@#$ broken (fn :: , size :: , #rest arguments) => (#rest values); /// DISCRIMINATOR/ENGINE-NODE INITIALIZATION define side-effecting stateless dynamic-extent &primitive primitive-initialize-engine-node (engine-node :: ) => (single-value :: ); define side-effecting stateless dynamic-extent &primitive primitive-initialize-discriminator (discriminator :: ) => (single-value :: ); /// MULTIPLE-VALUES define side-effect-free stateless dynamic-extent &primitive-and-override primitive-values (size :: , #rest arguments) => (#rest values) apply(values, arguments) end; //// SYMBOL BOOTING define side-effecting stateless indefinite-extent &primitive primitive-resolve-symbol (uninterned-symbol :: ) => (canonical-symbol :: ); define side-effect-free stateless dynamic-extent &primitive primitive-string-as-symbol (string :: ) => (symbol :: ); define side-effect-free stateless dynamic-extent &primitive primitive-preboot-symbols () => (res :: ); /// C-FFI define side-effect-free stateless dynamic-extent &primitive primitive-unwrap-c-pointer (pointer :: ) => (p :: ); define side-effect-free stateless dynamic-extent &primitive primitive-wrap-c-pointer (wrapper :: , pointer :: ) => (p :: ); define macro raw-field-primitive-definer { define raw-field-primitive ?:name ?raw-value-type:name} => { define side-effect-free stateless dynamic-extent &primitive "primitive-" ## ?name ## "-field" (pointer :: , byte-offset :: , bit-offset :: , bit-size :: ) => (value :: ?raw-value-type); define side-effecting stateless dynamic-extent &primitive "primitive-" ## ?name ## "-field-setter" (new :: ?raw-value-type, pointer :: , byte-offset :: , bit-offset :: , bit-size :: ) => (value :: ?raw-value-type) } end macro; define raw-field-primitive c-unsigned ; define raw-field-primitive c-signed ; define raw-field-primitive c-int ; /// OPERATING SYSTEM define side-effecting stateless dynamic-extent &primitive primitive-run-application (command :: ) => (code :: ); define side-effecting stateless dynamic-extent &primitive primitive-exit-application (code :: ) => (); define side-effecting stateless dynamic-extent &primitive primitive-start-timer () => (); define side-effecting stateless dynamic-extent &primitive primitive-stop-timer () => (time :: ); // eof