blob: 34ef738dc89cd5c18e2abb3711bd076040c9bd4b [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#include <cstring>
#include "XpcomDebug.h"
#include "JavaObject.h"
#ifdef _WINDOWS
// avoid deprecation warnings for strncpy
#define strncpy(d,s,c) strncpy_s((d),(c),(s),(c))
#include <cstdarg>
inline int snprintf(char* buf, size_t buflen, const char* fmt, ...) {
va_list args;
va_start(args, fmt);
int n = _vsnprintf_s(buf, buflen, buflen, fmt, args);
va_end(args);
return n;
}
#endif
std::string dumpJsVal(JSContext* ctx, jsval v) {
char buf[70];
if (v == JSVAL_VOID) {
strncpy(buf, "undef", sizeof(buf));
} else if (v == JSVAL_NULL) {
strncpy(buf, "null", sizeof(buf));
} else {
switch (JSVAL_TAG(v)) {
case JSVAL_OBJECT:
{
JSObject* obj = JSVAL_TO_OBJECT(v);
if (JavaObject::isJavaObject(ctx, obj)) {
int oid = JavaObject::getObjectId(ctx, obj);
snprintf(buf, sizeof(buf), "JavaObj(%d)", oid);
} else {
JSClass* jsClass = JS_GET_CLASS(ctx, obj);
const char* name = jsClass->name ? jsClass->name : "<null>";
snprintf(buf, sizeof(buf), "Object(%.20s @ %p)", name, obj);
}
break;
}
case JSVAL_INT:
snprintf(buf, sizeof(buf), "int(%d)", JSVAL_TO_INT(v));
break;
case JSVAL_DOUBLE:
snprintf(buf, sizeof(buf), "double(%lf)", *JSVAL_TO_DOUBLE(v));
break;
case JSVAL_STRING:
{
JSString* str = JSVAL_TO_STRING(v);
size_t len = JS_GetStringLength(str);
const char* continued = "";
if (len > 20) {
len = 20;
continued = "...";
}
// TODO: trashes Unicode
snprintf(buf, sizeof(buf), "string(%.*s%s)", static_cast<int>(len),
JS_GetStringBytes(str), continued);
break;
}
case JSVAL_BOOLEAN:
snprintf(buf, sizeof(buf), "bool(%s)", JSVAL_TO_BOOLEAN(v) ? "true"
: " false");
break;
}
}
buf[sizeof(buf) - 1] = 0;
return std::string(buf);
}