+ JSValueRef result;
+ if (!JSValueIsUndefined(context, cache)) {
+ JSObjectRef module(CYCastJSObject(context, cache));
+ result = CYGetProperty(context, module, property);
+ } else {
+ CYUTF8String 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) {
+ JSObjectRef JSON(CYGetCachedObject(context, CYJSString("JSON")));
+ JSObjectRef parse(CYCastJSObject(context, CYGetProperty(context, JSON, CYJSString("parse"))));
+ JSValueRef arguments[1] = { CYCastJSValue(context, CYJSString(code)) };
+ result = CYCallAsFunction(context, parse, JSON, 1, arguments);
+ } else {
+ JSObjectRef module(JSObjectMake(context, NULL, NULL));
+ CYSetProperty(context, modules, path, module);
+
+ JSObjectRef exports(JSObjectMake(context, NULL, NULL));
+ CYSetProperty(context, module, property, exports);
+
+ std::stringstream wrap;
+ wrap << "(function (exports, require, module, __filename) { " << code << "\n});";
+ code = CYPoolCode(pool, *wrap.rdbuf());
+
+ JSValueRef value(_jsccall(JSEvaluateScript, context, CYJSString(code), NULL, NULL, 0));
+ JSObjectRef function(CYCastJSObject(context, value));
+
+ JSValueRef arguments[4] = { exports, object, module, CYCastJSValue(context, path) };
+ CYCallAsFunction(context, function, NULL, 4, arguments);
+ result = CYGetProperty(context, module, property);
+ }