blob: 7ab0ce6d4ea1d3927c4a749115e26860365f3df6 [file] [log] [blame]
/*
* Copyright 2007 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.
*/
#ifndef JNI_LINUX_JSSTRINGWRAP_H_
#define JNI_LINUX_JSSTRINGWRAP_H_
/*
* Wrapper arouond JavaScript Strings, keeps pointers to unpacked strings
* and makes sure they are not cleaned up early.
*/
class JsStringWrap {
private:
JSContext* context_;
JSString* string_;
const char* bytes_;
const wchar_t* chars_;
public:
JsStringWrap(JSContext* context, JSString* str)
: context_(context), string_(str), bytes_(0), chars_(0) {
JS_AddRoot(context_, &string_);
JS_AddRoot(context_, &bytes_);
JS_AddRoot(context_, &chars_);
}
JsStringWrap(JSContext* context, jsval str)
: context_(context), string_(JSVAL_TO_STRING(str)), bytes_(0), chars_(0) {
JS_AddRoot(context_, &string_);
JS_AddRoot(context_, &bytes_);
JS_AddRoot(context_, &chars_);
}
~JsStringWrap() {
JS_RemoveRoot(context_, &string_);
JS_RemoveRoot(context_, &bytes_);
JS_RemoveRoot(context_, &chars_);
}
const char* bytes() {
if (!bytes_) bytes_ = JS_GetStringBytes(string_);
return bytes_;
}
const wchar_t* chars() {
if (!chars_) {
chars_ = reinterpret_cast<wchar_t*>(JS_GetStringChars(string_));
}
return chars_;
}
int length() {
return JS_GetStringLength(string_);
}
};
#endif // JNI_LINUX_JSSTRINGWRAP_H_