From ff1f5bdcdffcef48518897156d131bcd28e4fbd6 Mon Sep 17 00:00:00 2001 From: Tom Robinson Date: Fri, 3 Oct 2008 03:22:19 -0700 Subject: [PATCH] Fixed press to work with static'd app code and toll free bridging [#83 state:resolved responsible:tlrobinson] [#84 state:resolved responsible:tlrobinson] --- Tools/press/objj-analysis-tools.j | 55 ++++++++++++++++++++++++++----- Tools/press/press.j | 21 +++++++----- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/Tools/press/objj-analysis-tools.j b/Tools/press/objj-analysis-tools.j index e073e4363..1dc7b9676 100644 --- a/Tools/press/objj-analysis-tools.j +++ b/Tools/press/objj-analysis-tools.j @@ -192,15 +192,48 @@ function findGlobalDefines(context, scope, rootPath) // // return result; //} + + var needsPatch = true; + + var fragment_evaluate_file_original = scope.fragment_evaluate_file; + scope.fragment_evaluate_file = function(aFragment) + { + // patch Foundation.j (HACK for Rhino bug #374918) + if (needsPatch && aFragment.file && (/Foundation\.j$/).test(aFragment.file.path)) + { + CPLog.error("Patching Foundation.j"); + + var patchFragment = new objj_fragment(); + patchFragment.info = "__RHINO_FIRST_SCOPE.String.prototype.isa=CPString;__RHINO_FIRST_SCOPE.Number.prototype.isa=CPNumber;__RHINO_FIRST_SCOPE.Boolean.prototype.isa=CPNumber;print('PATCHED!');"; + patchFragment.type = FRAGMENT_CODE; + patchFragment.file = aFragment.file; + patchFragment.bundle = aFragment.bundle; + patchFragment.context = aFragment.context; + + for (var i = 0; i < aFragment.context.fragments.length; i++) + { + if ((aFragment.context.fragments[i].type & FRAGMENT_IMPORT) && (/Foundation\//).test(aFragment.context.fragments[i].info)) + { + CPLog.error("Inserting patch"); + aFragment.context.fragments.splice(i, 0, patchFragment); + break; + } + } + + needsPatch = false; + } + + return fragment_evaluate_file_original(aFragment); + } - scope.fragment_evaluate_code_original = scope.fragment_evaluate_code; + var fragment_evaluate_code_original = scope.fragment_evaluate_code; scope.fragment_evaluate_code = function(aFragment) { CPLog.debug("Evaling "+aFragment.file.path + " / " + aFragment.bundle.path); var before = cloneProperties(scope); - - var result = scope.fragment_evaluate_code_original(aFragment); + + var result = fragment_evaluate_code_original(aFragment); var definedGlobals = {}; diff(before, scope, ignore, definedGlobals, definedGlobals, null); @@ -257,14 +290,18 @@ function makeObjjScope(context, debug) } // give the scope "print" - scope.print = function(value) { Packages.java.lang.System.out.println(value); }; + scope.print = function(value) { Packages.java.lang.System.out.println(String(value)); }; + + // HACK for Rhino bug #374918 (fix toll free bridging) + scope.__RHINO_FIRST_SCOPE = this; + CPLog.info("__RHINO_FIRST_SCOPE="+scope.__RHINO_FIRST_SCOPE); // load and eval fake browser environment - var envSource = readFile(envPath); - if (envSource) - context.evaluateString(scope, envSource, "env.js", 1, null); - else - CPLog.warn("Missing env.js"); + //var envSource = readFile(envPath); + //if (envSource) + // context.evaluateString(scope, envSource, "env.js", 1, null); + //else + // CPLog.warn("Missing env.js"); // load and eval the bridge var bridgeSource = readFile(bridgePath); diff --git a/Tools/press/press.j b/Tools/press/press.j index 45283d5ed..c5e7aec27 100644 --- a/Tools/press/press.j +++ b/Tools/press/press.j @@ -4,7 +4,6 @@ import "objj-analysis-tools.j" CPLogRegister(CPLogPrint); - function main() { var rootPath = null, @@ -33,7 +32,6 @@ function main() print("Usage: press input_base_file.j output_directory"); return; } - var rootPath = args[0], sourceDirectory = dirname(rootPath) || ".", @@ -44,11 +42,9 @@ function main() var frameworks = rootPath.substring(0, rootPath.lastIndexOf("/")+1) + "Frameworks/"; scope.OBJJ_INCLUDE_PATHS = [frameworks]; - CPLog.info("OBJJ_INCLUDE_PATHS="+scope.OBJJ_INCLUDE_PATHS); // phase 1: get global defines - var globals = findGlobalDefines(cx, scope, rootPath); // coalesce the results @@ -73,6 +69,7 @@ function main() } } + requiredFiles[rootPath] = true; traverseDependencies(context, scope.objj_files[rootPath]); var count = 0, @@ -272,7 +269,7 @@ function pathRelativeTo(target, relativeTo) { var components = [], targetParts = target.split("/"), - relativeParts = relativeTo.split("/"); + relativeParts = relativeTo ? relativeTo.split("/") : []; var i = 0; while (i < targetParts.length) @@ -287,12 +284,16 @@ function pathRelativeTo(target, relativeTo) for (var j = i; j < targetParts.length; j++) components.push(targetParts[j]); - - return components.join("/"); + + var result = components.join("/"); + + return result; } function exec() { + var printOutput = false; + var runtime = Packages.java.lang.Runtime.getRuntime() var p = runtime.exec.apply(runtime, arguments); @@ -308,13 +309,15 @@ function exec() if (s = stdout.readLine()) { stdoutString += s; - CPLog.info("exec: " + s); + if (printOutput) + CPLog.info("exec: " + s); done = false; } if (s = stderr.readLine()) { stderrString += s; - CPLog.warn("exec: " + s); + //if (printOutput) + CPLog.warn("exec: " + s); done = false; } }