rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 27 Apr 2014 22:40:17 +0200
branchclosure
changeset 1493 234fea368401
parent 1491 4a1398eff4fb
child 1513 ba912ef24b27
permissions -rw-r--r--
Initial infrastructure to export resources
jaroslav@750
     1
/**
jaroslav@750
     2
 * Back 2 Browser Bytecode Translator
jaroslav@750
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@750
     4
 *
jaroslav@750
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@750
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@750
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@750
     8
 *
jaroslav@750
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@750
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@750
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@750
    12
 * GNU General Public License for more details.
jaroslav@750
    13
 *
jaroslav@750
    14
 * You should have received a copy of the GNU General Public License
jaroslav@750
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@750
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@750
    17
 */
jaroslav@750
    18
package org.apidesign.vm4brwsr;
jaroslav@750
    19
jaroslav@750
    20
import com.google.javascript.jscomp.CommandLineRunner;
jaroslav@750
    21
import com.google.javascript.jscomp.SourceFile;
jaroslav@750
    22
import java.io.IOException;
jaroslav@750
    23
import java.io.OutputStream;
jaroslav@750
    24
import java.io.PrintStream;
lubomir@869
    25
import java.util.ArrayList;
jaroslav@750
    26
import java.util.Collections;
jaroslav@750
    27
import java.util.List;
jaroslav@750
    28
import org.apidesign.bck2brwsr.core.ExtraJavaScript;
jaroslav@750
    29
jaroslav@750
    30
/**
jaroslav@750
    31
 *
jaroslav@750
    32
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@750
    33
 */
jaroslav@750
    34
@ExtraJavaScript(processByteCode = false, resource="")
lubomir@869
    35
final class ClosureWrapper extends CommandLineRunner {
lubomir@869
    36
    private static final String[] ARGS = { "--compilation_level", "SIMPLE_OPTIMIZATIONS", "--js", "bck2brwsr-raw.js" /*, "--debug", "--formatting", "PRETTY_PRINT" */ };
jaroslav@750
    37
jaroslav@1493
    38
    private final Bck2Brwsr config;
lubomir@869
    39
lubomir@869
    40
    private String compiledCode;
lubomir@869
    41
    private String externsCode;
lubomir@869
    42
jaroslav@1493
    43
    private ClosureWrapper(Appendable out,
jaroslav@1493
    44
                           String compilationLevel, Bck2Brwsr config) {
jaroslav@750
    45
        super(
lubomir@869
    46
            generateArguments(compilationLevel),
jaroslav@750
    47
            new PrintStream(new APS(out)), System.err
jaroslav@750
    48
        );
jaroslav@1493
    49
        this.config = config;
jaroslav@750
    50
    }
jaroslav@750
    51
jaroslav@750
    52
    @Override
jaroslav@750
    53
    protected List<SourceFile> createInputs(List<String> files, boolean allowStdIn) throws FlagUsageException, IOException {
jaroslav@750
    54
        if (files.size() != 1 || !"bck2brwsr-raw.js".equals(files.get(0))) {
jaroslav@750
    55
            throw new IOException("Unexpected files: " + files);
jaroslav@750
    56
        }
lubomir@869
    57
        return Collections.nCopies(
lubomir@869
    58
                   1,
lubomir@869
    59
                   SourceFile.fromGenerator(
lubomir@869
    60
                       "bck2brwsr-raw.js",
lubomir@869
    61
                       new SourceFile.Generator() {
lubomir@869
    62
                           @Override
lubomir@869
    63
                           public String getCode() {
lubomir@869
    64
                               return getCompiledCode();
lubomir@869
    65
                           }
lubomir@869
    66
                       }));
jaroslav@750
    67
    }
jaroslav@750
    68
lubomir@869
    69
jaroslav@750
    70
    @Override
lubomir@869
    71
    protected List<SourceFile> createExterns()
lubomir@869
    72
            throws FlagUsageException, IOException {
lubomir@869
    73
        final List<SourceFile> externsFiles =
lubomir@869
    74
                new ArrayList<SourceFile>(super.createExterns());
lubomir@869
    75
lubomir@869
    76
        externsFiles.add(
lubomir@869
    77
                SourceFile.fromGenerator(
lubomir@869
    78
                        "bck2brwsr_externs.js",
lubomir@869
    79
                        new SourceFile.Generator() {
lubomir@869
    80
                            @Override
lubomir@869
    81
                            public String getCode() {
lubomir@869
    82
                                return getExternsCode();
lubomir@869
    83
                            }
lubomir@869
    84
                        }));
lubomir@869
    85
        return externsFiles;
lubomir@869
    86
    }
lubomir@869
    87
lubomir@869
    88
    private String getCompiledCode() {
lubomir@869
    89
        if (compiledCode == null) {
jaroslav@750
    90
            StringBuilder sb = new StringBuilder();
jaroslav@750
    91
            try {
jaroslav@1493
    92
                VM.compile(sb, config);
lubomir@869
    93
                compiledCode = sb.toString();
jaroslav@750
    94
            } catch (IOException ex) {
lubomir@869
    95
                compiledCode = ex.getMessage();
jaroslav@750
    96
            }
jaroslav@750
    97
        }
lubomir@869
    98
        return compiledCode;
lubomir@869
    99
    }
lubomir@869
   100
lubomir@869
   101
    private String getExternsCode() {
lubomir@869
   102
        if (externsCode == null) {
lubomir@869
   103
            // need compiled code at this point
lubomir@869
   104
            getCompiledCode();
lubomir@869
   105
lubomir@869
   106
            final StringBuilder sb = new StringBuilder("function RAW() {};\n");
lubomir@1083
   107
            for (final String extern: FIXED_EXTERNS) {
lubomir@869
   108
                sb.append("RAW.prototype.").append(extern).append(";\n");
lubomir@869
   109
            }
lubomir@869
   110
            externsCode = sb.toString();
lubomir@869
   111
        }
lubomir@869
   112
        return externsCode;
jaroslav@750
   113
    }
lubomir@849
   114
jaroslav@750
   115
    private static final class APS extends OutputStream {
jaroslav@750
   116
        private final Appendable out;
jaroslav@750
   117
jaroslav@750
   118
        public APS(Appendable out) {
jaroslav@750
   119
            this.out = out;
jaroslav@750
   120
        }
jaroslav@750
   121
        @Override
jaroslav@750
   122
        public void write(int b) throws IOException {
jaroslav@750
   123
            out.append((char)b);
jaroslav@750
   124
        }
jaroslav@750
   125
    }
lubomir@849
   126
lubomir@869
   127
    private static String[] generateArguments(String compilationLevel) {
lubomir@849
   128
        String[] finalArgs = ARGS.clone();
lubomir@869
   129
        finalArgs[1] = compilationLevel;
lubomir@849
   130
lubomir@849
   131
        return finalArgs;
lubomir@849
   132
    }
lubomir@849
   133
lubomir@1086
   134
    static int produceTo(Appendable output,
jaroslav@1493
   135
        ObfuscationLevel obfuscationLevel,
jaroslav@1493
   136
        Bck2Brwsr config
jaroslav@1493
   137
    ) throws IOException {
lubomir@1086
   138
        final ClosureWrapper cw =
lubomir@1086
   139
                new ClosureWrapper(output,
lubomir@1086
   140
                                   (obfuscationLevel == ObfuscationLevel.FULL)
lubomir@1086
   141
                                           ? "ADVANCED_OPTIMIZATIONS"
lubomir@1086
   142
                                           : "SIMPLE_OPTIMIZATIONS",
jaroslav@1493
   143
                                   config);
jaroslav@750
   144
        try {
jaroslav@750
   145
            return cw.doRun();
jaroslav@750
   146
        } catch (FlagUsageException ex) {
jaroslav@750
   147
            throw new IOException(ex);
jaroslav@750
   148
        }
jaroslav@750
   149
    }
lubomir@869
   150
lubomir@1083
   151
    private static final String[] FIXED_EXTERNS = {
lubomir@1083
   152
        "bck2brwsr",
lubomir@1147
   153
        "bck2BrwsrCnvrt",
lubomir@1094
   154
        "registerExtension",
lubomir@1083
   155
        "$class",
lubomir@1083
   156
        "anno",
lubomir@1083
   157
        "array",
lubomir@1083
   158
        "access",
lubomir@1083
   159
        "cls",
lubomir@1083
   160
        "vm",
lubomir@1083
   161
        "loadClass",
lubomir@1083
   162
        "loadBytes",
lubomir@1083
   163
        "jvmName",
lubomir@1083
   164
        "primitive",
lubomir@1083
   165
        "superclass",
lubomir@1083
   166
        "cnstr",
lubomir@1083
   167
        "add32",
lubomir@1083
   168
        "sub32",
lubomir@1083
   169
        "mul32",
lubomir@1083
   170
        "neg32",
lubomir@1083
   171
        "toInt8",
lubomir@1083
   172
        "toInt16",
lubomir@1083
   173
        "next32",
lubomir@1083
   174
        "high32",
lubomir@1083
   175
        "toInt32",
lubomir@1083
   176
        "toFP",
lubomir@1083
   177
        "toLong",
lubomir@1083
   178
        "toExactString",
lubomir@1083
   179
        "add64",
lubomir@1083
   180
        "sub64",
lubomir@1083
   181
        "mul64",
lubomir@1083
   182
        "and64",
lubomir@1083
   183
        "or64",
lubomir@1083
   184
        "xor64",
lubomir@1083
   185
        "shl64",
lubomir@1083
   186
        "shr64",
lubomir@1083
   187
        "ushr64",
lubomir@1083
   188
        "compare64",
lubomir@1083
   189
        "neg64",
lubomir@1083
   190
        "div32",
lubomir@1083
   191
        "mod32",
lubomir@1083
   192
        "div64",
lubomir@1083
   193
        "mod64",
lubomir@1083
   194
        "at",
lubomir@1083
   195
        "getClass__Ljava_lang_Class_2",
lubomir@1083
   196
        "clone__Ljava_lang_Object_2"
lubomir@1083
   197
    };
jaroslav@750
   198
}