JSStringRef Array_s;
JSStringRef cy_s;
+JSStringRef cyi_s;
JSStringRef length_s;
JSStringRef message_s;
JSStringRef name_s;
return CYMakeType(context, type);
} CYCatch(NULL) }
+static JSValueRef Type_callAsFunction_$With(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], sig::Primitive primitive, JSValueRef *exception) { CYTry {
+ Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(_this)));
+
+ CYPool pool;
+
+ sig::Type type;
+ type.name = NULL;
+ type.flags = 0;
+
+ type.primitive = primitive;
+ type.data.signature.elements = new(pool) sig::Element[1 + count];
+ type.data.signature.count = 1 + count;
+
+ type.data.signature.elements[0].name = NULL;
+ type.data.signature.elements[0].type = internal->type_;
+ type.data.signature.elements[0].offset = _not(size_t);
+
+ for (size_t i(0); i != count; ++i) {
+ sig::Element &element(type.data.signature.elements[i + 1]);
+ element.name = NULL;
+ element.offset = _not(size_t);
+
+ JSObjectRef object(CYCastJSObject(context, arguments[i]));
+ _assert(JSValueIsObjectOfClass(context, object, Type_privateData::Class_));
+ Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
+
+ element.type = internal->type_;
+ }
+
+ return CYMakeType(context, &type);
+} CYCatch(NULL) }
+
static JSValueRef Type_callAsFunction_arrayOf(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
if (count != 1)
throw CYJSError(context, "incorrect number of arguments to Type.arrayOf");
return CYMakeType(context, &type);
} CYCatch(NULL) }
+static JSValueRef Type_callAsFunction_blockWith(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+ return Type_callAsFunction_$With(context, object, _this, count, arguments, sig::block_P, exception);
+}
+
static JSValueRef Type_callAsFunction_constant(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
if (count != 0)
throw CYJSError(context, "incorrect number of arguments to Type.constant");
return CYMakeType(context, &type);
} CYCatch(NULL) }
-static JSValueRef Type_callAsFunction_functionWith(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
- Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(_this)));
-
- CYPool pool;
-
- sig::Type type;
- type.name = NULL;
- type.flags = 0;
-
- type.primitive = sig::function_P;
- type.data.signature.elements = new(pool) sig::Element[1 + count];
- type.data.signature.count = 1 + count;
-
- type.data.signature.elements[0].name = NULL;
- type.data.signature.elements[0].type = internal->type_;
- type.data.signature.elements[0].offset = _not(size_t);
-
- for (size_t i(0); i != count; ++i) {
- sig::Element &element(type.data.signature.elements[i + 1]);
- element.name = NULL;
- element.offset = _not(size_t);
-
- JSObjectRef object(CYCastJSObject(context, arguments[i]));
- _assert(JSValueIsObjectOfClass(context, object, Type_privateData::Class_));
- Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
-
- element.type = internal->type_;
- }
-
- return CYMakeType(context, &type);
-} CYCatch(NULL) }
+static JSValueRef Type_callAsFunction_functionWith(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+ return Type_callAsFunction_$With(context, object, _this, count, arguments, sig::function_P, exception);
+}
static JSValueRef Type_callAsFunction_pointerTo(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
if (count != 0)
JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
JSObjectRef toCYON(CYCastJSObject(context, CYGetProperty(context, Array, toCYON_s)));
return CYCallAsFunction(context, toCYON, _this, count, arguments);
- } else {
+ } else try {
+ CYPool pool;
+ return CYCastJSValue(context, pool.strcat("&", CYPoolCCYON(pool, context, CYGetProperty(context, _this, cyi_s)), NULL));
+ } catch (const CYException &e) {
char string[32];
sprintf(string, "%p", internal->value_);
return CYCastJSValue(context, string);
}
} CYCatch(NULL) }
+static JSValueRef Pointer_getProperty_type(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
+ Pointer *internal(reinterpret_cast<Pointer *>(JSObjectGetPrivate(object)));
+ return CYMakeType(context, internal->type_->type_);
+} CYCatch(NULL) }
+
static JSValueRef Functor_getProperty_type(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry {
cy::Functor *internal(reinterpret_cast<cy::Functor *>(JSObjectGetPrivate(object)));
return CYMakeType(context, &internal->signature_);
{NULL, NULL, 0}
};
+static JSStaticValue Pointer_staticValues[2] = {
+ {"type", &Pointer_getProperty_type, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
+ {NULL, NULL, NULL, 0}
+};
+
static JSStaticFunction Struct_staticFunctions[2] = {
{"$cya", &Struct_callAsFunction_$cya, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
{NULL, NULL, 0}
{NULL, NULL, NULL, 0}
};
-static JSStaticFunction Type_staticFunctions[9] = {
+static JSStaticFunction Type_staticFunctions[10] = {
{"arrayOf", &Type_callAsFunction_arrayOf, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
+ {"blockWith", &Type_callAsFunction_blockWith, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
{"constant", &Type_callAsFunction_constant, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
{"functionWith", &Type_callAsFunction_functionWith, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
{"pointerTo", &Type_callAsFunction_pointerTo, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
}
}
-extern "C" void CydgetSetupContext(JSGlobalContextRef context) {
- CYSetupContext(context);
-}
-
static bool initialized_ = false;
void CYInitializeDynamic() {
definition = kJSClassDefinitionEmpty;
definition.className = "Pointer";
definition.staticFunctions = Pointer_staticFunctions;
+ definition.staticValues = Pointer_staticValues;
definition.getProperty = &Pointer_getProperty;
definition.setProperty = &Pointer_setProperty;
definition.finalize = &CYFinalize;
Array_s = JSStringCreateWithUTF8CString("Array");
cy_s = JSStringCreateWithUTF8CString("$cy");
+ cyi_s = JSStringCreateWithUTF8CString("$cyi");
length_s = JSStringCreateWithUTF8CString("length");
message_s = JSStringCreateWithUTF8CString("message");
name_s = JSStringCreateWithUTF8CString("name");
CYUTF16String utf16(CYPoolUTF16String(pool, utf8));
munmap(const_cast<char *>(utf8.data), utf8.size);
- if (CydgetMemoryParse(&utf16.data, &utf16.size))
- CYExecute(context, pool, CYPoolUTF8String(pool, utf16));
+ // XXX: this should not be used
+ CydgetMemoryParse(&utf16.data, &utf16.size);
+
+ CYExecute(context, pool, CYPoolUTF8String(pool, utf16));
free(const_cast<uint16_t *>(utf16.data));
}
_syscall(closedir(setups));
}
+static JSValueRef require(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
+ _assert(count == 1);
+ CYPool pool;
+
+ Dl_info addr;
+ _assert(dladdr(reinterpret_cast<void *>(&require), &addr) != 0);
+ char *lib(pool.strdup(addr.dli_fname));
+
+ char *slash(strrchr(lib, '/'));
+ _assert(slash != NULL);
+ *slash = '\0';
+
+ CYJSString property("exports");
+ JSObjectRef module;
+
+ const char *path(pool.strcat(lib, "/cycript/", CYPoolCString(pool, context, arguments[0]), ".cy", NULL));
+ CYJSString key(path);
+ JSObjectRef modules(CYGetCachedObject(context, CYJSString("modules")));
+ JSValueRef cache(CYGetProperty(context, modules, key));
+
+ if (!JSValueIsUndefined(context, cache))
+ module = CYCastJSObject(context, cache);
+ else {
+ CYUTF8String code;
+ code.data = reinterpret_cast<char *>(CYMapFile(path, &code.size));
+
+ std::stringstream wrap;
+ wrap << "(function (exports, require, module) { " << code << "\n});";
+ code = CYPoolCode(pool, wrap.str().c_str());
+
+ JSValueRef value(_jsccall(JSEvaluateScript, context, CYJSString(code), NULL, NULL, 0));
+ JSObjectRef function(CYCastJSObject(context, value));
+
+ module = JSObjectMake(context, NULL, NULL);
+ JSObjectRef exports(JSObjectMake(context, NULL, NULL));
+ CYSetProperty(context, module, property, exports);
+
+ JSValueRef arguments[3] = { exports, JSObjectMakeFunctionWithCallback(context, CYJSString("require"), &require), module };
+ CYCallAsFunction(context, function, NULL, 3, arguments);
+ CYSetProperty(context, modules, key, module);
+ }
+
+ return CYGetProperty(context, module, property);
+} CYCatch(NULL) }
+
extern "C" void CYSetupContext(JSGlobalContextRef context) {
CYInitializeDynamic();
CYSetProperty(context, cycript, CYJSString("Pointer"), JSObjectMakeConstructor(context, Pointer_, &Pointer_new));
CYSetProperty(context, cycript, CYJSString("Type"), JSObjectMakeConstructor(context, Type_privateData::Class_, &Type_new));
+ JSObjectRef modules(JSObjectMake(context, NULL, NULL));
+ CYSetProperty(context, cy, CYJSString("modules"), modules);
+
JSObjectRef all(JSObjectMake(context, All_, NULL));
CYSetProperty(context, cycript, CYJSString("all"), all);
JSObjectRef System(JSObjectMake(context, NULL, NULL));
CYSetProperty(context, cy, CYJSString("System"), System);
+ CYSetProperty(context, all, CYJSString("require"), &require, kJSPropertyAttributeDontEnum);
+
CYSetProperty(context, global, CYJSString("system"), System);
CYSetProperty(context, System, CYJSString("args"), CYJSNull(context));
//CYSetProperty(context, System, CYJSString("global"), global);