Skip to content

Commit

Permalink
Starting to build some tooling for reading BridgeSupport files, makin…
Browse files Browse the repository at this point in the history
…g improvements to the encoding parser along the way.
  • Loading branch information
allertonm committed Feb 9, 2010
1 parent eb312c7 commit 607d736
Show file tree
Hide file tree
Showing 8 changed files with 288 additions and 32 deletions.
8 changes: 8 additions & 0 deletions .idea/ant.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions BridgeSupport/BridgeSupport.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Clojure" name="Clojure">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/clojure" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Clojure" level="project" />
<orderEntry type="module" module-name="Core" />
</component>
</module>

68 changes: 68 additions & 0 deletions BridgeSupport/build.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<project name="BridgeSupport" basedir="." default="gen_all_bridge_metadata">
<property name="generated" value="generated"/>
<property name="bin" value="bin"/>


<target name="gen_bridge_metadata">
<exec executable="gen_bridge_metadata">
<arg value="--64-bit"/>
<arg value="-f"/>
<arg value="${framework.name}"/>
<arg value="-F"/>
<arg value="final"/>
<arg value="-o"/>
<arg value="${generated}/bridgesupport/${framework.name}.bridgesupport"/>
</exec>
</target>

<target name="gen_bridge_metadata_dylib">
<exec executable="gen_bridge_metadata">
<arg value="-f"/>
<arg value="${framework.name}"/>
<arg value="-F"/>
<arg value="dylib"/>
<arg value="-o"/>
<arg value="${bin}/${framework.name}_BridgeSupport.dylib"/>
</exec>
</target>

<target name="gen_bridge_xml_and_dylib">
<antcall target="gen_bridge_metadata"/>
<antcall target="gen_bridge_metadata_dylib"/>
</target>

<target name="gen_all_bridge_metadata">
<antcall target="gen_bridge_xml_and_dylib">
<param name="framework.name" value="Foundation"/>
</antcall>
<antcall target="gen_bridge_xml_and_dylib">
<param name="framework.name" value="AppKit"/>
</antcall>
</target>

<target name="get_bridgesupport">
<copy file="/System/Library/Frameworks/${framework.name}.framework/Resources/BridgeSupport/${framework.name}.bridgesupport" todir="${generated}/bridgesupport"/>
</target>

<target name="get_all_bridgesupport">
<antcall target="get_bridgesupport">
<param name="framework.name" value="Foundation"/>
</antcall>
<antcall target="get_bridgesupport">
<param name="framework.name" value="AppKit"/>
</antcall>
</target>

<target name="setupdirs">
<mkdir dir="${bin}"/>
<mkdir dir="${generated}"/>
<mkdir dir="${generated}/java"/>
<mkdir dir="${generated}/clojure"/>
<mkdir dir="${generated}/bridgesupport"/>
</target>

<target name="clean">
<delete dir="${bin}"/>
<delete dir="${generated}"/>
</target>
</project>
50 changes: 50 additions & 0 deletions BridgeSupport/src/clojure/couverjure/tools/bsgen.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
(ns couverjure.tools.bsgen
(:use clojure.xml couverjure.type-encoding)
(:import (java.io File)))

(defmulti gen-java :kind)
(defmulti gen-java-ref :kind)

(defmethod gen-java :structure [s]
(format "public class %s {\n%s}"
(:name s)
(apply str (map gen-java (:fields s)))))

(defmethod gen-java :field [f]
(format " public %s %s;\n"
(gen-java-ref (:type f))
(:name f)))

(defmethod gen-java-ref :structure [s]
(:name s))

(defmethod gen-java-ref :array [a]
(format "%s[%d]"
(gen-java-ref (:type a)) (:size a)))

(defmethod gen-java-ref :bitfield [b]
"long")

(defmethod gen-java-ref :pointer [p]
(str (gen-java-ref (:type p)) "ByRef"))

(defmethod gen-java-ref :primitive [p]
(.getName (primitive-java-types (:type p))))

(defn generate-framework-classes
"Generates JNA-based java source files from the .bridgesupport XML file, using the supplied output directory and namespace"
[bsfilename namespace output-dir]
(let [file (File. bsfilename)
xml (xml-seq (parse file))]
(doall (for [elem xml :when (= :struct (:tag elem))]
(let [name (:name (:attrs elem))
type (or (:type64 (:attrs elem)) (:type (:attrs elem)))
objc-type (first (type-encoding type))]
;(when-not objc-type (println type))
(println (gen-java objc-type))
)))
))

(if (= 3 (count *command-line-args*))
(apply generate-framework-classes *command-line-args*)
(println "Usage: bsgen <bridgesupport file> <output-dir> <namespace>"))
4 changes: 2 additions & 2 deletions Core/src/clojure/couverjure/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ The body of the implementation should consist of a set of (method) or (property)
or set releaseOnFinalize and retain"
[value type needs-retain?]
(if (= (:kind type) :primitive)
(let [primitive (:primitive-type type)]
(let [primitive (:type type)]
(condp (fn [set prim] (set prim)) primitive
#{:id}
(if needs-retain?
Expand Down Expand Up @@ -378,7 +378,7 @@ The body of the implementation should consist of a set of (method) or (property)
method-encoding
(.method_getTypeEncoding foundation target-method)
return-sig
(:element-type (first (method-argument-encoding method-encoding))) ; parse first arg from encoding
(:type (first (method-argument-encoding method-encoding))) ; parse first arg from encoding
raw-result
(if super?
(send-super id-or-super sel args)
Expand Down
Loading

0 comments on commit 607d736

Please sign in to comment.