PageSourceSearch

https://pluto-lang.org/assets/js/95224dc4.72f1530b.js

js pluto-lang.org collected 2026-10-02 05:17:43 UTC 44,491 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkpluto=self.webpackChunkpluto||[]).push([[7764],{288:(l,e,s)=>{s.r(e),s.d(e,{assets:()=>a,contentTitle:()=>o,default:()=>F,frontMatter:()=>i,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"Runtime Environment/FFI","title":"FFI","description":"Must be included via require.","source":"@site/docs/Runtime Environment/FFI.md","sourceDirName":"Runtime Environment","slug":"/Runtime Environment/FFI","permalink":"/docs/Runtime Environment/FFI","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Exception","permalink":"/docs/Runtime Environment/Exception"},"next":{"title":"HTTP","permalink":"/docs/Runtime Environment/HTTP"}}');var r=s(4848),c=s(8453);const i={},o=void 0,a={},d=[{value:"<code>ffi.open</code>",id:"ffiopen",level:3},{value:"Parameters",id:"parameters",level:4},{value:"Returns",id:"returns",level:4},{value:"Example",id:"example",level:4},{value:"<code>ffi.struct</code>",id:"ffistruct",level:3},{value:"Paramters",id:"paramters",level:4},{value:"Returns",id:"returns-1",level:4},{value:"Example",id:"example-1",level:4},{value:"<code>ffi.new</code>",id:"ffinew",level:3},{value:"Parameters",id:"parameters-1",level:4},{value:"Returns",id:"returns-2",level:4},{value:"<code>ffi.cdef</code>
1",id:"fficdef",level:3},{value:"Parameters",id:"parameters-2",level:4},{value:"Example",id:"example-2",level:4},{value:"<code>ffi.sizeof</code>",id:"ffisizeof",level:3},{value:"Parameters",id:"parameters-3",level:4},{value:"Returns",id:"returns-3",level:4},{value:"<code>ffi.offsetof</code>",id:"ffioffsetof",level:3},{value:"Parameters",id:"parameters-4",level:4},{value:"Returns",id:"returns-4",level:4},{value:"<code>ffi.nullptr</code>",id:"ffinullptr",level:3},{value:"<code>ffi.alloc</code>",id:"ffialloc",level:3},{value:"Parameters",id:"parameters-5",level:4},{value:"Returns",id:"returns-5",level:4},{value:"<code>ffi.write</code>",id:"ffiwrite",level:3},{value:"Parameters",id:"parameters-6",level:4},{value:"<code>ffi.read</code>",id:"ffiread",level:3},{value:"Parameters",id:"parameters-7",level:4},{value:"Returns",id:"returns-6",level:4},{value:"<code>ffi.callback</code>",id:"fficallback",level:3},{value:"Parameters",id:"parameters-8",level:4},{value:"Returns",id:"returns-7",level:4},{value:"Example",id:"example-3",level:4},{value:"FFI Library Class",id:"ffi-library-class",level:2},{value:"<code>wrap</code>",id:"wrap",level:3},{value:"Parameters",id:"parameters-9",level:4},{value:"Returns",id:"returns-8",level:4},{value:"<code>value</code>",id:"value",level:3},{value:"Parameters",id:"parameters-10",level:4},{value:"Returns",id:"returns-9",level:4},{value:"<code>cdef</code>
1",id:"cdef",level:3},{value:"Parameters",id:"parameters-11",level:4},{value:"Example",id:"example-4",level:4},{value:"FFI Callback Class",id:"ffi-callback-class",level:2},{value:"<code>blocking</code>",id:"blocking",level:3},{value:"Parameters",id:"parameters-12",level:4},{value:"Returns",id:"returns-10",level:4},{value:"<code>tick</code>",id:"tick",level:3},{value:"<code>defaultreturn</code>",id:"defaultreturn",level:3},{value:"Parameters",id:"parameters-13",level:4},{value:"Returns",id:"returns-11",level:4},{value:"<code>callcount</code>",id:"callcount",level:3}];function t(l){const e={a:"a",admonition:"admonition",code:"code",div:"div",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",ul:"ul",...(0,c.R)(),...l.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(e.p,{children:["Must be included via ",(0,r.jsx)(e.code,{children:"require"}),"."]}),"\n",(0,r.jsx)(e.admonition,{type:"caution",children:(0,r.jsx)(e.p,{children:"This is intended for advanced users."})}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffiopen",children:(0,r.jsx)(e.code,{children:"ffi.open"})}),"\n",(0,r.jsx)(e.p,{children:"Loads a DLL/SO (dynamic link library/shared object). This function is not available in WASM builds of Pluto."}),"\n",(0,r.jsx)(e.h4,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The name of the library which is to be located by the operating system. A relative or absolute path also works."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"An FFI library instance."}),"\n",(0,r.jsx)(e.h4,{id:"example",children:"Example"}),"\n",(0,r.jsx)(e.p,{children:"The following C++ code:"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai with-title",style:{backgroundColor:"#272822",color:"#F8F8F2"},title:"lib.cpp",children:[(0,r.jsx)(e.div,{className:"code-title",children:"lib.cpp"}),(0,r.jsx)(e.div,{className:"language-id",children:"cpp"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"#ifdef"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" _WIN32"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"#define"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#A6E22E"},children:"EXPORT"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" __declspec(dllexport)"})]}),(0,r.jsx)(e.div,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"#else"})}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"#define"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#A6E22E"},children:"EXPORT"})]}),(0,r.jsx)(e.div,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"#endif"})}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"extern"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"C"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" EXPORT "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" MY_MAGIC_INT "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"69"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"extern"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"C"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" EXPORT "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#A6E22E"},children:"add"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" a"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" b) {"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"return"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" a "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"+"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" b"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsx)(e.div,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"}"})})]})})]}),"\n",(0,r.jsx)(e.p,{children:"Compiled like this:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Windows: ",(0,r.jsx)(e.code,{children:"clang -std=c++17 --shared -o lib.dll lib.cpp"})]}),"\n",(0,r.jsxs)(e.li,{children:["Linux/MacOS: ",(0,r.jsx)(e.code,{children:"clang -std=c++17 --shared -o liblib.so lib.cpp"})]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Can be used like this:"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai",style:{backgroundColor:"#272822",color:"#F8F8F2"},norun:"true",children:[(0,r.jsx)(e.div,{className:"language-id",children:"pluto"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"require"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"pluto:ffi"'})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" lib "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"open"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"os.platform"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"windows"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"?"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"lib"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"./liblib.so"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"value"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"MY_MAGIC_INT"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:") "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"69"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"wrap"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"add"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")("}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"38"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"4"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:") "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"42"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]})]})})]}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffistruct",children:(0,r.jsx)(e.code,{children:"ffi.struct"})}),"\n",(0,r.jsx)(e.p,{children:"Parses a subset of C for a struct."}),"\n",(0,r.jsx)(e.h4,{id:"paramters",children:"Paramters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The C source code."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-1",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"An FFI Struct Type instance."}),"\n",(0,r.jsx)(e.h4,{id:"example-1",children:"Example"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai",style:{backgroundColor:"#272822",color:"#F8F8F2"},children:[(0,r.jsx)(e.div,{className:"language-id",children:"pluto"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"require"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"pluto:ffi"'})]}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" Color "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"struct"}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:"[["})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"struct"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" Color {"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"        uint8_t r"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"        uint8_t g"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"        uint8_t b"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    }"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsx)(e.div,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:"]]"})}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" c "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"new"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"Color"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"}
1,children:"()"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"c"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"r "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"255"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"print"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(c"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"r) "}),(0,r.jsx)(e.span,{style:{color:"#88846F"},children:"--\x3e 255"})]})]})})]}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffinew",children:(0,r.jsx)(e.code,{children:"ffi.new"})}),"\n",(0,r.jsx)(e.p,{children:"Instantiate an FFI Struct Type by name or instance."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-1",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"An FFI Struct Type instance or the name of one stored on the FFI library itself."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-2",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"A new instance of the struct."}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"fficdef",children:(0,r.jsx)(e.code,{children:"ffi.cdef"})}),"\n",(0,r.jsx)(e.p,{children:"Parses a subset of C for structs to be stored on the FFI library itself."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-2",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The C source code."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"example-2",children:"Example"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai",style:{backgroundColor:"#272822",color:"#F8F8F2"},children:[(0,r.jsx)(e.div,{className:"language-id",children:"pluto"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"require"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"pluto:ffi"'})]}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"cdef"}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:"[["})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"struct"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" Color {"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"        uint8_t r"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"        uint8_t g"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"        uint8_t b"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    }"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsx)(e.div,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:"]]"})}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" c "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"new"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"Color"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"c"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"r "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"255"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"print"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(c"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"r) "}),(0,r.jsx)(e.span,{style:{color:"#88846F"},children:"--\x3e 255"})]})]})})]}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffisizeof",children:(0,r.jsx)(e.code,{children:"ffi.sizeof"})}),"\n",(0,r.jsx)(e.p,{children:"Measures the size of an FFI Struct Type."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-3",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"An FFI Struct Type instance, the name of a struct stored on the FFI library itself, or an instance of the struct."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-3",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"The size in bytes."}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffioffsetof",children:(0,r.jsx)(e.code,{children:"ffi.offsetof"})}),"\n",(0,r.jsx)(e.p,{children:"Measures the offset of a field on an FFI Struct Type."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-4",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"An FFI Struct Type instance, the name of a struct stored on the FFI library itself, or an instance of the struct."}),"\n",(0,r.jsx)(e.li,{children:"The name of the field."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-4",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"The offset in bytes."}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffinullptr",children:(0,r.jsx)(e.code,{children:"ffi.nullptr"})}),"\n",(0,r.jsxs)(e.p,{children:["This constant can be used to give ",(0,r.jsx)(e.code,{children:"0"}),' to a "ptr"-type argument.']}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffialloc",children:(0,r.jsx)(e.code,{children:"ffi.alloc"})}),"\n",(0,r.jsx)(e.p,{children:"Creates a userdata with the given size."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-5",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The size in bytes."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-5",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"A new userdata."}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffiwrite",children:(0,r.jsx)(e.code,{children:"ffi.write"})}),"\n",(0,r.jsx)(e.p,{children:"Copies data from a string to a userdata."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-6",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The string."}),"\n",(0,r.jsx)(e.li,{children:"The userdata."}),"\n"]}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"ffiread",children:(0,r.jsx)(e.code,{children:"ffi.read"})}),"\n",(0,r.jsx)(e.p,{children:"Turns a userdata into a string."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-7",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The userdata."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-6",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"A string."}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h3,{id:"fficallback",children:(0,r.jsx)(e.code,{children:"ffi.callback"})}),"\n",(0,r.jsx)(e.p,{children:"Creates a function pointer callable from native code. This function is only available on x86, x86_64, and aarch64."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-8",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:'The return type. Can be "void", "i8", "i16", "i32", "i64", "u8", "u16", "u32", "u
164", "f32", "f64", "ptr" or "str".'}),"\n",(0,r.jsx)(e.li,{children:"The argument type(s)."}),"\n",(0,r.jsx)(e.li,{children:"The Pluto function to execute."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-7",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"An FFI Callback instance."}),"\n",(0,r.jsx)(e.h4,{id:"example-3",children:"Example"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai",style:{backgroundColor:"#272822",color:"#F8F8F2"},norun:"true",children:[(0,r.jsx)(e.div,{className:"language-id",children:"pluto"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"require"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"pluto:ffi"'})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" cb "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"callback"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"function"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#FD971F",fontStyle:"italic"},children:"val"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"return"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" val "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"+"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"69"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"end"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"wrap"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"void"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"set_cb"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"ptr"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")(cb)"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"wrap"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"call_cb"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")("}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"42"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:") "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"42"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"+"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"69"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]})]})})]}),"\n",(0,r.jsx)(e.admonition,{type:"info",children:(0,r.jsxs)(e.p,{children:["This function is incompatible with ",(0,r.jsx)(e.a,{href:"https://en.wikipedia.org/wiki/W%5EX",children:"W^X"}),". ARM-based MacOS may enforce this without the ",(0,r.jsx)(e.code,{children:"com.apple.security.cs.allow-jit"})," entitlement."]})}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h2,{id:"ffi-library-class",children:"FFI Library Class"}),"\n",(0,r.jsxs)(e.p,{children:["Obtained from ",(0,r.jsx)(e.code,{children:"ffi.open"}),"."]}),"\n",(0,r.jsx)(e.h3,{id:"wrap",children:(0,r.jsx)(e.code,{children:"wrap"})}),"\n",(0,r.jsx)(e.p,{children:"Creates a function wrapper."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-9",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:'The return type. Can be "void", "i8", "i16", "i32", "i64", "u8", "u16", "u32", "u
164", "f32", "f64", "ptr" or "str".'}),"\n",(0,r.jsx)(e.li,{children:"The name of the function."}),"\n",(0,r.jsx)(e.li,{children:'The argument type(s). Can be "i8", "i16", "i32", "i64", "u8", "u16", "u32", "u64", "f32", "f64", "ptr" or "str".'}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-8",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"A new function wrapper instance, which can be called."}),"\n",(0,r.jsx)(e.h3,{id:"value",children:(0,r.jsx)(e.code,{children:"value"})}),"\n",(0,r.jsx)(e.p,{children:"Gets an exported value and interprets it using the given type."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-10",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:'The type. Can be "i8", "i16", "i32", "i64", "u8", "u16", "u32", "u64", "f32", "f64", "ptr" or "str".'}),"\n",(0,r.jsx)(e.li,{children:"The name of the export."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-9",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"The interpreted value."}),"\n",(0,r.jsx)(e.h3,{id:"cdef",children:(0,r.jsx)(e.code,{children:"cdef"})}),"\n",(0,r.jsx)(e.p,{children:"Parses a subset of C for values and functions and puts them on the library instance."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-11",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"The C source code."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"example-4",children:"Example"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai",style:{backgroundColor:"#272822",color:"#F8F8F2"},norun:"true",children:[(0,r.jsx)(e.div,{className:"language-id",children:"pluto"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"require"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"pluto:ffi"'})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" lib "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"open"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"os.platform"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"windows"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"?"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"lib"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"./liblib.so"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"cdef"}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:"[["})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" MY_MAGIC_INT"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"    "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#A6E22E"},children:"add"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#FD971F",fontStyle:"italic"},children:"a"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF",fontStyle:"italic"},children:"int"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#FD971F",fontStyle:"italic"},children:"b"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:";"})]}),(0,r.jsx)(e.div,{className:"line",children:(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:"]]"})}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"MY_MAGIC_INT "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"69"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"add"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"38"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"4"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:") "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"42"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]})]})})]}),"\n",(0,r.jsx)(e.p,{children:"This is equivalent to the following:"}),"\n",(0,r.jsxs)(e.pre,{className:"shiki monokai",style:{backgroundColor:"#272822",color:"#F8F8F2"},norun:"true",children:[(0,r.jsx)(e.div,{className:"language-id",children:"pluto"}),(0,r.jsx)(e.div,{className:"code-container",children:(0,r.jsxs)(e.code,{children:[(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"require"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"pluto:ffi"'})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"local"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" lib "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" ffi"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"open"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"os.platform"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"windows"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"?"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"lib"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"./liblib.so"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"MY_MAGIC_INT "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"value"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"MY_MAGIC_INT"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"add "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:":"}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"wrap"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"add"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#E6DB74"},children:'"i32"'}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsx)(e.div,{className:"line"}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"MY_MAGIC_INT "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"69"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]}),(0,r.jsxs)(e.div,{className:"line",children:[(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"assert"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"(lib"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:"."}),(0,r.jsx)(e.span,{style:{color:"#66D9EF"},children:"add"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:"("}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"38"}),(0,r.jsx)(e.span,{style:{color:"#9F570F"},children:","}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"4"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:") "}),(0,r.jsx)(e.span,{style:{color:"#F92672"},children:"=="}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:" "}),(0,r.jsx)(e.span,{style:{color:"#AE81FF"},children:"42"}),(0,r.jsx)(e.span,{style:{color:"#F8F8F2"},children:")"})]})]})})]}),"\n",(0,r.jsx)(e.hr,{}),"\n",(0,r.jsx)(e.h2,{id:"ffi-callback-class",children:"FFI Callback Class"}),"\n",(0,r.jsxs)(e.p,{children:["Returned from ",(0,r.jsx)(e.code,{children:"ffi.callback"}),"."]}),"\n",(0,r.jsx)(e.h3,{id:"blocking",children:(0,r.jsx)(e.code,{children:"blocking"})}),"\n",(0,r.jsx)(e.p,{children:"Gets or sets whether native calls from non-Pluto threads block until processed."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-12",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"(optional) A boolean."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-10",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"The current state if no parameter is provided."}),"\n",(0,r.jsx)(e.h3,{id:"tick",children:(0,r.jsx)(e.code,{children:"tick"})}
1),"\n",(0,r.jsx)(e.p,{children:"Processes pending callback invocations queued from other threads."}),"\n",(0,r.jsx)(e.h3,{id:"defaultreturn",children:(0,r.jsx)(e.code,{children:"defaultreturn"})}),"\n",(0,r.jsx)(e.p,{children:"Gets or sets the value returned to native code while callbacks are queued in non-blocking mode."}),"\n",(0,r.jsx)(e.h4,{id:"parameters-13",children:"Parameters"}),"\n",(0,r.jsxs)(e.ol,{children:["\n",(0,r.jsx)(e.li,{children:"(optional) The value to return."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"returns-11",children:"Returns"}),"\n",(0,r.jsx)(e.p,{children:"The current default return value if no parameter is provided."}),"\n",(0,r.jsx)(e.h3,{id:"callcount",children:(0,r.jsx)(e.code,{children:"callcount"})}),"\n",(0,r.jsx)(e.p,{children:"Returns the number of times the callback has been invoked."})]})}function F(l={}){const{wrapper:e}={...(0,c.R)(),...l.components};return e?(0,r.jsx)(e,{...l,children:(0,r.jsx)(t,{...l})}):t(l)}},8453:(l,e,s)=>{s.d(e,{R:()=>i,x:()=>o});var n=s(6540);const r={},c=n.createContext(r);function i(l){const e=n.useContext(c);return n.useMemo((function(){return"function"==typeof l?l(e):{...e,...l}}),[e,l])}function o(l){let e;return e=l.disableParentContext?"function"==typeof l.components?l.components(r):l.components||r:i(l.components),n.createElement(c.Provider,{value:e},l.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.