// Debug an object with extra verbosity, displaying non-enumerable properties. void fh_debug_verbose(FILE *stream, js_val *val, int indent) { switch (val->type) { case T_BOOLEAN: fprintf(stream, "Boolean: (%s)", !val->boolean.val ? "false" : "true"); break; case T_NUMBER: debug_num(stream, val); break; case T_STRING: cfprintf(stream, ANSI_YELLOW, "String: '%s'", val->string.ptr); break; case T_NULL: cfprintf(stream, ANSI_GRAY, "null"); break; case T_UNDEF: cfprintf(stream, ANSI_GRAY, "undefined"); break; case T_OBJECT: if (IS_ARR(val)) fprintf(stream, "Array: "); else if (IS_FUNC(val)) cfprintf(stream, ANSI_BLUE, "Function: "); else fprintf(stream, "Object: "); break; } if (IS_OBJ(val)) debug_obj(stream, val, indent, true); fprintf(stream, "\n"); }
void fh_debug(FILE *stream, js_val *val, int indent, bool newline) { switch (val->type) { case T_BOOLEAN: fprintf(stream, "%s", !val->boolean.val ? "false" : "true"); break; case T_NUMBER: debug_num(stream, val); break; case T_STRING: if (fh->opt_interactive) cfprintf(stream, ANSI_YELLOW, "'%s'", val->string.ptr); else fprintf(stream, "%s", val->string.ptr); break; case T_NULL: cfprintf(stream, ANSI_GRAY, "null"); break; case T_UNDEF: cfprintf(stream, ANSI_GRAY, "undefined"); break; case T_OBJECT: if (IS_ARR(val)) debug_arr(stream, val, indent); else if (IS_FUNC(val)) cfprintf(stream, ANSI_BLUE, "[Function]"); else if (IS_DATE(val)) fprintf(stream, "[Date %ld]", (long)val->object.primitive->number.val); else debug_obj(stream, val, indent, false); break; } if (newline) fprintf(stream, "\n"); }
ImmT c_rt_lib0exec(ImmT ___nl__func, ImmT *___ref___arrI){ if(!IS_HASH(___nl__func) && !IS_ARRHASH(___nl__func)) nl_die_internal("function struct must by a hash", NAME(___nl__func)); NlFunction *func = (NlFunction*)c_rt_lib0hash_get_value_dec(___nl__func, c_rt_lib0string_new("name")); if(!IS_FUNC(func)) nl_die_internal("can call only function: %s", NAME(func)); if(!IS_ARR(*___ref___arrI)) nl_die_internal("expected array: %s", NAME(*___ref___arrI)); NlArray *arr = priv_arr_to_change(___ref___arrI); ImmT (*f)(int n, ImmT *arg) = func->f; dec_ref((ImmT*)func); return (*f)(arr->size, arr->arr); }