return _jsccall(JSObjectGetPropertyAtIndex, context, array, index);
}
-void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) {
- JSValueRef arguments[1];
- arguments[0] = value;
+void CYArrayPush(JSContextRef context, JSObjectRef array, size_t length, const JSValueRef arguments[]) {
JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
- _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, 1, arguments);
+ _jsccall(JSObjectCallAsFunction, context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, length, arguments);
+}
+
+void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) {
+ return CYArrayPush(context, array, 1, &value);
}
+template <size_t Size_>
+class CYArrayBuilder {
+ private:
+ JSContextRef context_;
+ JSObjectRef &array_;
+ size_t size_;
+ JSValueRef values_[Size_];
+
+ void flush() {
+ if (array_ == NULL)
+ array_ = CYObjectMakeArray(context_, size_, values_);
+ else
+ CYArrayPush(context_, array_, size_, values_);
+ }
+
+ public:
+ CYArrayBuilder(JSContextRef context, JSObjectRef &array) :
+ context_(context),
+ array_(array),
+ size_(0)
+ {
+ }
+
+ ~CYArrayBuilder() {
+ flush();
+ }
+
+ void operator ()(JSValueRef value) {
+ if (size_ == Size_) {
+ flush();
+ size_ = 0;
+ }
+
+ values_[size_++] = value;
+ }
+};
+
static JSValueRef System_print(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
FILE *file(stdout);
break;
CYPoolFFI_(uchar, unsigned char)
- CYPoolFFI_(char, char)
+ CYPoolFFI_(schar, signed char)
CYPoolFFI_(ushort, unsigned short)
CYPoolFFI_(short, short)
CYPoolFFI_(ulong, unsigned long)
case sig::void_P:
break;
+ // XXX: implement a conversion from a single character string?
+ CYPoolFFI_(char, char)
+
default:
for (CYHook *hook : GetHooks())
if (hook->PoolFFI != NULL)
return CYCastJSValue(context, *reinterpret_cast<native *>(data)); \
CYFromFFI_(uchar, unsigned char)
- CYFromFFI_(char, char)
+ CYFromFFI_(schar, signed char)
CYFromFFI_(ushort, unsigned short)
CYFromFFI_(short, short)
CYFromFFI_(ulong, unsigned long)
case sig::void_P:
return CYJSUndefined(context);
+ CYFromFFI_(char, char)
+
null:
return CYJSNull(context);
default:
return CYCallAsFunction(context, functor, _this, count, arguments);
} CYCatch(NULL) }
-JSObjectRef CYMakeType(JSContextRef context, const char *encoding) {
- Type_privateData *internal(new Type_privateData(encoding));
+JSObjectRef CYMakeType(JSContextRef context, sig::Primitive primitive) {
+ Type_privateData *internal(new Type_privateData(primitive));
return JSObjectMake(context, Type_privateData::Class_, internal);
}
CYPool pool;
CYUTF8String prefix(CYPoolUTF8String(pool, context, CYJSString(context, arguments[0])));
- std::vector<JSValueRef> values;
+ JSObjectRef array(NULL);
+
+ {
+ CYArrayBuilder<1024> values(context, array);
sqlite3_stmt *statement;
}
while (_sqlcall(sqlite3_step(statement)) != SQLITE_DONE)
- values.push_back(CYCastJSValue(context, CYJSString(sqlite3_column_string(statement, 0))));
+ values(CYCastJSValue(context, CYJSString(sqlite3_column_string(statement, 0))));
_sqlcall(sqlite3_finalize(statement));
+ }
- return CYObjectMakeArray(context, values.size(), values.data());
+ return array;
} CYCatch(NULL) }
static void All_getPropertyNames(JSContextRef context, JSObjectRef object, JSPropertyNameAccumulatorRef names) {
if (false) {
} else if (count == 1) {
- const char *type(CYPoolCString(pool, context, arguments[0]));
- return CYMakeType(context, type);
+ const char *encoding(CYPoolCString(pool, context, arguments[0]));
+ sig::Signature signature;
+ sig::Parse(pool, &signature, encoding, &Structor_);
+ return CYMakeType(context, signature.elements[0].type);
} else if (count == 2) {
JSObjectRef types(CYCastJSObject(context, arguments[0]));
size_t count(CYArrayLength(context, types));
sig::Type type(*internal->type_);
switch (type.primitive) {
- case sig::char_P: case sig::uchar_P: type.primitive = sig::char_P; break;
+ case sig::char_P: case sig::schar_P: case sig::uchar_P: type.primitive = sig::schar_P; break;
case sig::short_P: case sig::ushort_P: type.primitive = sig::short_P; break;
case sig::int_P: case sig::uint_P: type.primitive = sig::int_P; break;
case sig::long_P: case sig::ulong_P: type.primitive = sig::long_P; break;
sig::Type type(*internal->type_);
switch (type.primitive) {
- case sig::char_P: case sig::uchar_P: type.primitive = sig::uchar_P; break;
+ case sig::char_P: case sig::schar_P: case sig::uchar_P: type.primitive = sig::uchar_P; break;
case sig::short_P: case sig::ushort_P: type.primitive = sig::ushort_P; break;
case sig::int_P: case sig::uint_P: type.primitive = sig::uint_P; break;
case sig::long_P: case sig::ulong_P: type.primitive = sig::ulong_P; break;
CYSetProperty(context, cache, CYJSString("NULL"), CYJSNull(context), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("bool"), CYMakeType(context, "B"), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("char"), CYMakeType(context, "c"), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("short"), CYMakeType(context, "s"), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("int"), CYMakeType(context, "i"), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("long"), CYMakeType(context, "l"), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("float"), CYMakeType(context, "f"), kJSPropertyAttributeDontEnum);
- CYSetProperty(context, cache, CYJSString("double"), CYMakeType(context, "d"), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("bool"), CYMakeType(context, sig::boolean_P), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("char"), CYMakeType(context, sig::char_P), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("short"), CYMakeType(context, sig::short_P), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("int"), CYMakeType(context, sig::int_P), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("long"), CYMakeType(context, sig::long_P), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("float"), CYMakeType(context, sig::float_P), kJSPropertyAttributeDontEnum);
+ CYSetProperty(context, cache, CYJSString("double"), CYMakeType(context, sig::double_P), kJSPropertyAttributeDontEnum);
for (CYHook *hook : GetHooks())
if (hook->SetupContext != NULL)