|
|
@ -0,0 +1,77 @@
|
|
|
1
|
#include <stdio.h>
|
|
|
2
|
#include <stdlib.h>
|
|
|
3
|
#include <string.h>
|
|
|
4
|
|
|
|
5
|
#include <JavaScriptCore/JavaScript.h>
|
|
|
6
|
|
|
|
7
|
#define CONSOLE_LOG_BUF_SIZE 1000
|
|
|
8
|
|
|
|
9
|
char console_log_buf[CONSOLE_LOG_BUF_SIZE];
|
|
|
10
|
|
|
|
11
|
JSStringRef to_string(JSContextRef ctx, JSValueRef val);
|
|
|
12
|
|
|
|
13
|
JSValueRef console_log(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) {
|
|
|
14
|
for (int i = 0; i < argumentCount; i++) {
|
|
|
15
|
if (i > 0) {
|
|
|
16
|
putchar(' ');
|
|
|
17
|
}
|
|
|
18
|
|
|
|
19
|
JSStringRef str = to_string(ctx, arguments[i]);
|
|
|
20
|
JSStringGetUTF8CString(str, console_log_buf, CONSOLE_LOG_BUF_SIZE);
|
|
|
21
|
printf("%s", console_log_buf);
|
|
|
22
|
}
|
|
|
23
|
putchar('\n');
|
|
|
24
|
|
|
|
25
|
return JSValueMakeUndefined(ctx);
|
|
|
26
|
}
|
|
|
27
|
|
|
|
28
|
void register_global_function(JSContextRef ctx, char *name, JSObjectCallAsFunctionCallback handler) {
|
|
|
29
|
JSObjectRef global_obj = JSContextGetGlobalObject(ctx);
|
|
|
30
|
|
|
|
31
|
JSStringRef fn_name = JSStringCreateWithUTF8CString(name);
|
|
|
32
|
JSObjectRef fn_obj = JSObjectMakeFunctionWithCallback(ctx, fn_name, handler);
|
|
|
33
|
|
|
|
34
|
JSObjectSetProperty(ctx, global_obj, fn_name, fn_obj, kJSPropertyAttributeNone, NULL);
|
|
|
35
|
}
|
|
|
36
|
|
|
|
37
|
int main(int argc, char **argv) {
|
|
|
38
|
JSGlobalContextRef ctx = JSGlobalContextCreate(NULL);
|
|
|
39
|
|
|
|
40
|
JSStringRef nameRef = JSStringCreateWithUTF8CString("jsc-test");
|
|
|
41
|
JSGlobalContextSetName(ctx, nameRef);
|
|
|
42
|
|
|
|
43
|
JSObjectRef global_obj = JSContextGetGlobalObject(ctx);
|
|
|
44
|
|
|
|
45
|
register_global_function(ctx, "CONSOLE_LOG", console_log);
|
|
|
46
|
|
|
|
47
|
JSStringRef source = JSStringCreateWithUTF8CString("<inline>");
|
|
|
48
|
JSStringRef script;
|
|
|
49
|
if (argc == 0) {
|
|
|
50
|
script = JSStringCreateWithUTF8CString("CONSOLE_LOG(\"Hello, World!\");");
|
|
|
51
|
} else {
|
|
|
52
|
script = JSStringCreateWithUTF8CString(argv[1]);
|
|
|
53
|
}
|
|
|
54
|
JSValueRef res = JSEvaluateScript(ctx, script, global_obj, source, 0, NULL);
|
|
|
55
|
|
|
|
56
|
char res_buf[1000];
|
|
|
57
|
res_buf[0] = '\0';
|
|
|
58
|
JSStringRef res_str = to_string(ctx, res);
|
|
|
59
|
JSStringGetUTF8CString(res_str, res_buf, 1000);
|
|
|
60
|
printf("%s\n", res_buf);
|
|
|
61
|
}
|
|
|
62
|
|
|
|
63
|
JSStringRef to_string(JSContextRef ctx, JSValueRef val) {
|
|
|
64
|
if (JSValueIsUndefined(ctx, val)) {
|
|
|
65
|
return JSStringCreateWithUTF8CString("undefined");
|
|
|
66
|
} else if (JSValueIsNull(ctx, val)) {
|
|
|
67
|
return JSStringCreateWithUTF8CString("null");
|
|
|
68
|
} else {
|
|
|
69
|
JSStringRef to_string_name = JSStringCreateWithUTF8CString("toString");
|
|
|
70
|
JSObjectRef obj = JSValueToObject(ctx, val, NULL);
|
|
|
71
|
JSValueRef to_string = JSObjectGetProperty(ctx, obj, to_string_name, NULL);
|
|
|
72
|
JSObjectRef to_string_obj = JSValueToObject(ctx, to_string, NULL);
|
|
|
73
|
JSValueRef obj_val = JSObjectCallAsFunction(ctx, to_string_obj, obj, 0, NULL, NULL);
|
|
|
74
|
|
|
|
75
|
return JSValueToStringCopy(ctx, obj_val, NULL);
|
|
|
76
|
}
|
|
|
77
|
}
|