Skip to content

Commit 702d6d4

Browse files
committed
WIP: php-wasm
1 parent 96a5e18 commit 702d6d4

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

esm/interpreter/php-wasm.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { dedent } from '../utils.js';
2+
import { fetchFiles, fetchPaths, io, stdio, writeFileShim } from './_utils.js';
3+
4+
const type = 'php-wasm';
5+
6+
// REQUIRES INTEGRATION TEST
7+
/* c8 ignore start */
8+
export default {
9+
type,
10+
module: (version = '0.0.7') => {
11+
globalThis.exports = {};
12+
return `https://cdn.jsdelivr.net/npm/php-wasm@${version}/php-worker.js`;
13+
},
14+
async engine(_, config, url) {
15+
const { PHP } = globalThis.exports;
16+
delete globalThis.exports;
17+
const { stderr, stdout, get } = stdio();
18+
debugger;
19+
const interpreter = await get(PHP({
20+
print: stdout,
21+
printErr: stderr,
22+
noInitialRun: true,
23+
locateFile: () => `${url.slice(0, url.lastIndexOf('/'))}/php-worker.wasm`
24+
}));
25+
interpreter.calledRun = false;
26+
interpreter.run(['<?php echo 123;']);
27+
// interpreter.addEventListener('output', (event) => {
28+
// io.get(interpreter).stdout(event.detail);
29+
// });
30+
// interpreter.addEventListener('error', (event) => {
31+
// io.get(interpreter).stderr(event.detail);
32+
// });
33+
// interpreter.global.getTable(LuaLibraries.Base, (index) => {
34+
// interpreter.global.setField(index, 'print', stdout);
35+
// interpreter.global.setField(index, 'printErr', stderr);
36+
// });
37+
if (config.files) await fetchFiles(this, interpreter, config.files);
38+
if (config.fetch) await fetchPaths(this, interpreter, config.fetch);
39+
return interpreter;
40+
},
41+
// Fallback to globally defined module fields
42+
registerJSModule: (interpreter, name, value) => {
43+
// interpreter.global.set(name, value);
44+
},
45+
run: (interpreter, code, ...args) => {
46+
try {
47+
// return interpreter.run(dedent(code), ...args);
48+
}
49+
catch (error) {
50+
io.get(interpreter).stderr(error);
51+
}
52+
},
53+
runAsync: async (interpreter, code, ...args) => {
54+
try {
55+
return await interpreter.run(dedent(code), ...args);
56+
}
57+
catch (error) {
58+
io.get(interpreter).stderr(error);
59+
}
60+
},
61+
runEvent: async (interpreter, code, event) => {
62+
// allows method(event) as well as namespace.method(event)
63+
// it does not allow fancy brackets names for now
64+
const [name, ...keys] = code.split('.');
65+
let target = interpreter.global.get(name);
66+
let context;
67+
for (const key of keys) [context, target] = [target, target[key]];
68+
try {
69+
await target.call(context, event);
70+
}
71+
catch (error) {
72+
io.get(interpreter).stderr(error);
73+
}
74+
},
75+
transform: (_, value) => value,
76+
writeFile: (
77+
{
78+
cmodule: {
79+
module: { FS },
80+
},
81+
},
82+
path,
83+
buffer,
84+
) => writeFileShim(FS, path, buffer),
85+
};
86+
/* c8 ignore stop */

esm/interpreters.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ const register = (interpreter) => {
5353

5454
//:RUNTIMES
5555
import micropython from './interpreter/micropython.js';
56+
import php_wasm from './interpreter/php-wasm.js';
5657
import pyodide from './interpreter/pyodide.js';
5758
import ruby_wasm_wasi from './interpreter/ruby-wasm-wasi.js';
5859
import wasmoon from './interpreter/wasmoon.js';
59-
for (const interpreter of [micropython, pyodide, ruby_wasm_wasi, wasmoon])
60+
for (const interpreter of [micropython, php_wasm, pyodide, ruby_wasm_wasi, wasmoon])
6061
register(interpreter);

test/php-wasm.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
6+
<title>PHP</title>
7+
<link rel="stylesheet" href="style.css" />
8+
<script type="module" src="../core.js"></script>
9+
</head>
10+
<body>
11+
<script type="php-wasm">
12+
echo 'Hello PHP'
13+
</script>
14+
</body>
15+
</html>

0 commit comments

Comments
 (0)