Skip to content

Commit 8833102

Browse files
Refactor std.native functions out of Std (#442)
In this PR, I move xz/gzip/regex outside of Std, and move testing infrastructure to per-language directory.
1 parent d31222a commit 8833102

30 files changed

Lines changed: 210 additions & 169 deletions

bench/src/main/scala/sjsonnet/MainBenchmark.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ object MainBenchmark {
3333
Map.empty[String, String],
3434
Map.empty[String, String],
3535
OsPath(wd),
36-
importer = SjsonnetMain
36+
importer = SjsonnetMainBase
3737
.resolveImport(config.getOrderedJpaths.map(os.Path(_, wd)).map(OsPath(_)), None),
3838
parseCache = parseCache
3939
)
@@ -65,7 +65,7 @@ class MainBenchmark {
6565
@Benchmark
6666
def main(bh: Blackhole): Unit = {
6767
bh.consume(
68-
SjsonnetMain.main0(
68+
SjsonnetMainBase.main0(
6969
MainBenchmark.mainArgs,
7070
new DefaultParseCache,
7171
System.in,
@@ -102,7 +102,7 @@ object MemoryBenchmark {
102102
} else {
103103
false
104104
}
105-
SjsonnetMain.main0(
105+
SjsonnetMainBase.main0(
106106
MainBenchmark.mainArgs,
107107
cache,
108108
System.in,

bench/src/main/scala/sjsonnet/MaterializerBenchmark.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class MaterializerBenchmark {
3232
Map.empty[String, String],
3333
Map.empty[String, String],
3434
OsPath(wd),
35-
importer = SjsonnetMain
35+
importer = SjsonnetMainBase
3636
.resolveImport(
3737
config.getOrderedJpaths.map(os.Path(_, wd)).map(OsPath(_)).toIndexedSeq,
3838
None

bench/src/main/scala/sjsonnet/MultiThreadedBenchmark.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class MultiThreadedBenchmark {
3939
pool.submit {
4040
(() =>
4141
if (
42-
SjsonnetMain.main0(
42+
SjsonnetMainBase.main0(
4343
MainBenchmark.mainArgs,
4444
cache, // new DefaultParseCache
4545
System.in,

bench/src/main/scala/sjsonnet/RunProfiler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ object RunProfiler extends App {
1515
Map.empty[String, String],
1616
Map.empty[String, String],
1717
OsPath(wd),
18-
importer = SjsonnetMain
18+
importer = SjsonnetMainBase
1919
.resolveImport(config.getOrderedJpaths.map(os.Path(_, wd)).map(OsPath(_)).toIndexedSeq, None),
2020
parseCache = parseCache
2121
) {

build.mill

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ object sjsonnet extends VersionFileModule {
102102
def jsEnvConfig = JsEnvConfig.NodeJs(args = List("--stack-size=" + stackSizekBytes))
103103
def resources = T.sources(
104104
this.millSourcePath / "resources" / "test_suite",
105-
this.millSourcePath / "resources" / "go_test_suite"
105+
this.millSourcePath / "resources" / "go_test_suite",
106+
this.millSourcePath / "resources" / "new_test_suite",
106107
)
107108
def generatedSources = T {
108109
resources().map(_.path).flatMap { testSuite =>

sjsonnet/server/src/sjsonnet/SjsonnetServerMain.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ object SjsonnetServerMain extends SjsonnetServerMain[DefaultParseCache] {
8080
scala.Console.withIn(stdin) {
8181
scala.Console.withOut(stdout) {
8282
scala.Console.withErr(stderr) {
83-
sjsonnet.SjsonnetMain.main0(args, stateCache2, stdin, stdout, stderr, wd) == 0
83+
sjsonnet.SjsonnetMainBase.main0(args, stateCache2, stdin, stdout, stderr, wd) == 0
8484
}
8585
}
8686
}

sjsonnet/src-js/sjsonnet/Platform.scala

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,11 @@ package sjsonnet
22

33
import org.virtuslab.yaml.*
44

5-
import java.io.File
65
import java.util
76
import java.util.regex.Pattern
87
import scala.collection.mutable
98

109
object Platform {
11-
def gzipBytes(s: Array[Byte]): String = {
12-
throw new Exception("GZip not implemented in Scala.js")
13-
}
14-
def gzipString(s: String): String = {
15-
throw new Exception("GZip not implemented in Scala.js")
16-
}
17-
def xzBytes(s: Array[Byte], compressionLevel: Option[Int]): String = {
18-
throw new Exception("XZ not implemented in Scala.js")
19-
}
20-
def xzString(s: String, compressionLevel: Option[Int]): String = {
21-
throw new Exception("XZ not implemented in Scala.js")
22-
}
23-
2410
private def nodeToJson(node: Node): ujson.Value = node match {
2511
case _: Node.ScalarNode =>
2612
YamlDecoder.forAny.construct(node).getOrElse("") match {
@@ -98,9 +84,6 @@ object Platform {
9884
def sha3(s: String): String = {
9985
throw new Exception("SHA3 not implemented in Scala.js")
10086
}
101-
def hashFile(file: File): String = {
102-
throw new Exception("hashFile not implemented in Scala.js")
103-
}
10487

10588
private val regexCache = new util.concurrent.ConcurrentHashMap[String, Pattern]
10689
private val namedGroupPattern = Pattern.compile("\\(\\?<(.+?)>.*?\\)")

sjsonnet/src-js/sjsonnet/SjsonnetMain.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package sjsonnet
22

3+
import sjsonnet.stdlib.NativeRegex
4+
35
import scala.collection.mutable
46
import scala.scalajs.js
57
import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel}
@@ -39,7 +41,8 @@ object SjsonnetMain {
3941
}
4042
},
4143
parseCache = new DefaultParseCache,
42-
new Settings(preserveOrder = preserveOrder)
44+
settings = new Settings(preserveOrder = preserveOrder),
45+
std = new Std(nativeFunctions = Map.from(new NativeRegex().functions)).Std
4346
)
4447
interp.interpret0(text, JsVirtualPath("(memory)"), ujson.WebJson.Builder) match {
4548
case Left(msg) => throw new js.JavaScriptException(msg)

sjsonnet/src-jvm-native/sjsonnet/SjsonnetMain.scala renamed to sjsonnet/src-jvm-native/sjsonnet/SjsonnetMainBase.scala

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import java.nio.file.NoSuchFileException
1313
import scala.annotation.unused
1414
import scala.util.Try
1515

16-
object SjsonnetMain {
16+
object SjsonnetMainBase {
1717
def resolveImport(
1818
searchRoots0: Seq[Path], // Evaluated in order, first occurrence wins
1919
allowedInputs: Option[Set[os.Path]] = None,
@@ -60,19 +60,6 @@ object SjsonnetMain {
6060
}
6161
}
6262

63-
def main(args: Array[String]): Unit = {
64-
val exitCode = main0(
65-
args,
66-
new DefaultParseCache,
67-
System.in,
68-
System.out,
69-
System.err,
70-
os.pwd,
71-
None
72-
)
73-
System.exit(exitCode)
74-
}
75-
7663
def main0(
7764
args: Array[String],
7865
parseCache: ParseCache,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package sjsonnet.stdlib
2+
3+
import sjsonnet.functions.AbstractFunctionModule
4+
import sjsonnet.{Error, EvalScope, Lazy, Platform, Position, Val}
5+
6+
class NativeGzip extends AbstractFunctionModule {
7+
def name = "gzip"
8+
9+
val functions: Seq[(String, Val.Builtin)] = Seq(
10+
"gzip" -> new Val.Builtin1("gzip", "v") {
11+
override def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = v.force match {
12+
case Val.Str(_, value) => Val.Str(pos, Platform.gzipString(value))
13+
case arr: Val.Arr =>
14+
Val.Str(pos, Platform.gzipBytes(arr.iterator.map(_.cast[Val.Num].asInt.toByte).toArray))
15+
case x => Error.fail("Cannot gzip encode " + x.prettyName)
16+
}
17+
}
18+
)
19+
}

0 commit comments

Comments
 (0)