diff --git a/src/document/html/parser/general.c b/src/document/html/parser/general.c
index 9a854a8ff..c96b79cf5 100644
--- a/src/document/html/parser/general.c
+++ b/src/document/html/parser/general.c
@@ -362,7 +362,7 @@ imported:
return;
add_bytes_to_string(&code, html, *end - html);
- ecmascript_eval(interpreter, &code);
+ ecmascript_eval(interpreter, &code, &ret);
done_string(&code);
#if 0
diff --git a/src/document/renderer.c b/src/document/renderer.c
index 4ec6163c1..379460325 100644
--- a/src/document/renderer.c
+++ b/src/document/renderer.c
@@ -129,7 +129,7 @@ process_snippets(struct ecmascript_interpreter *interpreter,
if (*string->source != '^') {
/* Evaluate snippet */
- ecmascript_eval(interpreter, string);
+ ecmascript_eval(interpreter, string, NULL);
continue;
}
@@ -194,7 +194,7 @@ process_snippets(struct ecmascript_interpreter *interpreter,
if (fragment) {
struct string code = INIT_STRING(fragment->data, fragment->length);
- ecmascript_eval(interpreter, &code);
+ ecmascript_eval(interpreter, &code, NULL);
}
}
}
diff --git a/src/ecmascript/ecmascript.c b/src/ecmascript/ecmascript.c
index 1ec1a87e9..065c65c11 100644
--- a/src/ecmascript/ecmascript.c
+++ b/src/ecmascript/ecmascript.c
@@ -119,15 +119,15 @@ ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter)
void
ecmascript_eval(struct ecmascript_interpreter *interpreter,
- struct string *code)
+ struct string *code, struct string *ret)
{
if (!get_ecmascript_enable())
return;
assert(interpreter);
#ifdef CONFIG_ECMASCRIPT_SEE
- see_eval(interpreter, code);
+ see_eval(interpreter, code, ret);
#else
- spidermonkey_eval(interpreter, code);
+ spidermonkey_eval(interpreter, code, ret);
#endif
}
diff --git a/src/ecmascript/ecmascript.h b/src/ecmascript/ecmascript.h
index 58429e039..002683e17 100644
--- a/src/ecmascript/ecmascript.h
+++ b/src/ecmascript/ecmascript.h
@@ -18,6 +18,8 @@ struct view_state;
struct ecmascript_interpreter {
struct view_state *vs;
void *backend_data;
+ /* Used by document.write() */
+ struct string *ret;
time_t exec_start;
/* This is a cross-rerenderings accumulator of
@@ -57,7 +59,7 @@ void ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter);
void ecmascript_reset_state(struct view_state *vs);
-void ecmascript_eval(struct ecmascript_interpreter *interpreter, struct string *code);
+void ecmascript_eval(struct ecmascript_interpreter *interpreter, struct string *code, struct string *ret);
unsigned char *ecmascript_eval_stringback(struct ecmascript_interpreter *interpreter, struct string *code);
/* Returns -1 if undefined. */
int ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter, struct string *code);
diff --git a/src/ecmascript/see.c b/src/ecmascript/see.c
index d86548536..dbe1aeba0 100644
--- a/src/ecmascript/see.c
+++ b/src/ecmascript/see.c
@@ -96,7 +96,7 @@ see_put_interpreter(struct ecmascript_interpreter *interpreter)
void
see_eval(struct ecmascript_interpreter *interpreter,
- struct string *code)
+ struct string *code, struct string *ret)
{
struct SEE_interpreter *interp = interpreter->backend_data;
@@ -106,6 +106,7 @@ see_eval(struct ecmascript_interpreter *interpreter,
struct SEE_value result;
g->exec_start = time(NULL);
+ g->ret = ret;
SEE_TRY(interp, try_ctxt) {
SEE_Global_eval(interp, input, &result);
}
@@ -130,6 +131,7 @@ see_eval_stringback(struct ecmascript_interpreter *interpreter,
unsigned char *volatile string = NULL;
g->exec_start = time(NULL);
+ g->ret = NULL;
SEE_TRY(interp, try_ctxt) {
SEE_Global_eval(interp, input, &result);
if (SEE_VALUE_GET_TYPE(&result) != SEE_NULL)
@@ -158,6 +160,7 @@ see_eval_boolback(struct ecmascript_interpreter *interpreter,
SEE_int32_t volatile res = 0;
g->exec_start = time(NULL);
+ g->ret = NULL;
SEE_TRY(interp, try_ctxt) {
SEE_Global_eval(interp, input, &result);
/* history.back() returns SEE_NULL */
diff --git a/src/ecmascript/see.h b/src/ecmascript/see.h
index 8d75c6e28..0c7a08b59 100644
--- a/src/ecmascript/see.h
+++ b/src/ecmascript/see.h
@@ -10,7 +10,7 @@ void see_done();
void *see_get_interpreter(struct ecmascript_interpreter *interpreter);
void see_put_interpreter(struct ecmascript_interpreter *interpreter);
-void see_eval(struct ecmascript_interpreter *interpreter, struct string *code);
+void see_eval(struct ecmascript_interpreter *interpreter, struct string *code, struct string *ret);
unsigned char *see_eval_stringback(struct ecmascript_interpreter *interpreter, struct string *code);
int see_eval_boolback(struct ecmascript_interpreter *interpreter, struct string *code);
diff --git a/src/ecmascript/see/window.h b/src/ecmascript/see/window.h
index 0e52e6518..f7a7e4d13 100644
--- a/src/ecmascript/see/window.h
+++ b/src/ecmascript/see/window.h
@@ -17,6 +17,7 @@ struct js_window_object {
struct global_object {
struct SEE_interpreter interp;
struct js_window_object *win;
+ struct string *ret;
int exec_start;
int max_exec_time;
};
diff --git a/src/ecmascript/spidermonkey.c b/src/ecmascript/spidermonkey.c
index 5d2aad3f1..85d7e9d32 100644
--- a/src/ecmascript/spidermonkey.c
+++ b/src/ecmascript/spidermonkey.c
@@ -239,7 +239,7 @@ spidermonkey_put_interpreter(struct ecmascript_interpreter *interpreter)
void
spidermonkey_eval(struct ecmascript_interpreter *interpreter,
- struct string *code)
+ struct string *code, struct string *ret)
{
JSContext *ctx;
jsval rval;
@@ -247,6 +247,7 @@ spidermonkey_eval(struct ecmascript_interpreter *interpreter,
assert(interpreter);
ctx = interpreter->backend_data;
setup_safeguard(interpreter, ctx);
+ interpreter->ret = ret;
JS_EvaluateScript(ctx, JS_GetGlobalObject(ctx),
code->source, code->length, "", 0, &rval);
}
@@ -262,6 +263,7 @@ spidermonkey_eval_stringback(struct ecmascript_interpreter *interpreter,
assert(interpreter);
ctx = interpreter->backend_data;
setup_safeguard(interpreter, ctx);
+ interpreter->ret = NULL;
if (JS_EvaluateScript(ctx, JS_GetGlobalObject(ctx),
code->source, code->length, "", 0, &rval)
== JS_FALSE) {
@@ -287,6 +289,7 @@ spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter,
assert(interpreter);
ctx = interpreter->backend_data;
setup_safeguard(interpreter, ctx);
+ interpreter->ret = NULL;
ret = JS_EvaluateScript(ctx, JS_GetGlobalObject(ctx),
code->source, code->length, "", 0, &rval);
if (ret == 2) { /* onClick="history.back()" */
diff --git a/src/ecmascript/spidermonkey.h b/src/ecmascript/spidermonkey.h
index b9f2b6352..e0920229d 100644
--- a/src/ecmascript/spidermonkey.h
+++ b/src/ecmascript/spidermonkey.h
@@ -10,7 +10,7 @@ void spidermonkey_done();
void *spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter);
void spidermonkey_put_interpreter(struct ecmascript_interpreter *interpreter);
-void spidermonkey_eval(struct ecmascript_interpreter *interpreter, struct string *code);
+void spidermonkey_eval(struct ecmascript_interpreter *interpreter, struct string *code, struct string *ret);
unsigned char *spidermonkey_eval_stringback(struct ecmascript_interpreter *interpreter, struct string *code);
int spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter, struct string *code);