Skip to content

Instantly share code, notes, and snippets.

@calavera
Created March 24, 2011 02:21
Show Gist options
  • Save calavera/884436 to your computer and use it in GitHub Desktop.
Save calavera/884436 to your computer and use it in GitHub Desktop.
From b366b503ba091d345b37484b62a11700dec37dd5 Mon Sep 17 00:00:00 2001
From: David Calavera <[email protected]>
Date: Wed, 23 Mar 2011 19:09:47 -0700
Subject: [PATCH] fix JRUBY-5638: jrubyc path output
---
lib/ruby/site_ruby/shared/jruby/compiler.rb | 12 ++++++--
src/org/jruby/util/JavaNameMangler.java | 36 +++++++++++++++-----------
2 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/lib/ruby/site_ruby/shared/jruby/compiler.rb b/lib/ruby/site_ruby/shared/jruby/compiler.rb
index 6610ddc..240d47a 100644
--- a/lib/ruby/site_ruby/shared/jruby/compiler.rb
+++ b/lib/ruby/site_ruby/shared/jruby/compiler.rb
@@ -23,7 +23,8 @@ module JRuby::Compiler
:classpath => [],
:javac_options => [],
:sha1 => false,
- :handles => false
+ :handles => false,
+ :preserve_paths => false
}
end
module_function :default_options
@@ -75,6 +76,10 @@ module JRuby::Compiler
options[:handles] = true
end
+ opts.on('--preserve-paths', 'Do not mangle class paths') do
+ options[:preserve_paths] = true
+ end
+
opts.parse!(argv)
end
@@ -98,7 +103,8 @@ module JRuby::Compiler
:javac_options => javac_options,
:classpath => classpath,
:sha1 => false,
- :handles => false
+ :handles => false,
+ :preserve_paths => false
)
end
module_function :compile_files
@@ -120,7 +126,7 @@ module JRuby::Compiler
if options[:sha1]
pathname = "ruby.jit.FILE_" + Digest::SHA1.hexdigest(File.read(filename)).upcase
else
- pathname = Mangler.mangle_filename_for_classpath(filename, options[:basedir], options[:prefix])
+ pathname = Mangler.mangle_filename_for_classpath(filename, options[:basedir], options[:prefix], true, options[:preserve_paths])
end
inspector = org.jruby.compiler.ASTInspector.new
diff --git a/src/org/jruby/util/JavaNameMangler.java b/src/org/jruby/util/JavaNameMangler.java
index de6b7c5..b98c719 100644
--- a/src/org/jruby/util/JavaNameMangler.java
+++ b/src/org/jruby/util/JavaNameMangler.java
@@ -15,24 +15,25 @@ import java.util.regex.Pattern;
*/
public class JavaNameMangler {
public static final Pattern PATH_SPLIT = Pattern.compile("[/\\\\]");
-
+
public static String mangledFilenameForStartupClasspath(String filename) {
if (filename.equals("-e")) {
return "ruby/__dash_e__";
}
-
+
return mangleFilenameForClasspath(filename, null, "", false);
}
-
+
public static String mangleFilenameForClasspath(String filename) {
return mangleFilenameForClasspath(filename, null, "ruby");
}
-
+
public static String mangleFilenameForClasspath(String filename, String parent, String prefix) {
- return mangleFilenameForClasspath(filename, parent, prefix, true);
+ return mangleFilenameForClasspath(filename, parent, prefix, true, false);
}
-
- public static String mangleFilenameForClasspath(String filename, String parent, String prefix, boolean canonicalize) {
+
+ public static String mangleFilenameForClasspath(String filename, String parent, String prefix, boolean canonicalize,
+ boolean preserveIdentifiers) {
try {
String classPath = "";
if(filename.indexOf("!") != -1) {
@@ -74,25 +75,30 @@ public class JavaNameMangler {
int parentLength = parentPath.length();
classPath = classPath.substring(parentLength);
}
-
+
String[] pathElements = PATH_SPLIT.split(classPath);
StringBuilder newPath = new StringBuilder(prefix);
-
+
for (String element : pathElements) {
if (element.length() <= 0) {
continue;
}
-
+
if (newPath.length() > 0) {
newPath.append("/");
}
-
+
if (!Character.isJavaIdentifierStart(element.charAt(0))) {
newPath.append("$");
}
- newPath.append(mangleStringForCleanJavaIdentifier(element));
+
+ String pathId = element;
+ if (!preserveIdentifiers) {
+ pathId = mangleStringForCleanJavaIdentifier(element);
+ }
+ newPath.append(pathId);
}
-
+
// strip off "_dot_rb" for .rb files
int dotRbIndex = newPath.indexOf("_dot_rb");
if (dotRbIndex != -1 && dotRbIndex == newPath.length() - 7) {
@@ -105,7 +111,7 @@ public class JavaNameMangler {
throw new RuntimeException(ioe);
}
}
-
+
public static String mangleStringForCleanJavaIdentifier(String name) {
char[] characters = name.toCharArray();
StringBuilder cleanBuffer = new StringBuilder();
@@ -203,7 +209,7 @@ public class JavaNameMangler {
public static String demangleMethodName(String name) {
if (!name.startsWith(NULL_ESCAPE)) return name;
-
+
StringBuilder builder = new StringBuilder();
for (int i = 2; i < name.length(); i++) {
char candidate = name.charAt(i);
--
1.7.4.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment