mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
[smjs] Compilation fixes.
This commit is contained in:
parent
3026d8f25e
commit
f692389917
@ -22,6 +22,8 @@
|
|||||||
#include "util/file.h"
|
#include "util/file.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
|
||||||
|
#include <js/CompilationAndEvaluation.h>
|
||||||
|
#include <js/SourceText.h>
|
||||||
|
|
||||||
#define SMJS_HOOKS_FILENAME "hooks.js"
|
#define SMJS_HOOKS_FILENAME "hooks.js"
|
||||||
|
|
||||||
@ -192,18 +194,27 @@ smjs_do_file(char *path)
|
|||||||
opts.setNoScriptRval(true);
|
opts.setNoScriptRval(true);
|
||||||
JS::RootedValue rval(smjs_ctx);
|
JS::RootedValue rval(smjs_ctx);
|
||||||
|
|
||||||
JS_BeginRequest(smjs_ctx);
|
JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object);
|
||||||
JSCompartment *prev = JS_EnterCompartment(smjs_ctx, smjs_elinks_object);
|
|
||||||
|
|
||||||
if (!add_file_to_string(&script, path)
|
if (add_file_to_string(&script, path)) {
|
||||||
|| false == JS::Evaluate(smjs_ctx, opts,
|
JS::SourceText<mozilla::Utf8Unit> srcBuf;
|
||||||
script.source, script.length, &rval)) {
|
|
||||||
|
if (!srcBuf.init(smjs_ctx, script.source, script.length, JS::SourceOwnership::Borrowed)) {
|
||||||
|
alert_smjs_error("error loading script file");
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
if (!JS::Evaluate(smjs_ctx, opts,
|
||||||
|
srcBuf, &rval)) {
|
||||||
|
alert_smjs_error("error loading script file");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
alert_smjs_error("error loading script file");
|
alert_smjs_error("error loading script file");
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_LeaveCompartment(smjs_ctx, prev);
|
JS::LeaveRealm(smjs_ctx, prev);
|
||||||
JS_EndRequest(smjs_ctx);
|
|
||||||
done_string(&script);
|
done_string(&script);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -252,7 +263,8 @@ init_smjs(struct module *module)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::SetWarningReporter(smjs_ctx, error_reporter);
|
/// TODO
|
||||||
|
/// JS::SetWarningReporter(smjs_ctx, error_reporter);
|
||||||
|
|
||||||
smjs_init_global_object();
|
smjs_init_global_object();
|
||||||
|
|
||||||
@ -299,65 +311,15 @@ JSString *
|
|||||||
utf8_to_jsstring(JSContext *ctx, const char *str, int length)
|
utf8_to_jsstring(JSContext *ctx, const char *str, int length)
|
||||||
{
|
{
|
||||||
size_t in_bytes;
|
size_t in_bytes;
|
||||||
const char *in_end;
|
|
||||||
size_t utf16_alloc;
|
|
||||||
char16_t *utf16;
|
|
||||||
size_t utf16_used;
|
|
||||||
JSString *jsstr;
|
|
||||||
|
|
||||||
if (length == -1)
|
if (length == -1)
|
||||||
in_bytes = strlen(str);
|
in_bytes = strlen(str);
|
||||||
else
|
else
|
||||||
in_bytes = length;
|
in_bytes = length;
|
||||||
|
|
||||||
/* Each byte of input can become at most one UTF-16 unit.
|
JS::ConstUTF8CharsZ utf8chars(str, in_bytes);
|
||||||
* Check whether the multiplication could overflow. */
|
|
||||||
assert(!needs_utf16_surrogates(UCS_REPLACEMENT_CHARACTER));
|
|
||||||
if (in_bytes > ((size_t) -1) / sizeof(char16_t)) {
|
|
||||||
#ifdef HAVE_JS_REPORTALLOCATIONOVERFLOW
|
|
||||||
JS_ReportAllocationOverflow(ctx);
|
|
||||||
#else
|
|
||||||
JS_ReportOutOfMemory(ctx);
|
|
||||||
#endif
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
utf16_alloc = in_bytes;
|
|
||||||
/* Use malloc because SpiderMonkey will handle the memory after
|
|
||||||
* this routine finishes. */
|
|
||||||
utf16 = malloc(utf16_alloc * sizeof(char16_t));
|
|
||||||
if (utf16 == NULL) {
|
|
||||||
JS_ReportOutOfMemory(ctx);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
in_end = str + in_bytes;
|
return JS_NewStringCopyUTF8Z(ctx, utf8chars);
|
||||||
|
|
||||||
utf16_used = 0;
|
|
||||||
for (;;) {
|
|
||||||
unicode_val_T unicode;
|
|
||||||
|
|
||||||
unicode = utf8_to_unicode((char **) &str, in_end);
|
|
||||||
if (unicode == UCS_NO_CHAR)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (needs_utf16_surrogates(unicode)) {
|
|
||||||
assert(utf16_alloc - utf16_used >= 2);
|
|
||||||
if_assert_failed { free(utf16); return NULL; }
|
|
||||||
utf16[utf16_used++] = get_utf16_high_surrogate(unicode);
|
|
||||||
utf16[utf16_used++] = get_utf16_low_surrogate(unicode);
|
|
||||||
} else {
|
|
||||||
assert(utf16_alloc - utf16_used >= 1);
|
|
||||||
if_assert_failed { free(utf16); return NULL; }
|
|
||||||
utf16[utf16_used++] = unicode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jsstr = JS_NewUCString(ctx, utf16, utf16_used);
|
|
||||||
/* Do not free if JS_NewUCString was successful because it takes over
|
|
||||||
* handling of the memory. */
|
|
||||||
if (jsstr == NULL) free(utf16);
|
|
||||||
|
|
||||||
return jsstr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Convert a char16_t array to UTF-8 and append it to struct string.
|
/** Convert a char16_t array to UTF-8 and append it to struct string.
|
||||||
|
@ -30,8 +30,7 @@ static JSObject *
|
|||||||
smjs_get_global_object(void)
|
smjs_get_global_object(void)
|
||||||
{
|
{
|
||||||
assert(smjs_ctx);
|
assert(smjs_ctx);
|
||||||
JSAutoRequest ar(smjs_ctx);
|
JS::RealmOptions opts;
|
||||||
JS::CompartmentOptions opts;
|
|
||||||
|
|
||||||
// if (!JS::InitSelfHostedCode(smjs_ctx)) {
|
// if (!JS::InitSelfHostedCode(smjs_ctx)) {
|
||||||
// return NULL;
|
// return NULL;
|
||||||
@ -41,9 +40,9 @@ smjs_get_global_object(void)
|
|||||||
|
|
||||||
if (!jsobj) return NULL;
|
if (!jsobj) return NULL;
|
||||||
|
|
||||||
new JSAutoCompartment(smjs_ctx, jsobj);
|
new JSAutoRealm(smjs_ctx, jsobj);
|
||||||
|
|
||||||
JS_InitStandardClasses(smjs_ctx, jsobj);
|
JS::InitRealmStandardClasses(smjs_ctx);
|
||||||
|
|
||||||
return jsobj;
|
return jsobj;
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,7 @@ script_hook_url(va_list ap, void *data)
|
|||||||
|
|
||||||
if (*url == NULL) return EVENT_HOOK_STATUS_NEXT;
|
if (*url == NULL) return EVENT_HOOK_STATUS_NEXT;
|
||||||
|
|
||||||
JS_BeginRequest(smjs_ctx);
|
JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object);
|
||||||
JSCompartment *prev = JS_EnterCompartment(smjs_ctx, smjs_elinks_object);
|
|
||||||
|
|
||||||
smjs_ses = ses;
|
smjs_ses = ses;
|
||||||
args[2].setString(JS_NewStringCopyZ(smjs_ctx, *url));
|
args[2].setString(JS_NewStringCopyZ(smjs_ctx, *url));
|
||||||
@ -51,8 +50,7 @@ script_hook_url(va_list ap, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
smjs_ses = NULL;
|
smjs_ses = NULL;
|
||||||
JS_LeaveCompartment(smjs_ctx, prev);
|
JS::LeaveRealm(smjs_ctx, prev);
|
||||||
JS_EndRequest(smjs_ctx);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -67,8 +65,7 @@ script_hook_pre_format_html(va_list ap, void *data)
|
|||||||
JS::Value args[4];
|
JS::Value args[4];
|
||||||
JS::RootedValue r_rval(smjs_ctx);
|
JS::RootedValue r_rval(smjs_ctx);
|
||||||
|
|
||||||
JS_BeginRequest(smjs_ctx);
|
JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object);
|
||||||
JSCompartment *prev = JS_EnterCompartment(smjs_ctx, smjs_elinks_object);
|
|
||||||
|
|
||||||
evhook_use_params(ses && cached);
|
evhook_use_params(ses && cached);
|
||||||
|
|
||||||
@ -99,8 +96,7 @@ script_hook_pre_format_html(va_list ap, void *data)
|
|||||||
|
|
||||||
|
|
||||||
end:
|
end:
|
||||||
JS_LeaveCompartment(smjs_ctx, prev);
|
JS::LeaveRealm(smjs_ctx, prev);
|
||||||
JS_EndRequest(smjs_ctx);
|
|
||||||
smjs_ses = NULL;
|
smjs_ses = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS:
|
|||||||
struct string event_name = NULL_STRING;
|
struct string event_name = NULL_STRING;
|
||||||
JSObject *jsobj = &hvp.toObject();
|
JSObject *jsobj = &hvp.toObject();
|
||||||
|
|
||||||
if (false == JS_ObjectIsFunction(ctx, jsobj))
|
if (false == JS_ObjectIsFunction(jsobj))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!init_string(&event_name)) return false;
|
if (!init_string(&event_name)) return false;
|
||||||
|
@ -44,9 +44,36 @@ enum terminal_prop {
|
|||||||
TERMINAL_TAB,
|
TERMINAL_TAB,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
terminal_get_property_tab(JSContext *ctx, unsigned int argc, JS::Value *vp)
|
||||||
|
{
|
||||||
|
#ifdef ECMASCRIPT_DEBUG
|
||||||
|
fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__);
|
||||||
|
#endif
|
||||||
|
JS::CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
JS::RootedObject hobj(ctx, &args.thisv().toObject());
|
||||||
|
|
||||||
|
struct terminal *term;
|
||||||
|
|
||||||
|
term = JS_GetInstancePrivate(ctx, hobj,
|
||||||
|
(JSClass *) &terminal_class, NULL);
|
||||||
|
if (!term) return false; /* already detached */
|
||||||
|
|
||||||
|
JSObject *obj = smjs_get_session_array_object(term);
|
||||||
|
|
||||||
|
if (obj) {
|
||||||
|
args.rval().setObject(*obj);
|
||||||
|
} else {
|
||||||
|
args.rval().setUndefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static const JSPropertySpec terminal_props[] = {
|
static const JSPropertySpec terminal_props[] = {
|
||||||
{ "tab", TERMINAL_TAB, JSPROP_ENUMERATE | JSPROP_READONLY },
|
JS_PSG("tab", terminal_get_property_tab, JSPROP_ENUMERATE),
|
||||||
{ NULL }
|
JS_PS_END
|
||||||
};
|
};
|
||||||
|
|
||||||
/* @terminal_class.getProperty */
|
/* @terminal_class.getProperty */
|
||||||
@ -210,7 +237,7 @@ static const JSClassOps terminal_array_ops = {
|
|||||||
nullptr, // call
|
nullptr, // call
|
||||||
nullptr, // hasInstance
|
nullptr, // hasInstance
|
||||||
nullptr, // construct
|
nullptr, // construct
|
||||||
nullptr // trace JS_GlobalObjectTraceHook
|
JS_GlobalObjectTraceHook
|
||||||
};
|
};
|
||||||
|
|
||||||
static const JSClass terminal_array_class = {
|
static const JSClass terminal_array_class = {
|
||||||
|
Loading…
Reference in New Issue
Block a user