#include "Internal.hpp"
#include <dlfcn.h>
-#include <iconv.h>
#include "cycript.hpp"
#include <sys/mman.h>
#include <iostream>
-#include <ext/stdio_filebuf.h>
#include <set>
#include <map>
#include <iomanip>
#include <cmath>
#include "Parser.hpp"
-#include "Cycript.tab.hh"
#include "Error.hpp"
#include "JavaScript.hpp"
/* JavaScript Properties {{{ */
JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, size_t index) {
- JSValueRef exception(NULL);
- JSValueRef value(JSObjectGetPropertyAtIndex(context, object, index, &exception));
- CYThrow(context, exception);
- return value;
+ return _jsccall(JSObjectGetPropertyAtIndex, context, object, index);
}
JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, JSStringRef name) {
- JSValueRef exception(NULL);
- JSValueRef value(JSObjectGetProperty(context, object, name, &exception));
- CYThrow(context, exception);
- return value;
+ return _jsccall(JSObjectGetProperty, context, object, name);
}
void CYSetProperty(JSContextRef context, JSObjectRef object, size_t index, JSValueRef value) {
- JSValueRef exception(NULL);
- JSObjectSetPropertyAtIndex(context, object, index, value, &exception);
- CYThrow(context, exception);
+ _jsccall(JSObjectSetPropertyAtIndex, context, object, index, value);
}
void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef value, JSPropertyAttributes attributes) {
- JSValueRef exception(NULL);
- JSObjectSetProperty(context, object, name, value, attributes, &exception);
- CYThrow(context, exception);
+ _jsccall(JSObjectSetProperty, context, object, name, value, attributes);
}
void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef (*callback)(JSContextRef, JSObjectRef, JSObjectRef, size_t, const JSValueRef[], JSValueRef *), JSPropertyAttributes attributes) {
JSStringRef CYCopyJSString(JSContextRef context, JSValueRef value) {
if (JSValueIsNull(context, value))
return NULL;
- JSValueRef exception(NULL);
- JSStringRef string(JSValueToStringCopy(context, value, &exception));
- CYThrow(context, exception);
- return string;
+ return _jsccall(JSValueToStringCopy, context, value);
}
static CYUTF16String CYCastUTF16String(JSStringRef value) {
return CYUTF16String(JSStringGetCharactersPtr(value), JSStringGetLength(value));
}
-CYUTF8String CYPoolUTF8String(apr_pool_t *pool, JSContextRef context, JSStringRef value) {
+CYUTF8String CYPoolUTF8String(CYPool &pool, JSContextRef context, JSStringRef value) {
return CYPoolUTF8String(pool, CYCastUTF16String(value));
}
-const char *CYPoolCString(apr_pool_t *pool, JSContextRef context, JSStringRef value) {
+const char *CYPoolCString(CYPool &pool, JSContextRef context, JSStringRef value) {
CYUTF8String utf8(CYPoolUTF8String(pool, context, value));
_assert(memchr(utf8.data, '\0', utf8.size) == NULL);
return utf8.data;
}
-const char *CYPoolCString(apr_pool_t *pool, JSContextRef context, JSValueRef value) {
+const char *CYPoolCString(CYPool &pool, JSContextRef context, JSValueRef value) {
return JSValueIsNull(context, value) ? NULL : CYPoolCString(pool, context, CYJSString(context, value));
}
/* }}} */
/* Index Offsets {{{ */
-size_t CYGetIndex(apr_pool_t *pool, JSContextRef context, JSStringRef value) {
+size_t CYGetIndex(CYPool &pool, JSContextRef context, JSStringRef value) {
return CYGetIndex(CYPoolUTF8String(pool, context, value));
}
/* }}} */
void CYFinalize(JSObjectRef object) {
CYData *internal(reinterpret_cast<CYData *>(JSObjectGetPrivate(object)));
+ _assert(internal->count_ != _not(unsigned));
if (--internal->count_ == 0)
delete internal;
}
-void Structor_(apr_pool_t *pool, sig::Type *&type) {
+void Structor_(CYPool &pool, sig::Type *&type) {
if (
type->primitive == sig::pointer_P &&
type->data.data.type != NULL &&
Pointer(void *value, JSContextRef context, JSObjectRef owner, size_t length, sig::Type *type) :
CYOwned(value, context, owner),
- type_(new(pool_) Type_privateData(type)),
+ type_(new(*pool_) Type_privateData(type)),
length_(length)
{
}
JSObjectRef CYMakeStruct(JSContextRef context, void *data, sig::Type *type, ffi_type *ffi, JSObjectRef owner) {
Struct_privateData *internal(new Struct_privateData(context, owner));
- apr_pool_t *pool(internal->pool_);
+ CYPool &pool(*internal->pool_);
Type_privateData *typical(new(pool) Type_privateData(type, ffi));
internal->type_ = typical;
internal->value_ = data;
else {
size_t size(typical->GetFFI()->size);
- void *copy(apr_palloc(internal->pool_, size));
+ void *copy(internal->pool_->malloc<void>(size));
memcpy(copy, data, size);
internal->value_ = copy;
}
}
double CYCastDouble(JSContextRef context, JSValueRef value) {
- JSValueRef exception(NULL);
- double number(JSValueToNumber(context, value, &exception));
- CYThrow(context, exception);
- return number;
+ return _jsccall(JSValueToNumber, context, value);
}
bool CYCastBool(JSContextRef context, JSValueRef value) {
}
JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value) {
- JSValueRef exception(NULL);
- JSObjectRef object(JSValueToObject(context, value, &exception));
- CYThrow(context, exception);
- return object;
+ return _jsccall(JSValueToObject, context, value);
}
JSValueRef CYCallAsFunction(JSContextRef context, JSObjectRef function, JSObjectRef _this, size_t count, const JSValueRef arguments[]) {
- JSValueRef exception(NULL);
- JSValueRef value(JSObjectCallAsFunction(context, function, _this, count, arguments, &exception));
- CYThrow(context, exception);
- return value;
+ return _jsccall(JSObjectCallAsFunction, context, function, _this, count, arguments);
}
bool CYIsCallable(JSContextRef context, JSValueRef value) {
return value != NULL && JSValueIsObject(context, value) && JSObjectIsFunction(context, (JSObjectRef) value);
}
+size_t CYArrayLength(JSContextRef context, JSObjectRef array) {
+ return CYCastDouble(context, CYGetProperty(context, array, length_s));
+}
+
+JSValueRef CYArrayGet(JSContextRef context, JSObjectRef array, size_t index) {
+ return _jsccall(JSObjectGetPropertyAtIndex, context, array, index);
+}
+
+void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) {
+ JSValueRef arguments[1];
+ arguments[0] = value;
+ JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
+ _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, 1, arguments);
+}
+
static JSValueRef System_print(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
if (count == 0)
printf("\n");
static size_t Nonce_(0);
-static JSValueRef $cyq(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+static JSValueRef $cyq(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
CYPool pool;
- const char *name(apr_psprintf(pool, "%s%"APR_SIZE_T_FMT"", CYPoolCString(pool, context, arguments[0]), Nonce_++));
+ const char *name(pool.strcat(CYPoolCString(pool, context, arguments[0]), pool.itoa(Nonce_++), NULL));
return CYCastJSValue(context, name);
-}
+} CYCatch(NULL) }
-static JSValueRef Cycript_gc_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+static JSValueRef Cycript_gc_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
JSGarbageCollect(context);
return CYJSUndefined(context);
-}
+} CYCatch(NULL) }
-const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSValueRef value, JSValueRef *exception) { CYTry {
+const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSValueRef value, JSValueRef *exception) { CYTry {
switch (JSType type = JSValueGetType(context, value)) {
case kJSTypeUndefined:
return "undefined";
std::ostringstream str;
CYNumerify(str, CYCastDouble(context, value));
std::string value(str.str());
- return apr_pstrmemdup(pool, value.c_str(), value.size());
+ return pool.strmemdup(value.c_str(), value.size());
} break;
case kJSTypeString: {
CYUTF8String string(CYPoolUTF8String(pool, context, CYJSString(context, value)));
CYStringify(str, string.data, string.size);
std::string value(str.str());
- return apr_pstrmemdup(pool, value.c_str(), value.size());
+ return pool.strmemdup(value.c_str(), value.size());
} break;
case kJSTypeObject:
}
} CYCatch(NULL) }
-const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSValueRef value) {
- JSValueRef exception(NULL);
- const char *cyon(CYPoolCCYON(pool, context, value, &exception));
- CYThrow(context, exception);
- return cyon;
+const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSValueRef value) {
+ return _jsccall(CYPoolCCYON, pool, context, value);
}
-const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
+const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSObjectRef object) {
JSValueRef toCYON(CYGetProperty(context, object, toCYON_s));
if (CYIsCallable(context, toCYON)) {
JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toCYON, object, 0, NULL));
JSValueRef toJSON(CYGetProperty(context, object, toJSON_s));
if (CYIsCallable(context, toJSON)) {
JSValueRef arguments[1] = {CYCastJSValue(context, CYJSString(""))};
- JSValueRef exception(NULL);
- const char *cyon(CYPoolCCYON(pool, context, CYCallAsFunction(context, (JSObjectRef) toJSON, object, 1, arguments), &exception));
- CYThrow(context, exception);
- return cyon;
+ return _jsccall(CYPoolCCYON, pool, context, CYCallAsFunction(context, (JSObjectRef) toJSON, object, 1, arguments));
}
if (JSObjectIsFunction(context, object)) {
bool comma(false);
for (size_t index(0), count(JSPropertyNameArrayGetCount(names)); index != count; ++index) {
- JSStringRef name(JSPropertyNameArrayGetNameAtIndex(names, index));
- JSValueRef value(CYGetProperty(context, object, name));
-
if (comma)
str << ',';
else
comma = true;
+ JSStringRef name(JSPropertyNameArrayGetNameAtIndex(names, index));
CYUTF8String string(CYPoolUTF8String(pool, context, name));
+
if (CYIsKey(string))
str << string.data;
else
CYStringify(str, string.data, string.size);
- str << ':' << CYPoolCCYON(pool, context, value);
- }
+ str << ':';
- str << '}';
+ try {
+ JSValueRef value(CYGetProperty(context, object, name));
+ str << CYPoolCCYON(pool, context, value);
+ } catch (const CYException &error) {
+ str << "@error";
+ }
+ }
JSPropertyNameArrayRelease(names);
+ str << '}';
+
std::string string(str.str());
- return apr_pstrmemdup(pool, string.c_str(), string.size());
+ return pool.strmemdup(string.c_str(), string.size());
}
static JSValueRef Array_callAsFunction_toCYON(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
bool comma(false);
for (size_t index(0), count(CYCastDouble(context, length)); index != count; ++index) {
- JSValueRef value(CYGetProperty(context, _this, index));
-
if (comma)
str << ',';
else
comma = true;
- if (!JSValueIsUndefined(context, value))
- str << CYPoolCCYON(pool, context, value);
- else {
- str << ',';
- comma = false;
+ try {
+ JSValueRef value(CYGetProperty(context, _this, index));
+ if (!JSValueIsUndefined(context, value))
+ str << CYPoolCCYON(pool, context, value);
+ else {
+ str << ',';
+ comma = false;
+ }
+ } catch (const CYException &error) {
+ str << "@error";
}
}
return JSObjectMake(context, Functor_, internal);
}
-static bool CYGetOffset(apr_pool_t *pool, JSContextRef context, JSStringRef value, ssize_t &index) {
+static bool CYGetOffset(CYPool &pool, JSContextRef context, JSStringRef value, ssize_t &index) {
return CYGetOffset(CYPoolCString(pool, context, value), index);
}
}
}
-void CYPoolFFI(apr_pool_t *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value) {
+void CYPoolFFI(CYPool *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value) {
switch (type->primitive) {
case sig::boolean_P:
*reinterpret_cast<bool *>(data) = JSValueToBoolean(context, value);
break;
case sig::string_P:
- *reinterpret_cast<const char **>(data) = CYPoolCString(pool, context, value);
+ _assert(pool != NULL);
+ *reinterpret_cast<const char **>(data) = CYPoolCString(*pool, context, value);
break;
case sig::struct_P: {
static JSObjectRef CYMakeFunctor(JSContextRef context, JSValueRef value, const char *type) {
JSObjectRef Function(CYGetCachedObject(context, CYJSString("Function")));
- JSValueRef exception(NULL);
- bool function(JSValueIsInstanceOfConstructor(context, value, Function, &exception));
- CYThrow(context, exception);
-
+ bool function(_jsccall(JSValueIsInstanceOfConstructor, context, value, Function));
if (function) {
JSObjectRef function(CYCastJSObject(context, value));
return CYMakeFunctor(context, function, type);
}
}
-static bool Index_(apr_pool_t *pool, JSContextRef context, Struct_privateData *internal, JSStringRef property, ssize_t &index, uint8_t *&base) {
+static bool Index_(CYPool &pool, JSContextRef context, Struct_privateData *internal, JSStringRef property, ssize_t &index, uint8_t *&base) {
Type_privateData *typical(internal->type_);
sig::Type *type(typical->type_);
if (type == NULL)
return true;
} CYCatch(false) }
-static JSValueRef Struct_callAsFunction_$cya(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+static JSValueRef Struct_callAsFunction_$cya(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
Struct_privateData *internal(reinterpret_cast<Struct_privateData *>(JSObjectGetPrivate(_this)));
Type_privateData *typical(internal->type_);
return CYMakePointer(context, internal->value_, _not(size_t), typical->type_, typical->ffi_, _this);
-}
+} CYCatch(NULL) }
static JSValueRef Struct_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
CYPool pool;
}
}
-JSValueRef CYCallFunction(apr_pool_t *pool, JSContextRef context, size_t setups, void *setup[], size_t count, const JSValueRef arguments[], bool initialize, JSValueRef *exception, sig::Signature *signature, ffi_cif *cif, void (*function)()) { CYTry {
+JSValueRef CYCallFunction(CYPool &pool, JSContextRef context, size_t setups, void *setup[], size_t count, const JSValueRef arguments[], bool initialize, sig::Signature *signature, ffi_cif *cif, void (*function)()) {
if (setups + count != signature->count - 1)
throw CYJSError(context, "incorrect number of arguments to ffi function");
ffi_type *ffi(cif->arg_types[index]);
// XXX: alignment?
values[index] = new(pool) uint8_t[ffi->size];
- CYPoolFFI(pool, context, element->type, ffi, values[index], arguments[index - setups]);
+ CYPoolFFI(&pool, context, element->type, ffi, values[index], arguments[index - setups]);
}
uint8_t value[cif->rtype->size];
ffi_call(cif, function, value, values);
return CYFromFFI(context, signature->elements[0].type, cif->rtype, value, initialize);
-} CYCatch(NULL) }
+}
-static JSValueRef Functor_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+static JSValueRef Functor_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
CYPool pool;
cy::Functor *internal(reinterpret_cast<cy::Functor *>(JSObjectGetPrivate(object)));
- return CYCallFunction(pool, context, 0, NULL, count, arguments, false, exception, &internal->signature_, &internal->cif_, internal->GetValue());
-}
+ return CYCallFunction(pool, context, 0, NULL, count, arguments, false, &internal->signature_, &internal->cif_, internal->GetValue());
+} CYCatch(NULL) }
JSObjectRef CYMakeType(JSContextRef context, const char *type) {
Type_privateData *internal(new Type_privateData(type));
// XXX: alignment?
uint8_t value[ffi->size];
CYPool pool;
- CYPoolFFI(pool, context, type, ffi, value, arguments[0]);
+ CYPoolFFI(&pool, context, type, ffi, value, arguments[0]);
return CYFromFFI(context, type, ffi, value);
} CYCatch(NULL) }
}
} CYCatch(NULL) }
-static JSValueRef Type_getProperty_alignment(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
+static JSValueRef Functor_getProperty_type(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
+ cy::Functor *internal(reinterpret_cast<cy::Functor *>(JSObjectGetPrivate(object)));
+ CYPool pool;
+ return CYCastJSValue(context, Unparse(pool, &internal->signature_));
+} CYCatch(NULL) }
+
+static JSValueRef Type_getProperty_alignment(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
return CYCastJSValue(context, internal->GetFFI()->alignment);
-}
+} CYCatch(NULL) }
-static JSValueRef Type_getProperty_name(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
+static JSValueRef Type_getProperty_name(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
return CYCastJSValue(context, internal->type_->name);
-}
+} CYCatch(NULL) }
-static JSValueRef Type_getProperty_size(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
+static JSValueRef Type_getProperty_size(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
return CYCastJSValue(context, internal->GetFFI()->size);
-}
+} CYCatch(NULL) }
static JSValueRef Type_callAsFunction_toString(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(_this)));
const char *type(sig::Unparse(pool, internal->type_));
std::ostringstream str;
CYStringify(str, type, strlen(type));
- char *cyon(apr_pstrcat(pool, "new Type(", str.str().c_str(), ")", NULL));
+ char *cyon(pool.strcat("new Type(", str.str().c_str(), ")", NULL));
return CYCastJSValue(context, CYJSString(cyon));
} CYCatch(NULL) }
JSStaticFunction const * const Functor::StaticFunctions = Functor_staticFunctions;
}
+static JSStaticValue Functor_staticValues[2] = {
+ {"type", &Functor_getProperty_type, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
+ {NULL, NULL, NULL, 0}
+};
+
static JSStaticValue Type_staticValues[4] = {
{"alignment", &Type_getProperty_alignment, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
{"name", &Type_getProperty_name, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
args[i] = CYCastJSValue(context, argv[i]);
JSObjectRef array;
- if (JSObjectMakeArray$ != NULL) {
- JSValueRef exception(NULL);
- array = (*JSObjectMakeArray$)(context, argc, args, &exception);
- CYThrow(context, exception);
- } else {
+ if (JSObjectMakeArray$ != NULL)
+ array = _jsccall(*JSObjectMakeArray$, context, argc, args);
+ else {
JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array")));
JSValueRef value(CYCallAsFunction(context, Array, NULL, argc, args));
array = CYCastJSObject(context, value);
return JSContextGetGlobalObject(context);
}
-const char *CYExecute(apr_pool_t *pool, CYUTF8String code) {
+const char *CYExecute(CYPool &pool, CYUTF8String code) {
JSContextRef context(CYGetJSContext());
- JSValueRef exception(NULL), result;
+ JSValueRef exception(NULL);
void *handle;
if (hooks_ != NULL && hooks_->ExecuteStart != NULL)
else
handle = NULL;
- const char *json;
+ try {
+ JSValueRef result;
try {
result = JSEvaluateScript(context, CYJSString(code), NULL, NULL, 0, &exception);
} catch (const char *error) {
if (JSValueIsUndefined(context, result))
return NULL;
+ const char *json;
try {
json = CYPoolCCYON(pool, context, result, &exception);
} catch (const char *error) {
CYSetProperty(context, CYGetGlobalObject(context), Result_, result);
- if (hooks_ != NULL && hooks_->ExecuteEnd != NULL)
- (*hooks_->ExecuteEnd)(context, handle);
return json;
+
+ } catch (...) {
+ if (hooks_ != NULL && hooks_->ExecuteEnd != NULL)
+ (*hooks_->ExecuteEnd)(context, handle);
+ throw;
+ }
}
extern "C" void CydgetSetupContext(JSGlobalContextRef context) {
initialized_ = true;
else return;
- CYInitializeStatic();
-
JSObjectMakeArray$ = reinterpret_cast<JSObjectRef (*)(JSContextRef, size_t, const JSValueRef[], JSValueRef *)>(dlsym(RTLD_DEFAULT, "JSObjectMakeArray"));
JSClassDefinition definition;
definition = kJSClassDefinitionEmpty;
definition.className = "Functor";
definition.staticFunctions = cy::Functor::StaticFunctions;
+ definition.staticValues = Functor_staticValues;
definition.callAsFunction = &Functor_callAsFunction;
definition.finalize = &CYFinalize;
Functor_ = JSClassCreate(&definition);
throw CYJSError(context, value);
}
-const char *CYJSError::PoolCString(apr_pool_t *pool) const {
+const char *CYJSError::PoolCString(CYPool &pool) const {
// XXX: this used to be CYPoolCString
return CYPoolCCYON(pool, context_, value_);
}
JSValueRef CYCastJSError(JSContextRef context, const char *message) {
JSObjectRef Error(CYGetCachedObject(context, CYJSString("Error")));
-
JSValueRef arguments[1] = {CYCastJSValue(context, message)};
-
- JSValueRef exception(NULL);
- JSValueRef value(JSObjectCallAsConstructor(context, Error, 1, arguments, &exception));
- CYThrow(context, exception);
-
- return value;
+ return _jsccall(JSObjectCallAsConstructor, context, Error, 1, arguments);
}
JSValueRef CYPoolError::CastJSValue(JSContextRef context) const {
va_list args;
va_start(args, format);
- const char *message(apr_pvsprintf(pool, format, args));
+ // XXX: there might be a beter way to think about this
+ const char *message(pool.vsprintf(64, format, args));
va_end(args);
value_ = CYCastJSError(context, message);
}
extern "C" void CYSetupContext(JSGlobalContextRef context) {
- JSValueRef exception(NULL);
-
CYInitializeDynamic();
JSObjectRef global(CYGetGlobalObject(context));
JSObjectRef all(JSObjectMake(context, All_, NULL));
CYSetProperty(context, cycript, CYJSString("all"), all);
- JSObjectRef alls(JSObjectCallAsConstructor(context, Array, 0, NULL, &exception));
- CYThrow(context, exception);
+ JSObjectRef alls(_jsccall(JSObjectCallAsConstructor, context, Array, 0, NULL));
CYSetProperty(context, cycript, CYJSString("alls"), alls);
if (true) {