void Aggregate::PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const {
_assert(!overlap);
+ _assert(signature.count != _not(size_t));
size_t offset(0);
uint8_t *base(reinterpret_cast<uint8_t *>(data));
}
JSValueRef Aggregate::FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const {
+ _assert(!overlap);
+ _assert(signature.count != _not(size_t));
return Struct_privateData::Make(context, data, *this, ffi, context, owner);
}
CString *internal(reinterpret_cast<CString *>(JSObjectGetPrivate(object)));
ssize_t offset;
- if (!CYGetOffset(pool, context, property, offset))
+ if (JSStringIsEqualToUTF8CString(property, "$cyi"))
+ offset = 0;
+ else if (!CYGetOffset(pool, context, property, offset))
return NULL;
return CYCastJSValue(context, CYJSString(CYUTF8String(&internal->value_[offset], 1)));
CString *internal(reinterpret_cast<CString *>(JSObjectGetPrivate(object)));
ssize_t offset;
- if (!CYGetOffset(pool, context, property, offset))
+ if (JSStringIsEqualToUTF8CString(property, "$cyi"))
+ offset = 0;
+ else if (!CYGetOffset(pool, context, property, offset))
return false;
const char *data(CYPoolCString(pool, context, value));
element.type->PoolFFI(&pool, context, ffi, values[index], arguments[index - setups]);
}
- uint8_t value[cif->rtype->size];
+ uint8_t *value(pool.malloc<uint8_t>(std::max<size_t>(cif->rtype->size, sizeof(ffi_arg)), std::max<size_t>(cif->rtype->alignment, alignof(ffi_arg))));
void (*call)(CYPool &, JSContextRef, ffi_cif *, void (*)(), void *, void **) = &CYCallFunction;
// XXX: this only supports one hook, but it is a bad idea anyway
_assert(JSValueIsObjectOfClass(context, object, Type_privateData::Class_));
Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
element.type = internal->type_;
+ _assert(element.type != NULL);
}
return CYMakeType(context, type);
sig::Function function(internal->variadic_);
sig::Copy(pool, function.signature, internal->signature_);
+ CYString *name;
+
auto typed(CYDecodeType(pool, &function)); {
std::ostringstream str;
Dl_info info;
str << "+0x" << std::hex << offset;
}
- typed->identifier_ = new(pool) CYIdentifier(pool.strdup(str.str().c_str()));
+ name = new(pool) CYString(pool.strdup(str.str().c_str()));
}
std::ostringstream str;
CYOptions options;
CYOutput output(*str.rdbuf(), options);
output.pretty_ = true;
- (new(pool) CYExternalExpression(new(pool) CYString("C"), typed))->Output(output, CYNoFlags);
+ (new(pool) CYExternalExpression(new(pool) CYString("C"), typed, name))->Output(output, CYNoFlags);
return CYCastJSValue(context, CYJSString(str.str()));
} CYCatch(NULL) }
_assert(count == 1);
CYPool pool;
- const char *name(CYPoolCString(pool, context, arguments[0]));
- if (strchr(name, '/') == NULL && (
+ CYUTF8String name(CYPoolUTF8String(pool, context, CYJSString(context, arguments[0])));
+ if (memchr(name.data, '/', name.size) == NULL && (
#ifdef __APPLE__
- dlopen(pool.strcat("/System/Library/Frameworks/", name, ".framework/", name, NULL), RTLD_LAZY | RTLD_GLOBAL) != NULL ||
- dlopen(pool.strcat("/System/Library/PrivateFrameworks/", name, ".framework/", name, NULL), RTLD_LAZY | RTLD_GLOBAL) != NULL ||
+ dlopen(pool.strcat("/System/Library/Frameworks/", name.data, ".framework/", name.data, NULL), RTLD_LAZY | RTLD_GLOBAL) != NULL ||
+ dlopen(pool.strcat("/System/Library/PrivateFrameworks/", name.data, ".framework/", name.data, NULL), RTLD_LAZY | RTLD_GLOBAL) != NULL ||
#endif
false))
return CYJSUndefined(context);
- JSObjectRef resolve(CYCastJSObject(context, CYGetProperty(context, object, CYJSString("resolve"))));
- CYJSString path(context, CYCallAsFunction(context, resolve, NULL, 1, arguments));
+ CYJSString path;
+ CYUTF8String code;
+
+ sqlite3_stmt *statement;
+
+ _sqlcall(sqlite3_prepare(database_,
+ "select "
+ "\"module\".\"code\", "
+ "\"module\".\"flags\" "
+ "from \"module\" "
+ "where"
+ " \"module\".\"name\" = ?"
+ " limit 1"
+ , -1, &statement, NULL));
+
+ _sqlcall(sqlite3_bind_text(statement, 1, name.data, name.size, SQLITE_STATIC));
+
+ if (_sqlcall(sqlite3_step(statement)) != SQLITE_DONE) {
+ code.data = static_cast<const char *>(sqlite3_column_blob(statement, 0));
+ code.size = sqlite3_column_bytes(statement, 0);
+ path = CYJSString(name);
+ code = CYPoolUTF8String(pool, code);
+ } else {
+ JSObjectRef resolve(CYCastJSObject(context, CYGetProperty(context, object, CYJSString("resolve"))));
+ path = CYJSString(context, CYCallAsFunction(context, resolve, NULL, 1, arguments));
+ }
+
+ _sqlcall(sqlite3_finalize(statement));
CYJSString property("exports");
JSObjectRef module(CYCastJSObject(context, cache));
result = CYGetProperty(context, module, property);
} else {
- CYUTF8String code(CYPoolFileUTF8String(pool, CYPoolCString(pool, context, path)));
- _assert(code.data != NULL);
+ if (code.data == NULL) {
+ code = CYPoolFileUTF8String(pool, CYPoolCString(pool, context, path));
+ _assert(code.data != NULL);
+ }
- size_t length(strlen(name));
- if (length >= 5 && strcmp(name + length - 5, ".json") == 0) {
+ size_t length(name.size);
+ if (length >= 5 && strncmp(name.data + length - 5, ".json", 5) == 0) {
JSObjectRef JSON(CYGetCachedObject(context, CYJSString("JSON")));
JSObjectRef parse(CYCastJSObject(context, CYGetProperty(context, JSON, CYJSString("parse"))));
JSValueRef arguments[1] = { CYCastJSValue(context, CYJSString(code)) };