* Library demo

This commit is contained in:
Michaël Van Canneyt 2023-10-15 18:05:17 +02:00
parent c6fb0e4bbf
commit a29cf3d56a
6 changed files with 309 additions and 0 deletions

1
demo/wasienv/library/bulma.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="demolibadd"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<CustomData Count="4">
<Item0 Name="MaintainHTML" Value="1"/>
<Item1 Name="Pas2JSProject" Value="1"/>
<Item2 Name="PasJSLocation" Value="demolibadd"/>
<Item3 Name="PasJSWebBrowserProject" Value="1"/>
</CustomData>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="demolibadd.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="demowasienv"/>
</Unit>
<Unit>
<Filename Value="index.html"/>
<IsPartOfProject Value="True"/>
<CustomData Count="1">
<Item0 Name="PasJSIsProjectHTMLFile" Value="1"/>
</CustomData>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="demolibadd"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="js"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<AllowLabel Value="False"/>
<UseAnsiStrings Value="False"/>
<CPPInline Value="False"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<TargetOS Value="browser"/>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<UseLineInfoUnit Value="False"/>
</Debugging>
</Linking>
<Other>
<CustomOptions Value="-Jeutf-8 -Jirtl.js -Jc -Jminclude"/>
<CompilerPath Value="$(pas2js)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,125 @@
program demowasienv;
{$mode objfpc}
uses
browserconsole, browserapp, JS, Classes, SysUtils, Web, WebAssembly, types, wasienv;
Type
{ TMyApplication }
TMyApplication = class(TBrowserApplication)
Private
FWasiEnv: TPas2JSWASIEnvironment;
FMemory : TJSWebAssemblyMemory; // Memory of webassembly
FTable : TJSWebAssemblyTable; // exported functions.
function CreateWebAssembly(Path: string; ImportObject: TJSObject
): TJSPromise;
procedure DoWrite(Sender: TObject; const aOutput: String);
function initEnv(aValue: JSValue): JSValue;
procedure InitWebAssembly;
Public
Constructor Create(aOwner : TComponent); override;
Destructor Destroy; override;
procedure doRun; override;
end;
function TMyApplication.InitEnv(aValue: JSValue): JSValue;
Type
TAdd = Function (a,b : integer) : integer;
Var
Module : TJSInstantiateResult absolute aValue;
exps : TWASIExports;
F : Tadd;
a : integer;
begin
Result:=True;
Exps := TWASIExports(TJSObject(Module.Instance.exports_));
FWasiEnv.Instance:=Module.Instance;
Exps.initialize;
f:=TAdd(Exps['add']);
a:=F(2,3);
Writeln('Adding 2+3: ',a,' (expected: ',4711+2+3,')');
end;
procedure TMyApplication.DoWrite(Sender: TObject; const aOutput: String);
begin
Writeln(aOutput);
end;
constructor TMyApplication.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FWasiEnv:=TPas2JSWASIEnvironment.Create;
FWasiEnv.OnStdErrorWrite:=@DoWrite;
FWasiEnv.OnStdOutputWrite:=@DoWrite;
end;
function TMyApplication.CreateWebAssembly(Path: string; ImportObject: TJSObject): TJSPromise;
begin
Result:=window.fetch(Path)._then(Function (res : jsValue) : JSValue
begin
Result:=TJSResponse(Res).arrayBuffer._then(Function (res2 : jsValue) : JSValue
begin
Result:=TJSWebAssembly.instantiate(TJSArrayBuffer(res2),ImportObject);
end,Nil)
end,Nil
);
end;
procedure TMyApplication.InitWebAssembly;
Var
mDesc : TJSWebAssemblyMemoryDescriptor;
tDesc: TJSWebAssemblyTableDescriptor;
ImportObj : TJSObject;
begin
// Setup memory
mDesc.initial:=256;
mDesc.maximum:=256;
FMemory:=TJSWebAssemblyMemory.New(mDesc);
// Setup table
tDesc.initial:=0;
tDesc.maximum:=0;
tDesc.element:='anyfunc';
FTable:=TJSWebAssemblyTable.New(tDesc);
// Setup ImportObject
ImportObj:=new([
'js', new([
'mem', FMemory,
'tbl', FTable
])
]);
FWasiEnv.AddImports(ImportObj);
CreateWebAssembly('libadd.wasm',ImportObj)._then(@initEnv)
end;
destructor TMyApplication.Destroy;
begin
FreeAndNil(FWasiEnv);
inherited Destroy;
end;
procedure TMyApplication.doRun;
begin
// Your code here
Terminate;
InitWebAssembly;
end;
var
Application : TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,49 @@
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>FPC-Webassembly library and Pas2JS Demo</title>
<link href="bulma.min.css" rel="stylesheet">
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.3/css/bulma.min.css"> -->
<script src="demolibadd.js"></script>
<style>
.source {
/* width: 730px; */
margin: -45px auto;
font-size: 0.9em;
}
.source-inner {
display: flex;
justify-content: space-between;
align-items: center;
/* width: 482px; */
}
</style>
</head>
<body>
<div class="section pb-4">
<h1 class="title is-4">FPC compiled wasm library output:</h1>
<div class="box" id="pasjsconsole"></div>
</div>
<!-- <hr> -->
<div class="section">
<div class="source">
<div class="source-inner">
<div>
<p>Created using &nbsp; <a target="_blank" href="https://wiki.freepascal.org/pas2js">pas2js.</a> </p>
<p>Pas2JS Sources: &nbsp; <a target="new" href="demowasienv.lpr">Pas2JS Program</a></p>
<p>Webassembly Sources: &nbsp; <a target="new" href="helloworld.pp">FPC Program</a></p>
</div>
</div>
</div>
</div>
<script>
rtl.showUncaughtExceptions=true;
rtl.run();
</script>
</body>
</html>

View File

@ -0,0 +1,38 @@
// ppcrosswasm32 -Twasi -oadd.wasm add.pas
library libadd;
{$mode objfpc}
type
TConnection = class
private
n : Integer;
public
constructor Create;
function DoAdd(a1,a2 : integer) : Integer;
end;
constructor TConnection.Create;
begin
n := 4711;
end;
function TConnection.Doadd( a1, a2 : Integer ) : Integer;
begin
result:=a1+a2+n;
end;
function add( a1, a2 : Integer ) : Integer;
var
connection : TConnection;
begin
connection := TConnection.Create;
Result := connection.DoAdd(a1,a2);
connection.free;
end;
exports
add name 'add';
end.

View File

@ -27,6 +27,11 @@
<Mode Name="Default"/>
</BuildModes>
</Target>
<Target FileName="library/demolibadd.lpi">
<BuildModes>
<Mode Name="Default"/>
</BuildModes>
</Target>
</Targets>
</ProjectGroup>
</CONFIG>