| /* |
| * 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); |
| } |