28 |
#include <jsapi.h> |
#include <jsapi.h> |
29 |
#include <jsarena.h> |
#include <jsarena.h> |
30 |
#include <jsatom.h> |
#include <jsatom.h> |
31 |
|
#include <jsemit.h> |
32 |
#include <jsexn.h> |
#include <jsexn.h> |
33 |
#include <jsfun.h> |
#include <jsfun.h> |
34 |
#include <jsinterp.h> |
#include <jsinterp.h> |
315 |
Stream_write_string(f, ", "); |
Stream_write_string(f, ", "); |
316 |
} |
} |
317 |
JSAtom * param = JS_LOCAL_NAME_TO_ATOM(local_names[i]); |
JSAtom * param = JS_LOCAL_NAME_TO_ATOM(local_names[i]); |
318 |
|
if (param == NULL) { |
319 |
|
fatal("unsupported parameter type for function: %s", file_id); |
320 |
|
} |
321 |
print_string_atom(param, f); |
print_string_atom(param, f); |
322 |
} |
} |
323 |
JS_FinishArenaPool(&pool); |
JS_FinishArenaPool(&pool); |
336 |
} |
} |
337 |
|
|
338 |
static void instrument_function_call(JSParseNode * node, Stream * f) { |
static void instrument_function_call(JSParseNode * node, Stream * f) { |
339 |
if (node->pn_head->pn_type == TOK_FUNCTION) { |
JSParseNode * function_node = node->pn_head; |
340 |
/* it's a generator expression */ |
if (function_node->pn_type == TOK_FUNCTION) { |
341 |
JSParseNode * function_node = node->pn_head; |
JSObject * object = function_node->pn_funpob->object; |
342 |
JSParseNode * lexical_scope_node = function_node->pn_body; |
assert(JS_ObjectIsFunction(context, object)); |
343 |
assert(lexical_scope_node->pn_type == TOK_LEXICALSCOPE); |
JSFunction * function = (JSFunction *) JS_GetPrivate(context, object); |
344 |
assert(lexical_scope_node->pn_arity == PN_NAME); |
assert(function); |
345 |
JSParseNode * for_node = lexical_scope_node->pn_body; |
assert(object == &function->object); |
346 |
assert(for_node->pn_type == TOK_FOR); |
|
347 |
assert(for_node->pn_arity == PN_BINARY); |
if (function_node->pn_flags & TCF_GENEXP_LAMBDA) { |
348 |
JSParseNode * if_node = NULL; |
/* it's a generator expression */ |
349 |
JSParseNode * semi_node; |
JSParseNode * lexical_scope_node = function_node->pn_body; |
350 |
switch (for_node->pn_right->pn_type) { |
assert(lexical_scope_node->pn_type == TOK_LEXICALSCOPE); |
351 |
case TOK_SEMI: |
assert(lexical_scope_node->pn_arity == PN_NAME); |
352 |
semi_node = for_node->pn_right; |
JSParseNode * for_node = lexical_scope_node->pn_body; |
353 |
break; |
assert(for_node->pn_type == TOK_FOR); |
354 |
case TOK_IF: |
assert(for_node->pn_arity == PN_BINARY); |
355 |
if_node = for_node->pn_right; |
JSParseNode * if_node = NULL; |
356 |
assert(if_node->pn_arity == PN_TERNARY); |
JSParseNode * semi_node; |
357 |
semi_node = if_node->pn_kid2; |
switch (for_node->pn_right->pn_type) { |
358 |
assert(semi_node->pn_type == TOK_SEMI); |
case TOK_SEMI: |
359 |
break; |
semi_node = for_node->pn_right; |
360 |
default: |
break; |
361 |
abort(); |
case TOK_IF: |
362 |
break; |
if_node = for_node->pn_right; |
363 |
|
assert(if_node->pn_arity == PN_TERNARY); |
364 |
|
semi_node = if_node->pn_kid2; |
365 |
|
assert(semi_node->pn_type == TOK_SEMI); |
366 |
|
break; |
367 |
|
default: |
368 |
|
abort(); |
369 |
|
break; |
370 |
|
} |
371 |
|
assert(semi_node->pn_arity == PN_UNARY); |
372 |
|
JSParseNode * yield_node = semi_node->pn_kid; |
373 |
|
assert(yield_node->pn_type == TOK_YIELD); |
374 |
|
Stream_write_char(f, '('); |
375 |
|
instrument_expression(yield_node->pn_kid, f); |
376 |
|
Stream_write_char(f, ' '); |
377 |
|
output_for_in(for_node, f); |
378 |
|
if (if_node) { |
379 |
|
Stream_write_string(f, " if ("); |
380 |
|
instrument_expression(if_node->pn_kid1, f); |
381 |
|
Stream_write_char(f, ')'); |
382 |
|
} |
383 |
|
Stream_write_char(f, ')'); |
384 |
|
return; |
385 |
} |
} |
386 |
assert(semi_node->pn_arity == PN_UNARY); |
else { |
387 |
JSParseNode * yield_node = semi_node->pn_kid; |
Stream_write_char(f, '('); |
388 |
assert(yield_node->pn_type == TOK_YIELD); |
instrument_expression(function_node, f); |
|
Stream_write_char(f, '('); |
|
|
instrument_expression(yield_node->pn_kid, f); |
|
|
Stream_write_char(f, ' '); |
|
|
output_for_in(for_node, f); |
|
|
if (if_node) { |
|
|
Stream_write_string(f, " if ("); |
|
|
instrument_expression(if_node->pn_kid1, f); |
|
389 |
Stream_write_char(f, ')'); |
Stream_write_char(f, ')'); |
390 |
} |
} |
|
Stream_write_char(f, ')'); |
|
391 |
} |
} |
392 |
else { |
else { |
393 |
instrument_expression(node->pn_head, f); |
instrument_expression(function_node, f); |
394 |
Stream_write_char(f, '('); |
} |
395 |
for (struct JSParseNode * p = node->pn_head->pn_next; p != NULL; p = p->pn_next) { |
Stream_write_char(f, '('); |
396 |
if (p != node->pn_head->pn_next) { |
for (struct JSParseNode * p = function_node->pn_next; p != NULL; p = p->pn_next) { |
397 |
Stream_write_string(f, ", "); |
if (p != node->pn_head->pn_next) { |
398 |
} |
Stream_write_string(f, ", "); |
|
instrument_expression(p, f); |
|
399 |
} |
} |
400 |
Stream_write_char(f, ')'); |
instrument_expression(p, f); |
401 |
} |
} |
402 |
|
Stream_write_char(f, ')'); |
403 |
} |
} |
404 |
|
|
405 |
static void instrument_declarations(JSParseNode * list, Stream * f) { |
static void instrument_declarations(JSParseNode * list, Stream * f) { |