Просмотр исходного кода

Add a neat little example of using JavaScriptCore

So "much" C recently...
Lucas Stadler лет назад: 9
Родитель
Сommit
c630cf6b6b
1 измененных файлов с 77 добавлено и 0 удалено
  1. 77 0
      c/jsc-test.c

+ 77 - 0
c/jsc-test.c

@ -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
}