]> git.saurik.com Git - cycript.git/blobdiff - Library.cpp
Provide a .typeOf() to get a Type of an ObjC Class.
[cycript.git] / Library.cpp
index 8ff066accf35c74d1f704ba2371ba3d68766e81b..1ed182e1d71f9217f913dedb9e5819731748a3e5 100644 (file)
@@ -1,5 +1,5 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2010  Jay Freeman (saurik)
+ * Copyright (C) 2009-2012  Jay Freeman (saurik)
 */
 
 /* GNU Lesser General Public License, Version 3 {{{ */
@@ -42,6 +42,7 @@
 #include "Error.hpp"
 #include "String.hpp"
 #include "Execute.hpp"
+#include "JavaScript.hpp"
 
 /* C Strings {{{ */
 template <typename Type_>
@@ -222,17 +223,34 @@ double CYCastDouble(const char *value) {
     return CYCastDouble(value, strlen(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) {
+    JSValueRef exception(NULL);
+    JSValueRef value(JSObjectGetPropertyAtIndex(context, array, index, &exception));
+    CYThrow(context, exception);
+    return value;
+}
+
+void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) {
+    JSValueRef exception(NULL);
+    JSValueRef arguments[1];
+    arguments[0] = value;
+    JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype")));
+    JSObjectCallAsFunction(context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, 1, arguments, &exception);
+    CYThrow(context, exception);
+}
+
 extern "C" void CydgetPoolParse(apr_pool_t *remote, const uint16_t **data, size_t *size) {
     CYLocalPool local;
 
-    CYDriver driver;
-    cy::parser parser(driver);
-
     CYUTF8String utf8(CYPoolUTF8String(local, CYUTF16String(*data, *size)));
+    CYStream stream(utf8.data, utf8.data + utf8.size);
+    CYDriver driver(stream);
 
-    driver.data_ = utf8.data;
-    driver.size_ = utf8.size;
-
+    cy::parser parser(driver);
     if (parser.parse() != 0 || !driver.errors_.empty())
         return;