void console_log_xsbug(xsMachine* the) { xsIntegerValue c = xsToInteger(xsArgc), i; xsBooleanValue space = 0; xsVars(4); console_log_depth++; for (i = 0; i < c; i++) { if (space) xsLog(" "); else space = 1; switch (xsTypeOf(xsArg(i))) { case xsUndefinedType: case xsNullType: case xsBooleanType: case xsIntegerType: case xsNumberType: xsLog("%s", xsToString(xsArg(i))); break; case xsSymbolType: xsResult = xsCall1(xsGlobal, xsID("String"), xsArg(i)); xsLog("%s", xsToString(xsResult)); break; case xsStringType: case xsStringXType: if ((console_log_depth == 1) && (i == 0)) xsLog("%s", xsToString(xsArg(i))); else xsLog("'%s'", xsToString(xsArg(i))); break; case xsReferenceType: if (console_log_depth < 3) { xsBooleanValue comma = 0; if (xsHas(xsArg(i), xsID("length"))) { xsIntegerValue length = xsToInteger(xsGet(xsArg(i), xsID("length"))), index; xsLog("["); for (index = 0; index < length; index++) { xsVar(1) = xsGet(xsArg(i), (xsIndex)index); if (comma) xsLog(","); else comma = 1; xsLog(" "); fxPush(xsVar(1)); fxPushCount(the, 1); fxPush(xsThis); fxPush(xsFunction); fxCall(the); } xsLog(" ]"); } else { xsLog("{"); xsVar(0) = xsEnumerate(xsArg(i)); for (;;) { xsVar(1) = xsCall0(xsVar(0), xsID("next")); if (xsTest(xsGet(xsVar(1), xsID("done")))) break; xsVar(2) = xsGet(xsVar(1), xsID("value")); xsVar(3) = xsGetAt(xsArg(i), xsVar(2)); if (comma) xsLog(","); else comma = 1; xsLog(" %s: ", xsToString(xsVar(2))); fxPush(xsVar(3)); fxPushCount(the, 1); fxPush(xsThis); fxPush(xsFunction); fxCall(the); } xsLog(" }"); } } else xsLog("%s", xsToString(xsArg(i))); break; } } console_log_depth--; if (!console_log_depth) xsLog("\n"); }
void xs_console_log(xsMachine* the) { xsIntegerValue c = xsToInteger(xsArgc), i; xsBooleanValue space = 0; xsBooleanValue comma = 0; xsBooleanValue nonl = 0; int options = 0; FILE *console_out = stdout; xsVars(4); console_log_depth++; for (i = 0; i < c; i++) { if (space && !nonl) CONSOLE_OUT("\n"); else space = 1; switch (xsTypeOf(xsArg(i))) { case xsUndefinedType: case xsNullType: case xsBooleanType: case xsIntegerType: case xsNumberType: CONSOLE_OUT("%s", xsToString(xsArg(i))); break; case xsSymbolType: xsResult = xsCall1(xsGlobal, xsID("String"), xsArg(i)); CONSOLE_OUT("%s", xsToString(xsResult)); break; case xsStringType: case xsStringXType: if (i == 0 || options) { const char *opt = xsToString(xsArg(i)); options = 0; if (strcmp(opt, "-n") == 0) { nonl++; options++; } else if (strcmp(opt, "-stderr") == 0) { console_out = stderr; options++; } else if (strcmp(opt, "-stdout") == 0) { console_out = stdout; options++; } else if (strncmp(opt, "-", 1) == 0) /* end of the option args */ break; if (options) { space = 0; break; } } if (console_log_depth == 1) CONSOLE_OUT("%s", xsToString(xsArg(i))); else CONSOLE_OUT("\"%s\"", xsToString(xsArg(i))); break; case xsReferenceType: if (xsIsInstanceOf(xsArg(i), xsFunctionPrototype)) { CONSOLE_OUT("function(...) { ... }"); } else if (xsIsInstanceOf(xsArg(i), xsArrayPrototype)) { xsGet(xsVar(0), xsArg(i), xsID("length")); xsIntegerValue length = xsToInteger(xsVar(0)), index; CONSOLE_OUT("[\n"); for (index = 0; index < length; index++) { xsGet(xsVar(1), xsArg(i), (xsIndex)index); if (comma) CONSOLE_OUT(",\n"); else comma = 1; indent(the, console_out, 0); fxPush(xsVar(1)); fxPushCount(the, 1); fxPush(xsThis); fxPush(xsFunction); fxCall(the); } CONSOLE_OUT("\n"); indent(the, console_out, -1); CONSOLE_OUT("]"); } else { CONSOLE_OUT( "{\n"); xsVar(0) = xsEnumerate(xsArg(i)); for (;;) { xsVar(1) = xsCall0(xsVar(0), xsID("next")); xsGet(xsVar(2), xsVar(1), xsID("done")); if (xsTest(xsVar(2))) break; xsGet(xsVar(2), xsVar(1), xsID("value")); xsGetAt(xsVar(3), xsArg(i), xsVar(2)); if (comma) CONSOLE_OUT( ",\n"); else comma = 1; indent(the, console_out, 0); CONSOLE_OUT("%s: ", xsToString(xsVar(2))); fxPush(xsVar(3)); fxPushCount(the, 1); fxPush(xsThis); fxPush(xsFunction); fxCall(the); } CONSOLE_OUT("\n"); indent(the, console_out, -1); CONSOLE_OUT("}"); } break; } } console_log_depth--; if (!console_log_depth && !nonl) CONSOLE_OUT("\n"); }