This closes #142 issue on Github.
size_t continuation_size, nxt_bool_t ctor)
{
size_t size;
+ u_char *continuation;
nxt_uint_t n;
njs_value_t *value, *bound;
njs_native_frame_t *frame;
frame->nargs = function->args_offset + nargs;
frame->ctor = ctor;
- value = (njs_value_t *) (njs_continuation(frame) + continuation_size);
+ continuation = (u_char *) frame + NJS_NATIVE_FRAME_SIZE;
+
+ if (continuation_size > 0) {
+ frame->continuation = (njs_continuation_t *) continuation;
+ }
+
+ value = (njs_value_t *) (continuation + continuation_size);
frame->arguments = value;
bound = function->bound;
do {
previous = frame->previous;
+ if (frame->continuation != NULL) {
+ vm->current = frame->continuation->return_address;
+ }
+
/* GC: free frame->local, etc. */
if (frame->size != 0) {
#define njs_vm_continuation(vm) \
- (void *) njs_continuation((vm)->top_frame)
-
-#define njs_continuation(frame) \
- ((u_char *) frame + NJS_NATIVE_FRAME_SIZE)
+ (void *) ((vm)->top_frame->continuation)
#define njs_continuation_size(size) \
nxt_align_size(sizeof(size), sizeof(njs_value_t))
njs_function_t *function;
njs_native_frame_t *previous;
+ njs_continuation_t *continuation;
+
njs_value_t *arguments;
njs_object_t *arguments_object;
{ nxt_string("function f (x){ return x**2}; f(2\n)"),
nxt_string("4") },
+ { nxt_string("var fn = Function.prototype.call; fn.call(() => 1)"),
+ nxt_string("1") },
+
+ { nxt_string("var fn = Function.prototype.call; fn.call(fn, () => 1)"),
+ nxt_string("1") },
+
+ { nxt_string("var fn = Function.prototype.call; fn.call(fn, fn, () => 1)"),
+ nxt_string("1") },
+
+ { nxt_string("eval.call.call(Number)"),
+ nxt_string("0") },
+
+ { nxt_string("URIError.apply.apply(RegExp)"),
+ nxt_string("/(?:)/") },
+
+ { nxt_string("[0].some(function(){return Array.call.bind(isNaN)}())"),
+ nxt_string("false") },
+
/* Recursive factorial. */
{ nxt_string("function f(a) {"