sproutit-narwhal 0.1.106
Sign up to get free protection for your applications and to get access to all the features.
- data/DISTRIBUTION.yml +15 -0
- data/README.md +86 -0
- data/Rakefile +349 -0
- data/VERSION.yml +7 -0
- data/bin/activate +50 -0
- data/bin/activate.bash +50 -0
- data/bin/activate.cmd +3 -0
- data/bin/js +67 -0
- data/bin/json +2 -0
- data/bin/narwhal +67 -0
- data/bin/narwhal.cmd +29 -0
- data/bin/sea +45 -0
- data/bin/sea.cmd +25 -0
- data/bin/tusk +2 -0
- data/bin/tusk.cmd +5 -0
- data/catalog.json +902 -0
- data/docs/available-packages.md +32 -0
- data/docs/browser-api-plan.md +290 -0
- data/docs/browser-api.md +153 -0
- data/docs/download.md +25 -0
- data/docs/engines.md +32 -0
- data/docs/json-tool.md +121 -0
- data/docs/lib/binary.wiki +242 -0
- data/docs/lib/file.wiki +325 -0
- data/docs/lib/os/popen.md +70 -0
- data/docs/modules.md +38 -0
- data/docs/narwhal.md +487 -0
- data/docs/packages-howto.md +32 -0
- data/docs/packages.md +30 -0
- data/docs/posts/2009-07-29-hello-0.1.md +19 -0
- data/docs/quick-start.md +69 -0
- data/docs/sea.md +49 -0
- data/engines/browser/lib/binary.js +2 -0
- data/engines/browser/lib/reactor.js +21 -0
- data/engines/browser/lib/system.js +3 -0
- data/engines/default/lib/array.js +164 -0
- data/engines/default/lib/binary-engine.js +53 -0
- data/engines/default/lib/binary.js +755 -0
- data/engines/default/lib/date.js +8 -0
- data/engines/default/lib/file-engine.js +119 -0
- data/engines/default/lib/function.js +119 -0
- data/engines/default/lib/global.js +11 -0
- data/engines/default/lib/io-engine.js +26 -0
- data/engines/default/lib/json.js +488 -0
- data/engines/default/lib/object.js +69 -0
- data/engines/default/lib/os-engine.js +3 -0
- data/engines/default/lib/reactor.js +12 -0
- data/engines/default/lib/string.js +84 -0
- data/engines/default/lib/system.js +20 -0
- data/engines/default/lib/worker.js +133 -0
- data/engines/jsc/README.md +18 -0
- data/engines/jsc/bootstrap.js +53 -0
- data/engines/jsc/deps/http-parser/LICENSE +77 -0
- data/engines/jsc/deps/http-parser/README.md +145 -0
- data/engines/jsc/deps/http-parser/http_parser.c +6087 -0
- data/engines/jsc/deps/http-parser/http_parser.h +141 -0
- data/engines/jsc/deps/http-parser/http_parser.rl +500 -0
- data/engines/jsc/deps/http-parser/test.c +858 -0
- data/engines/jsc/include/binary-engine.h +11 -0
- data/engines/jsc/include/io-engine.h +23 -0
- data/engines/jsc/include/narwhal.h +427 -0
- data/engines/jsc/lib/file-engine.js +31 -0
- data/engines/jsc/lib/http.js +1 -0
- data/engines/jsc/lib/io-engine.js +202 -0
- data/engines/jsc/lib/os-engine.js +25 -0
- data/engines/jsc/lib/system.js +18 -0
- data/engines/jsc/lib/zip.js +1 -0
- data/engines/jsc/narwhal-jsc.c +273 -0
- data/engines/jsc/narwhal.c +29 -0
- data/engines/jsc/package.json +8 -0
- data/engines/jsc/src/binary-engine.cc +290 -0
- data/engines/jsc/src/file-engine.cc +405 -0
- data/engines/jsc/src/io-engine.cc +423 -0
- data/engines/jsc/src/jack/handler/jill.cc +710 -0
- data/engines/jsc/src/os-engine.cc +210 -0
- data/engines/rhino/bin/narwhal-rhino +68 -0
- data/engines/rhino/bin/narwhal-rhino.cmd +34 -0
- data/engines/rhino/bootstrap.js +119 -0
- data/engines/rhino/jars/jline.jar +0 -0
- data/engines/rhino/jars/jna.jar +0 -0
- data/engines/rhino/jars/js.jar +0 -0
- data/engines/rhino/lib/binary-engine.js +83 -0
- data/engines/rhino/lib/concurrency.js +6 -0
- data/engines/rhino/lib/event-queue.js +18 -0
- data/engines/rhino/lib/file-engine.js +216 -0
- data/engines/rhino/lib/http-client-engine.js +90 -0
- data/engines/rhino/lib/http-engine.js +10 -0
- data/engines/rhino/lib/io-engine.js +347 -0
- data/engines/rhino/lib/md5-engine.js +40 -0
- data/engines/rhino/lib/os-engine.js +150 -0
- data/engines/rhino/lib/packages-engine.js +71 -0
- data/engines/rhino/lib/sandbox-engine.js +70 -0
- data/engines/rhino/lib/system.js +38 -0
- data/engines/rhino/lib/worker-engine.js +23 -0
- data/engines/rhino/lib/zip.js +78 -0
- data/engines/rhino/package.json +4 -0
- data/engines/secure/lib/file.js +6 -0
- data/engines/secure/lib/system.js +6 -0
- data/engines/template/bin/narwhal-engine-name +32 -0
- data/engines/template/bootstrap.js +40 -0
- data/engines/template/lib/file-engine.js +118 -0
- data/engines/template/lib/system.js +17 -0
- data/examples/browser-deployment-jackconfig.js +35 -0
- data/examples/fibonacci-worker.js +35 -0
- data/examples/fibonacci.js +19 -0
- data/examples/hello +2 -0
- data/examples/narwhal +3 -0
- data/examples/not-quite-a-quine.js +1 -0
- data/extconf.rb +44 -0
- data/gem_bin/narwhal +5 -0
- data/gem_bin/sea +4 -0
- data/gem_bin/tusk +4 -0
- data/lib/args.js +849 -0
- data/lib/base16.js +16 -0
- data/lib/base64.js +120 -0
- data/lib/codec/base64.js +8 -0
- data/lib/crc32.js +60 -0
- data/lib/file-bootstrap.js +187 -0
- data/lib/file.js +659 -0
- data/lib/hash.js +28 -0
- data/lib/hashp.js +65 -0
- data/lib/html.js +16 -0
- data/lib/http-client.js +134 -0
- data/lib/http.js +17 -0
- data/lib/io.js +98 -0
- data/lib/jsmin.js +315 -0
- data/lib/jsonpath.js +89 -0
- data/lib/logger.js +55 -0
- data/lib/md4.js +146 -0
- data/lib/md5.js +164 -0
- data/lib/mime.js +166 -0
- data/lib/narwhal.js +102 -0
- data/lib/narwhal/client.js +261 -0
- data/lib/narwhal/compile.js +99 -0
- data/lib/narwhal/env.js +140 -0
- data/lib/narwhal/inline.js +106 -0
- data/lib/narwhal/json.js +324 -0
- data/lib/narwhal/json.md +178 -0
- data/lib/narwhal/repl.js +96 -0
- data/lib/narwhal/server-test.js +6 -0
- data/lib/narwhal/server.js +270 -0
- data/lib/narwhal/tusk.js +170 -0
- data/lib/narwhal/tusk/bin.js +13 -0
- data/lib/narwhal/tusk/bundle.js +0 -0
- data/lib/narwhal/tusk/catalog.js +22 -0
- data/lib/narwhal/tusk/clone.js +66 -0
- data/lib/narwhal/tusk/consolidate.js +25 -0
- data/lib/narwhal/tusk/create-catalog.js +80 -0
- data/lib/narwhal/tusk/engine.js +42 -0
- data/lib/narwhal/tusk/freeze.js +0 -0
- data/lib/narwhal/tusk/init.js +56 -0
- data/lib/narwhal/tusk/install.js +288 -0
- data/lib/narwhal/tusk/list.js +20 -0
- data/lib/narwhal/tusk/orphans.js +0 -0
- data/lib/narwhal/tusk/reheat.js +15 -0
- data/lib/narwhal/tusk/remove.js +15 -0
- data/lib/narwhal/tusk/search.js +145 -0
- data/lib/narwhal/tusk/update.js +21 -0
- data/lib/narwhal/tusk/upgrade.js +0 -0
- data/lib/os.js +33 -0
- data/lib/packages.js +423 -0
- data/lib/printf.js +169 -0
- data/lib/promise.js +352 -0
- data/lib/querystring.js +176 -0
- data/lib/ref-send.js +257 -0
- data/lib/regexp.js +12 -0
- data/lib/sandbox.js +422 -0
- data/lib/sha.js +112 -0
- data/lib/sha256.js +102 -0
- data/lib/struct.js +228 -0
- data/lib/term.js +179 -0
- data/lib/test/assert.js +95 -0
- data/lib/test/equiv.js +188 -0
- data/lib/test/jsdump.js +165 -0
- data/lib/test/runner.js +129 -0
- data/lib/unload.js +13 -0
- data/lib/uri.js +378 -0
- data/lib/url.js +5 -0
- data/lib/utf8.js +64 -0
- data/lib/util.js +985 -0
- data/lib/uuid.js +89 -0
- data/lib/xregexp.js +521 -0
- data/local.json.template +1 -0
- data/narwhal.gemspec +105 -0
- data/narwhal.js +213 -0
- data/package.json +26 -0
- data/packages/readline/engines/default/lib/readline.js +4 -0
- data/packages/readline/engines/rhino/lib/readline.js +6 -0
- data/packages/readline/package.json +5 -0
- data/sources.json +207 -0
- data/tests/all-tests.js +17 -0
- data/tests/args.js +31 -0
- data/tests/args/domain.js +215 -0
- data/tests/args/options.js +36 -0
- data/tests/args/shifting.js +92 -0
- data/tests/args/validation.js +31 -0
- data/tests/base64.js +23 -0
- data/tests/commonjs.js +3 -0
- data/tests/commonjs/all-tests.js +12 -0
- data/tests/commonjs/bytearray-encodings-tests.js +69 -0
- data/tests/commonjs/bytearray-tests.js +465 -0
- data/tests/commonjs/bytestring-encodings-tests.js +89 -0
- data/tests/commonjs/bytestring-tests.js +263 -0
- data/tests/commonjs/es5/all-tests.js +3 -0
- data/tests/commonjs/es5/bind.js +29 -0
- data/tests/commonjs/file-tests.js +315 -0
- data/tests/commonjs/file/dirname.js +31 -0
- data/tests/commonjs/file/extension.js +45 -0
- data/tests/commonjs/file/is-absolute.js +11 -0
- data/tests/commonjs/file/iterator.js +101 -0
- data/tests/commonjs/file/normal.js +27 -0
- data/tests/commonjs/file/path.js +17 -0
- data/tests/commonjs/file/relative.js +42 -0
- data/tests/commonjs/file/resolve.js +44 -0
- data/tests/commonjs/module-tests.js +9 -0
- data/tests/commonjs/modules/absolute/b.js +1 -0
- data/tests/commonjs/modules/absolute/program.js +5 -0
- data/tests/commonjs/modules/absolute/submodule/a.js +3 -0
- data/tests/commonjs/modules/absolute/test.js +9 -0
- data/tests/commonjs/modules/all-tests.js +47 -0
- data/tests/commonjs/modules/config.js +11 -0
- data/tests/commonjs/modules/cyclic/a.js +4 -0
- data/tests/commonjs/modules/cyclic/b.js +4 -0
- data/tests/commonjs/modules/cyclic/program.js +10 -0
- data/tests/commonjs/modules/cyclic/test.js +9 -0
- data/tests/commonjs/modules/determinism/program.js +3 -0
- data/tests/commonjs/modules/determinism/submodule/a.js +8 -0
- data/tests/commonjs/modules/determinism/submodule/b.js +2 -0
- data/tests/commonjs/modules/determinism/test.js +9 -0
- data/tests/commonjs/modules/exactExports/a.js +3 -0
- data/tests/commonjs/modules/exactExports/program.js +4 -0
- data/tests/commonjs/modules/exactExports/test.js +9 -0
- data/tests/commonjs/modules/hasOwnProperty/hasOwnProperty.js +0 -0
- data/tests/commonjs/modules/hasOwnProperty/program.js +3 -0
- data/tests/commonjs/modules/hasOwnProperty/test.js +9 -0
- data/tests/commonjs/modules/hasOwnProperty/toString.js +0 -0
- data/tests/commonjs/modules/method/a.js +12 -0
- data/tests/commonjs/modules/method/program.js +8 -0
- data/tests/commonjs/modules/method/test.js +9 -0
- data/tests/commonjs/modules/missing/program.js +8 -0
- data/tests/commonjs/modules/missing/test.js +9 -0
- data/tests/commonjs/modules/monkeys/a.js +1 -0
- data/tests/commonjs/modules/monkeys/program.js +4 -0
- data/tests/commonjs/modules/monkeys/test.js +9 -0
- data/tests/commonjs/modules/nested/a/b/c/d.js +3 -0
- data/tests/commonjs/modules/nested/program.js +3 -0
- data/tests/commonjs/modules/nested/test.js +9 -0
- data/tests/commonjs/modules/relative/program.js +5 -0
- data/tests/commonjs/modules/relative/submodule/a.js +1 -0
- data/tests/commonjs/modules/relative/submodule/b.js +2 -0
- data/tests/commonjs/modules/relative/test.js +9 -0
- data/tests/commonjs/modules/transitive/a.js +1 -0
- data/tests/commonjs/modules/transitive/b.js +1 -0
- data/tests/commonjs/modules/transitive/c.js +3 -0
- data/tests/commonjs/modules/transitive/program.js +3 -0
- data/tests/commonjs/modules/transitive/test.js +9 -0
- data/tests/file/all-tests.js +61 -0
- data/tests/file/fnmatch.js +102 -0
- data/tests/file/glob.js +466 -0
- data/tests/file/match.js +102 -0
- data/tests/global.js +6 -0
- data/tests/global/array.js +19 -0
- data/tests/hashes.js +94 -0
- data/tests/html.js +13 -0
- data/tests/io/stringio.js +21 -0
- data/tests/os/all-tests.js +4 -0
- data/tests/os/popen.js +41 -0
- data/tests/os/system.js +22 -0
- data/tests/printf.js +123 -0
- data/tests/query-string.js +87 -0
- data/tests/sandbox/byte-io.js +20 -0
- data/tests/sandbox/fileName.js +3 -0
- data/tests/sandbox/foo.js +0 -0
- data/tests/sandbox/reload.js +79 -0
- data/tests/string.js +35 -0
- data/tests/uri.js +41 -0
- data/tests/util/all-tests.js +79 -0
- data/tests/util/array.js +207 -0
- data/tests/util/array/is-arguments.js +29 -0
- data/tests/util/array/is-array-like.js +29 -0
- data/tests/util/case.js +9 -0
- data/tests/util/collection.js +104 -0
- data/tests/util/eq.js +57 -0
- data/tests/util/expand.js +45 -0
- data/tests/util/object.js +125 -0
- data/tests/util/operator.js +25 -0
- data/tests/util/range.js +19 -0
- data/tests/util/repr.js +26 -0
- data/tests/util/string.js +34 -0
- data/tests/util/unique.js +12 -0
- metadata +434 -0
@@ -0,0 +1,210 @@
|
|
1
|
+
#include <narwhal.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include <unistd.h>
|
4
|
+
|
5
|
+
NWObject IO;
|
6
|
+
|
7
|
+
FUNCTION(OS_exit)
|
8
|
+
{
|
9
|
+
if (ARGC == 0)
|
10
|
+
{
|
11
|
+
exit(0);
|
12
|
+
}
|
13
|
+
else if (ARGC == 1)
|
14
|
+
{
|
15
|
+
ARGN_INT(code, 0);
|
16
|
+
exit(code);
|
17
|
+
}
|
18
|
+
|
19
|
+
THROW("os.exit() takes 0 or 1 arguments.");
|
20
|
+
}
|
21
|
+
END
|
22
|
+
|
23
|
+
FUNCTION(OS_sleep, ARG_INT(seconds))
|
24
|
+
{
|
25
|
+
// TODO: higher resolution sleep?
|
26
|
+
|
27
|
+
while (seconds > 0)
|
28
|
+
seconds = sleep(seconds);
|
29
|
+
|
30
|
+
return JS_undefined;
|
31
|
+
}
|
32
|
+
END
|
33
|
+
|
34
|
+
FUNCTION(OS_systemImpl, ARG_UTF8(command))
|
35
|
+
{
|
36
|
+
int status = system(command);
|
37
|
+
return JS_int(WEXITSTATUS(status));
|
38
|
+
}
|
39
|
+
END
|
40
|
+
|
41
|
+
typedef struct __PopenPrivate {
|
42
|
+
pid_t pid;
|
43
|
+
} PopenPrivate;
|
44
|
+
|
45
|
+
DESTRUCTOR(Popen_finalize)
|
46
|
+
{
|
47
|
+
GET_INTERNAL(PopenPrivate *, data, object);
|
48
|
+
DEBUG("Popen_finalize=[%p]\n", data);
|
49
|
+
if (data) {
|
50
|
+
|
51
|
+
// call waitpid (not blocking) to avoid zombie processes
|
52
|
+
// TODO: if this finalizer is called before the process exits the process will be a zombie
|
53
|
+
int status;
|
54
|
+
pid_t pid = waitpid(data->pid, &status, WUNTRACED|WNOHANG);
|
55
|
+
|
56
|
+
free(data);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
END
|
60
|
+
|
61
|
+
JSClassRef Popen_class(JSContextRef _context)
|
62
|
+
{
|
63
|
+
static JSClassRef jsClass;
|
64
|
+
if (!jsClass)
|
65
|
+
{
|
66
|
+
JSClassDefinition definition = kJSClassDefinitionEmpty;
|
67
|
+
definition.className = "Popen";
|
68
|
+
definition.finalize = Popen_finalize;
|
69
|
+
|
70
|
+
jsClass = JSClassCreate(&definition);
|
71
|
+
}
|
72
|
+
return jsClass;
|
73
|
+
}
|
74
|
+
|
75
|
+
JSObjectRef Popen_new(JSContextRef _context, JSValueRef *_exception, pid_t pid)
|
76
|
+
{
|
77
|
+
PopenPrivate *data = (PopenPrivate*)malloc(sizeof(PopenPrivate));
|
78
|
+
if (!data) return NULL;
|
79
|
+
|
80
|
+
data->pid = pid;
|
81
|
+
|
82
|
+
return JSObjectMake(_context, Popen_class(_context), data);
|
83
|
+
}
|
84
|
+
|
85
|
+
FUNCTION(Popen_wait)
|
86
|
+
{
|
87
|
+
GET_INTERNAL(PopenPrivate*, data, THIS);
|
88
|
+
|
89
|
+
int status;
|
90
|
+
|
91
|
+
pid_t pid = waitpid(data->pid, &status, WUNTRACED);
|
92
|
+
if (!pid) {
|
93
|
+
perror("waitpid");
|
94
|
+
}
|
95
|
+
else {
|
96
|
+
if (WIFEXITED(status)) {
|
97
|
+
return JS_int(WEXITSTATUS(status));
|
98
|
+
} else {
|
99
|
+
printf("WIFSIGNALED=%d\n", WIFSIGNALED(status));
|
100
|
+
printf("WIFSTOPPED=%d\n", WIFSTOPPED(status));
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
return JS_null;
|
105
|
+
}
|
106
|
+
END
|
107
|
+
|
108
|
+
FUNCTION(OS_popenImpl, ARG_UTF8(command))
|
109
|
+
{
|
110
|
+
int outfd[2];
|
111
|
+
int infd[2];
|
112
|
+
int errfd[2];
|
113
|
+
|
114
|
+
// create pipes for subprocess' stdin, stdout, stderr
|
115
|
+
if (pipe(outfd) < 0) // From where parent is going to read
|
116
|
+
THROW("popen error (pipe): %s", strerror(errno));
|
117
|
+
if (pipe(infd) < 0) // Where the parent is going to write to
|
118
|
+
THROW("popen error (pipe): %s", strerror(errno));
|
119
|
+
if (pipe(errfd) < 0) // Where the parent is going to write to
|
120
|
+
THROW("popen error (pipe): %s", strerror(errno));
|
121
|
+
|
122
|
+
pid_t pid = fork();
|
123
|
+
if(!pid)
|
124
|
+
{
|
125
|
+
// In the forked process:
|
126
|
+
|
127
|
+
// close other end of pipes
|
128
|
+
close(infd[1]);
|
129
|
+
close(outfd[0]);
|
130
|
+
close(errfd[0]);
|
131
|
+
|
132
|
+
// close existing stdin, stdout, stderr
|
133
|
+
close(STDIN_FILENO);
|
134
|
+
close(STDOUT_FILENO);
|
135
|
+
close(STDERR_FILENO);
|
136
|
+
|
137
|
+
// set correct endpoints of pipes to stdin, stdout, stderr
|
138
|
+
dup2(infd[0], STDIN_FILENO);
|
139
|
+
dup2(outfd[1], STDOUT_FILENO);
|
140
|
+
dup2(errfd[1], STDERR_FILENO);
|
141
|
+
|
142
|
+
// close originals
|
143
|
+
close(infd[0]);
|
144
|
+
close(outfd[1]);
|
145
|
+
close(errfd[1]);
|
146
|
+
|
147
|
+
|
148
|
+
char *argv[] = {
|
149
|
+
"/bin/sh",
|
150
|
+
"-c",
|
151
|
+
command,
|
152
|
+
NULL
|
153
|
+
};
|
154
|
+
|
155
|
+
execv(argv[0], argv);
|
156
|
+
}
|
157
|
+
else
|
158
|
+
{
|
159
|
+
// close other end of pipes
|
160
|
+
if (close(infd[0]) < 0)
|
161
|
+
THROW("popen error (close): %s", strerror(errno));
|
162
|
+
if (close(outfd[1]) < 0)
|
163
|
+
THROW("popen error (close): %s", strerror(errno));
|
164
|
+
if (close(errfd[1]) < 0)
|
165
|
+
THROW("popen error (close): %s", strerror(errno));
|
166
|
+
|
167
|
+
NWObject obj = CALL(Popen_new, pid);
|
168
|
+
|
169
|
+
ARGS_ARRAY(stdinArgs, JS_int(-1), JS_int(infd[1]));
|
170
|
+
NWObject stdinObj = CALL_AS_CONSTRUCTOR(IO, 2, stdinArgs);
|
171
|
+
HANDLE_EXCEPTION(true, true);
|
172
|
+
SET_VALUE(obj, "stdin", stdinObj);
|
173
|
+
HANDLE_EXCEPTION(true, true);
|
174
|
+
|
175
|
+
ARGS_ARRAY(stdoutArgs, JS_int(outfd[0]), JS_int(-1));
|
176
|
+
NWObject stdoutObj = CALL_AS_CONSTRUCTOR(IO, 2, stdoutArgs);
|
177
|
+
HANDLE_EXCEPTION(true, true);
|
178
|
+
SET_VALUE(obj, "stdout", stdoutObj);
|
179
|
+
HANDLE_EXCEPTION(true, true);
|
180
|
+
|
181
|
+
ARGS_ARRAY(stderrArgs, JS_int(errfd[0]), JS_int(-1));
|
182
|
+
NWObject stderrObj = CALL_AS_CONSTRUCTOR(IO, 2, stderrArgs);
|
183
|
+
HANDLE_EXCEPTION(true, true);
|
184
|
+
SET_VALUE(obj, "stderr", stderrObj);
|
185
|
+
HANDLE_EXCEPTION(true, true);
|
186
|
+
|
187
|
+
SET_VALUE(obj, "wait", JS_fn(Popen_wait));
|
188
|
+
HANDLE_EXCEPTION(true, true);
|
189
|
+
|
190
|
+
return obj;
|
191
|
+
}
|
192
|
+
}
|
193
|
+
END
|
194
|
+
|
195
|
+
NARWHAL_MODULE(os_engine)
|
196
|
+
{
|
197
|
+
EXPORTS("exit", JS_fn(OS_exit));
|
198
|
+
EXPORTS("sleep", JS_fn(OS_sleep));
|
199
|
+
EXPORTS("systemImpl", JS_fn(OS_systemImpl));
|
200
|
+
EXPORTS("popenImpl", JS_fn(OS_popenImpl));
|
201
|
+
|
202
|
+
require("os-engine.js");
|
203
|
+
|
204
|
+
NWObject io = require("io");
|
205
|
+
HANDLE_EXCEPTION(true, true);
|
206
|
+
|
207
|
+
IO = PROTECT_OBJECT(GET_OBJECT(io, "IO"));
|
208
|
+
HANDLE_EXCEPTION(true, true);
|
209
|
+
}
|
210
|
+
END_NARWHAL_MODULE
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# get the absolute path of the executable
|
4
|
+
SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH="$SELF_PATH/$(basename -- "$0")"
|
5
|
+
|
6
|
+
# resolve symlinks
|
7
|
+
while [ -h "$SELF_PATH" ]; do
|
8
|
+
DIR=$(dirname -- "$SELF_PATH")
|
9
|
+
SYM=$(readlink -- "$SELF_PATH")
|
10
|
+
SELF_PATH=$(cd -- "$DIR" && cd -- $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
|
11
|
+
done
|
12
|
+
|
13
|
+
# NARWHAL_ENGINE_HOME is the 2nd ancestor directory of this shell script
|
14
|
+
export NARWHAL_ENGINE_HOME=$(dirname -- "$(dirname -- "$SELF_PATH")")
|
15
|
+
|
16
|
+
BOOTSTRAP=$NARWHAL_ENGINE_HOME/bootstrap.js
|
17
|
+
|
18
|
+
if [ -z "$NARWHAL_HOME" ]; then
|
19
|
+
export NARWHAL_HOME=$(dirname -- "$(dirname -- "$NARWHAL_ENGINE_HOME")")
|
20
|
+
fi
|
21
|
+
|
22
|
+
CLASSPATH=$NARWHAL_ENGINE_HOME/jars/jna.jar
|
23
|
+
BOOTCLASSPATH=$NARWHAL_ENGINE_HOME/jars/js.jar
|
24
|
+
if [ -n "$NARWHAL_CLASSPATH" ]; then
|
25
|
+
CLASSPATH=$NARWHAL_CLASSPATH:$CLASSPATH
|
26
|
+
fi
|
27
|
+
|
28
|
+
if [ "$(which cygpath 2>/dev/null)" ]; then
|
29
|
+
CLASSPATH=$(cygpath -wp -- "$CLASSPATH")
|
30
|
+
BOOTCLASSPATH=$(cygpath -wp -- "$BOOTCLASSPATH")
|
31
|
+
BOOTSTRAP=$(cygpath -wa -- "$BOOTSTRAP")
|
32
|
+
export NARWHAL_HOME=$(cygpath -wa -- "$NARWHAL_HOME")
|
33
|
+
export NARWHAL_ENGINE_HOME=$(cygpath -wa -- "$NARWHAL_ENGINE_HOME")
|
34
|
+
fi
|
35
|
+
|
36
|
+
if [ -z "$NARWHAL_JS_VERSION" ]; then
|
37
|
+
NARWHAL_JS_VERSION=170
|
38
|
+
fi
|
39
|
+
|
40
|
+
if [ -z "$NARWHAL_DEBUGGER" ] || [ "$NARWHAL_DEBUGGER" -eq 0 ]; then
|
41
|
+
JAVA_MAIN=org.mozilla.javascript.tools.shell.Main
|
42
|
+
else
|
43
|
+
JAVA_MAIN=org.mozilla.javascript.tools.debugger.Main
|
44
|
+
fi
|
45
|
+
|
46
|
+
# check the java version number in the most complicated fashion imaginable
|
47
|
+
JAVA_VERSION=$(java -version 2>&1 | awk -F '[ ".]+' 'NR==1 {print $3 "." $4}')
|
48
|
+
LOWER_VERSION=$( (echo "$JAVA_VERSION"; echo "1.5") | sort -n | head -n 1)
|
49
|
+
if [ "$LOWER_VERSION" != "1.5" ]; then
|
50
|
+
echo "Narwhal on Rhino requires Java 1.5 or higher. You have $JAVA_VERSION."
|
51
|
+
exit
|
52
|
+
fi
|
53
|
+
|
54
|
+
# drop into shell if there are no additional arguments
|
55
|
+
if [ $# -lt 1 ]; then
|
56
|
+
# prefer rlwrap to jline.
|
57
|
+
RLWRAP="$(which rlwrap)"
|
58
|
+
if [ -x "$RLWRAP" ]; then
|
59
|
+
RLWRAP="$RLWRAP -C narwhal -m\\"
|
60
|
+
else
|
61
|
+
RLWRAP=""
|
62
|
+
CLASSPATH="$CLASSPATH:$NARWHAL_ENGINE_HOME/jars/jline.jar"
|
63
|
+
fi
|
64
|
+
$RLWRAP java $NARWHAL_JAVA_ARGUMENTS -cp "$BOOTCLASSPATH:$CLASSPATH" "$JAVA_MAIN" -f "$BOOTSTRAP" -f -
|
65
|
+
else
|
66
|
+
java $NARWHAL_JAVA_ARGUMENTS -cp "$BOOTCLASSPATH:$CLASSPATH" "$JAVA_MAIN" -version "$NARWHAL_JS_VERSION" "$BOOTSTRAP" "$0" "$@"
|
67
|
+
fi
|
68
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
@echo off
|
2
|
+
setlocal
|
3
|
+
|
4
|
+
:: NARWHAL_ENGINE_HOME is the parent the bin directory
|
5
|
+
set NARWHAL_ENGINE_HOME=%~dp0..
|
6
|
+
|
7
|
+
set BOOTSTRAP=%NARWHAL_ENGINE_HOME%\bootstrap.js
|
8
|
+
|
9
|
+
if "%NARWHAL_HOME%" == "" (
|
10
|
+
set NARWHAL_HOME=%NARWHAL_ENGINE_HOME%\..\..
|
11
|
+
)
|
12
|
+
|
13
|
+
setlocal ENABLEDELAYEDEXPANSION
|
14
|
+
set CLASSPATH=
|
15
|
+
for /R "%NARWHAL_ENGINE_HOME%\jars" %%g in (*.jar) do set CLASSPATH=!CLASSPATH!;%%g
|
16
|
+
|
17
|
+
if not "%NARWHAL_CLASSPATH%" == "" (
|
18
|
+
set CLASSPATH=%NARWHAL_CLASSPATH%;%CLASSPATH%
|
19
|
+
)
|
20
|
+
|
21
|
+
if "%NARWHAL_DEBUGGER%" == "" (
|
22
|
+
set JAVA_MAIN=org.mozilla.javascript.tools.shell.Main
|
23
|
+
)
|
24
|
+
if not "%NARWHAL_DEBUGGER%" == "" (
|
25
|
+
set JAVA_MAIN=org.mozilla.javascript.tools.debugger.Main
|
26
|
+
)
|
27
|
+
|
28
|
+
|
29
|
+
:: drop into shell if there are no additional arguments
|
30
|
+
if "%1" == "" (
|
31
|
+
java -cp "%CLASSPATH%" "%JAVA_MAIN%" -f "%BOOTSTRAP%" -f -
|
32
|
+
) else (
|
33
|
+
java -cp "%CLASSPATH%" "%JAVA_MAIN%" "%BOOTSTRAP%" %0 %*
|
34
|
+
)
|
@@ -0,0 +1,119 @@
|
|
1
|
+
(function(global, evalGlobal) {
|
2
|
+
|
3
|
+
/*
|
4
|
+
this is a minimal engine-specific thunk for narwhal.js
|
5
|
+
that brings the NARWHAL_PATH environment variable into the global
|
6
|
+
scope using Rhino's special access to Java.
|
7
|
+
*/
|
8
|
+
|
9
|
+
var moduleScopingEnabled = false;
|
10
|
+
|
11
|
+
/* this gets used for several fixtures */
|
12
|
+
var context = Packages.org.mozilla.javascript.Context.getCurrentContext();
|
13
|
+
context.getWrapFactory().setJavaPrimitiveWrap(false);
|
14
|
+
|
15
|
+
// TODO: enable this via a command line switch
|
16
|
+
context.setOptimizationLevel(-1);
|
17
|
+
|
18
|
+
var prefix = "";
|
19
|
+
if (typeof NARWHAL_HOME != "undefined") {
|
20
|
+
prefix = NARWHAL_HOME;
|
21
|
+
delete NARWHAL_HOME;
|
22
|
+
} else {
|
23
|
+
prefix = String(Packages.java.lang.System.getenv("NARWHAL_HOME") || "");
|
24
|
+
}
|
25
|
+
|
26
|
+
var enginePrefix = "";
|
27
|
+
if (typeof NARWHAL_ENGINE_HOME != "undefined") {
|
28
|
+
enginePrefix = NARWHAL_ENGINE_HOME;
|
29
|
+
delete NARWHAL_ENGINE_HOME;
|
30
|
+
} else {
|
31
|
+
enginePrefix = String(Packages.java.lang.System.getenv("NARWHAL_ENGINE_HOME") || "");
|
32
|
+
}
|
33
|
+
|
34
|
+
var prefixes = [prefix, enginePrefix];
|
35
|
+
|
36
|
+
var isFile = function (path) {
|
37
|
+
try { return new java.io.File(path).isFile(); } catch (e) {}
|
38
|
+
return false;
|
39
|
+
};
|
40
|
+
|
41
|
+
var read = function (path) {
|
42
|
+
var path = new java.io.File(path),
|
43
|
+
stream = new java.io.FileInputStream(path);
|
44
|
+
try {
|
45
|
+
var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, path.length());
|
46
|
+
stream.read(buffer);
|
47
|
+
return String(new java.lang.String(buffer, "UTF-8"));
|
48
|
+
} finally {
|
49
|
+
stream.close();
|
50
|
+
}
|
51
|
+
};
|
52
|
+
|
53
|
+
var evaluate = function (text, name, lineNo) {
|
54
|
+
var scope;
|
55
|
+
|
56
|
+
if (moduleScopingEnabled) {
|
57
|
+
scope = new Object();
|
58
|
+
scope.__parent__ = null;
|
59
|
+
scope.__proto__ = global;
|
60
|
+
} else {
|
61
|
+
scope = global;
|
62
|
+
}
|
63
|
+
|
64
|
+
return context.compileFunction(
|
65
|
+
scope,
|
66
|
+
"function(require,exports,module,system,print){"+text+"\n// */\n}",
|
67
|
+
name,
|
68
|
+
lineNo,
|
69
|
+
null
|
70
|
+
);
|
71
|
+
};
|
72
|
+
|
73
|
+
delete global.print;
|
74
|
+
var print = function (string) {
|
75
|
+
Packages.java.lang.System.out.println(String(string));
|
76
|
+
};
|
77
|
+
|
78
|
+
var narwhal = context.evaluateReader(
|
79
|
+
global,
|
80
|
+
new Packages.java.io.FileReader(prefix + "/narwhal.js"),
|
81
|
+
"narwhal.js",
|
82
|
+
1,
|
83
|
+
null
|
84
|
+
);
|
85
|
+
|
86
|
+
var debug = +String(Packages.java.lang.System.getenv("NARWHAL_DEBUG"));
|
87
|
+
var verbose = +String(Packages.java.lang.System.getenv("NARWHAL_VERBOSE"));
|
88
|
+
var os = String(Packages.java.lang.System.getProperty("os.name"));
|
89
|
+
|
90
|
+
try {
|
91
|
+
narwhal({
|
92
|
+
global: global,
|
93
|
+
evalGlobal: evalGlobal,
|
94
|
+
engine: 'rhino',
|
95
|
+
engines: ['rhino', 'default'],
|
96
|
+
os: os,
|
97
|
+
print: print,
|
98
|
+
fs: {
|
99
|
+
read: read,
|
100
|
+
isFile: isFile
|
101
|
+
},
|
102
|
+
prefix: prefix,
|
103
|
+
prefixes: prefixes,
|
104
|
+
evaluate: evaluate,
|
105
|
+
debug: debug,
|
106
|
+
verbose: verbose
|
107
|
+
});
|
108
|
+
} catch (e) {
|
109
|
+
print(e);
|
110
|
+
if (e.rhinoException)
|
111
|
+
e.rhinoException.printStackTrace();
|
112
|
+
if (e.javaException)
|
113
|
+
e.javaException.printStackTrace();
|
114
|
+
Packages.java.lang.System.exit(1);
|
115
|
+
}
|
116
|
+
|
117
|
+
})(this, function () {
|
118
|
+
return eval(arguments[0]);
|
119
|
+
});
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,83 @@
|
|
1
|
+
exports.B_LENGTH = function(bytes) {
|
2
|
+
return bytes.length;
|
3
|
+
}
|
4
|
+
|
5
|
+
exports.B_ALLOC = function(length) {
|
6
|
+
return Packages.java.lang.reflect.Array.newInstance(Packages.java.lang.Byte.TYPE, length);
|
7
|
+
}
|
8
|
+
|
9
|
+
exports.B_FILL = function(bytes, length, offset, value) {
|
10
|
+
Packages.java.util.Arrays.fill(bytes, length, offset, value);
|
11
|
+
}
|
12
|
+
|
13
|
+
exports.B_COPY = function(src, srcOffset, dst, dstOffset, length) {
|
14
|
+
Packages.java.lang.System.arraycopy(src, srcOffset, dst, dstOffset, length);
|
15
|
+
}
|
16
|
+
|
17
|
+
exports.B_GET = function(bytes, index) {
|
18
|
+
return (bytes[index] >>> 0) & 0xFF;
|
19
|
+
}
|
20
|
+
|
21
|
+
exports.B_SET = function(bytes, index, value) {
|
22
|
+
return bytes[index] = ((value & 0x80) ? -1 - (value ^ 0xFF) : value);
|
23
|
+
}
|
24
|
+
|
25
|
+
exports.B_DECODE = function(bytes, offset, length, codec) {
|
26
|
+
return String(new Packages.java.lang.String(bytes, offset, length, codec));
|
27
|
+
}
|
28
|
+
|
29
|
+
exports.B_DECODE_DEFAULT = function(bytes, offset, length) {
|
30
|
+
return String(new Packages.java.lang.String(bytes, offset, length));
|
31
|
+
}
|
32
|
+
|
33
|
+
exports.B_ENCODE = function(string, codec) {
|
34
|
+
return new Packages.java.lang.String(string).getBytes(codec);
|
35
|
+
}
|
36
|
+
|
37
|
+
exports.B_ENCODE_DEFAULT = function(string) {
|
38
|
+
return new Packages.java.lang.String(string).getBytes();
|
39
|
+
}
|
40
|
+
|
41
|
+
exports.B_TRANSCODE = function(bytes, offset, length, sourceCodec, targetCodec) {
|
42
|
+
return new Packages.java.lang.String(bytes, offset, length, sourceCodec).getBytes(targetCodec);
|
43
|
+
}
|
44
|
+
|
45
|
+
function wrapper(that) {
|
46
|
+
var obj = new JavaAdapter(
|
47
|
+
Packages.org.mozilla.javascript.ScriptableObject,
|
48
|
+
Packages.org.mozilla.javascript.Wrapper,
|
49
|
+
{
|
50
|
+
get : function(index, start) {
|
51
|
+
if (typeof index === "number")
|
52
|
+
return that.get(index);
|
53
|
+
|
54
|
+
return that[index];
|
55
|
+
},
|
56
|
+
has : function(index, start) {
|
57
|
+
if (typeof index === "number")
|
58
|
+
return index < that._length;
|
59
|
+
|
60
|
+
return (that[index] !== undefined)
|
61
|
+
},
|
62
|
+
put : function(index, start, value) {
|
63
|
+
if (typeof index === "number")
|
64
|
+
that.set(index, value);
|
65
|
+
else
|
66
|
+
that[index] = value;
|
67
|
+
},
|
68
|
+
unwrap : function() {
|
69
|
+
var bytes = Packages.java.lang.reflect.Array.newInstance(Packages.java.lang.Byte.TYPE, that._length);
|
70
|
+
Packages.java.lang.System.arraycopy(that._bytes, that._offset, bytes, 0, that._length);
|
71
|
+
return bytes;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
);
|
75
|
+
|
76
|
+
obj.__proto__ = that;
|
77
|
+
|
78
|
+
return obj;
|
79
|
+
}
|
80
|
+
|
81
|
+
// FIXME: disabling these because it broke several tests. figure out why.
|
82
|
+
//exports.ByteStringWrapper = wrapper;
|
83
|
+
//exports.ByteArrayWrapper = wrapper;
|