From e64439850587e154d6a02eb8b779ed13552e06a7 Mon Sep 17 00:00:00 2001 From: Stan Hebben Date: Sun, 20 Jul 2014 22:24:50 +0200 Subject: [PATCH] - Fixed crash when using mt command from server console - Forum command now leads to the new forums - Checked in some missing files from previous commit --- .gitignore | 1 + .../MineTweakerImplementationAPI.java | 2 +- MineTweaker3-MC164-Main/build.gradle | 2 +- .../minetweaker/mc164/server/MCServer.java | 10 +- .../mc164/server/ServerPlayer.java | 93 ++++ MineTweaker3-MC1710-Main/build.gradle | 2 +- .../minetweaker/mc1710/server/MCServer.java | 8 + .../mc1710/server/ServerPlayer.java | 93 ++++ MineTweaker3-MC172-Main/build.gradle | 2 +- .../minetweaker/mc172/server/MCServer.java | 10 +- .../mc172/server/ServerPlayer.java | 93 ++++ MineTweaker3-Web/images/icon48.png | Bin 0 -> 5596 bytes .../expression/ExpressionStringContains.java | 42 ++ .../expression/ExpressionStringIndex.java | 45 ++ .../zenscript/util/AnyClassWriter.java | 425 ++++++++++++++++++ .../zenscript/util/IAnyDefinition.java | 87 ++++ .../builtin/expansion/IByteExpansion.java | 17 + 17 files changed, 923 insertions(+), 9 deletions(-) create mode 100644 MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/ServerPlayer.java create mode 100644 MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/ServerPlayer.java create mode 100644 MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/ServerPlayer.java create mode 100644 MineTweaker3-Web/images/icon48.png create mode 100644 ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringContains.java create mode 100644 ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringIndex.java create mode 100644 ZenScript/src/main/java/stanhebben/zenscript/util/AnyClassWriter.java create mode 100644 ZenScript/src/main/java/stanhebben/zenscript/util/IAnyDefinition.java create mode 100644 ZenScript/src/main/java/stanhebben/zenscript/value/builtin/expansion/IByteExpansion.java diff --git a/.gitignore b/.gitignore index 4f3f251..84394bb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ run /MineTweaker3-Web/nbproject/private/ /MineTweaker3-Web/doc /MineTweaker3-MC164-Main/eclipse +/ZenScript-Test diff --git a/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java b/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java index 20e56ea..a442b9d 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java +++ b/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java @@ -257,7 +257,7 @@ public class MineTweakerImplementationAPI { }, new ICommandFunction() { @Override public void execute(String[] arguments, IPlayer player) { - player.openBrowser("http://www.minecraftforum.net/topic/1886008-164-17x-minetweaker-3-customize-your-minecraft-experience"); + player.openBrowser("http://minetweaker3.powerofbytes.com/forum"); } })); diff --git a/MineTweaker3-MC164-Main/build.gradle b/MineTweaker3-MC164-Main/build.gradle index b2612f8..1fa098a 100644 --- a/MineTweaker3-MC164-Main/build.gradle +++ b/MineTweaker3-MC164-Main/build.gradle @@ -15,7 +15,7 @@ buildscript { apply plugin: 'forge' -version = "1.6.4-3.0.3" +version = "1.6.4-3.0.6" //group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = project.projectDir.name diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/MCServer.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/MCServer.java index 7b02c12..f425def 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/MCServer.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/MCServer.java @@ -10,7 +10,6 @@ import java.util.Arrays; import java.util.List; import minetweaker.IUndoableAction; import minetweaker.MineTweakerAPI; -import minetweaker.MineTweakerImplementationAPI; import minetweaker.api.minecraft.MineTweakerMC; import minetweaker.api.player.IPlayer; import minetweaker.api.server.AbstractServer; @@ -22,6 +21,7 @@ import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; /** * @@ -53,14 +53,18 @@ public class MCServer extends AbstractServer { @Override public boolean isOp(IPlayer player) { return MinecraftServer.getServer().getConfigurationManager().getOps().isEmpty() - || MinecraftServer.getServer().getConfigurationManager().getOps().contains(player.getName()); + || MinecraftServer.getServer().getConfigurationManager().getOps().contains(player.getName()) + || player == ServerPlayer.INSTANCE; } private static IPlayer getPlayer(ICommandSender commandSender) { if (commandSender instanceof EntityPlayer) { return MineTweakerMC.getIPlayer((EntityPlayer) commandSender); + } else if (commandSender instanceof DedicatedServer) { + return ServerPlayer.INSTANCE; } else { - System.out.println("No such player: " + commandSender); + System.out.println("Unsupported command sender: " + commandSender); + System.out.println("player name: " + commandSender.getCommandSenderName()); return null; } } diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/ServerPlayer.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/ServerPlayer.java new file mode 100644 index 0000000..54ab68a --- /dev/null +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/server/ServerPlayer.java @@ -0,0 +1,93 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc164.server; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.util.logging.Level; +import java.util.logging.Logger; +import minetweaker.api.chat.IChatMessage; +import minetweaker.api.data.IData; +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.util.ChatMessageComponent; + +/** + * + * @author Stan + */ +public class ServerPlayer implements IPlayer { + public static final ServerPlayer INSTANCE = new ServerPlayer(); + + private ServerPlayer() { + + } + + @Override + public String getId() { + return "server"; + } + + @Override + public String getName() { + return "Server"; + } + + @Override + public IData getData() { + // TODO: implement + return null; + } + + @Override + public void update(IData data) { + // TODO: implement + } + + @Override + public void sendChat(IChatMessage message) { + DedicatedServer.getServer().sendChatToPlayer((ChatMessageComponent) message.getInternal()); + } + + @Override + public int getHotbarSize() { + return 0; + } + + @Override + public IItemStack getHotbarStack(int i) { + return null; + } + + @Override + public int getInventorySize() { + return 0; + } + + @Override + public IItemStack getInventoryStack(int i) { + return null; + } + + @Override + public IItemStack getCurrentItem() { + return null; + } + + @Override + public void openBrowser(String url) { + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(URI.create(url)); + } catch (IOException ex) { + Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex); + } + } + } +} diff --git a/MineTweaker3-MC1710-Main/build.gradle b/MineTweaker3-MC1710-Main/build.gradle index 8e46a80..67f58c8 100644 --- a/MineTweaker3-MC1710-Main/build.gradle +++ b/MineTweaker3-MC1710-Main/build.gradle @@ -19,7 +19,7 @@ buildscript { apply plugin: 'forge' minecraft{version = "1.7.10-10.13.0.1160"} -version = "1.7.10-3.0.3" +version = "1.7.10-3.0.6" archivesBaseName = project.projectDir.name dependencies { diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/MCServer.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/MCServer.java index f3182d7..0450c78 100644 --- a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/MCServer.java +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/MCServer.java @@ -21,6 +21,7 @@ import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.management.UserListOps; /** @@ -52,6 +53,9 @@ public class MCServer extends AbstractServer { @Override public boolean isOp(IPlayer player) { + if (player == ServerPlayer.INSTANCE) + return true; + UserListOps ops = MinecraftServer.getServer().getConfigurationManager().func_152603_m(); if (server.isDedicatedServer()) { return ops.func_152690_d() || ops.func_152700_a(player.getName()) != null; @@ -63,7 +67,11 @@ public class MCServer extends AbstractServer { private static IPlayer getPlayer(ICommandSender commandSender) { if (commandSender instanceof EntityPlayer) { return MineTweakerMC.getIPlayer((EntityPlayer) commandSender); + } else if (commandSender instanceof DedicatedServer) { + return ServerPlayer.INSTANCE; } else { + System.out.println("Unsupported command sender: " + commandSender); + System.out.println("player name: " + commandSender.getCommandSenderName()); return null; } } diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/ServerPlayer.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/ServerPlayer.java new file mode 100644 index 0000000..ad5ef7f --- /dev/null +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/server/ServerPlayer.java @@ -0,0 +1,93 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc1710.server; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.util.logging.Level; +import java.util.logging.Logger; +import minetweaker.api.chat.IChatMessage; +import minetweaker.api.data.IData; +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.util.IChatComponent; + +/** + * + * @author Stan + */ +public class ServerPlayer implements IPlayer { + public static final ServerPlayer INSTANCE = new ServerPlayer(); + + private ServerPlayer() { + + } + + @Override + public String getId() { + return "server"; + } + + @Override + public String getName() { + return "Server"; + } + + @Override + public IData getData() { + // TODO: implement + return null; + } + + @Override + public void update(IData data) { + // TODO: implement + } + + @Override + public void sendChat(IChatMessage message) { + DedicatedServer.getServer().addChatMessage((IChatComponent) message.getInternal()); + } + + @Override + public int getHotbarSize() { + return 0; + } + + @Override + public IItemStack getHotbarStack(int i) { + return null; + } + + @Override + public int getInventorySize() { + return 0; + } + + @Override + public IItemStack getInventoryStack(int i) { + return null; + } + + @Override + public IItemStack getCurrentItem() { + return null; + } + + @Override + public void openBrowser(String url) { + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(URI.create(url)); + } catch (IOException ex) { + Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex); + } + } + } +} diff --git a/MineTweaker3-MC172-Main/build.gradle b/MineTweaker3-MC172-Main/build.gradle index f89a019..89fdc04 100644 --- a/MineTweaker3-MC172-Main/build.gradle +++ b/MineTweaker3-MC172-Main/build.gradle @@ -19,7 +19,7 @@ buildscript { apply plugin: 'forge' minecraft{version = "1.7.2-10.12.2.1121"} -version = "1.7.2-3.0.3" +version = "1.7.2-3.0.6" archivesBaseName = project.projectDir.name dependencies { diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/MCServer.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/MCServer.java index 4c6e952..bface92 100644 --- a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/MCServer.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/MCServer.java @@ -21,6 +21,7 @@ import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; /** * @@ -51,14 +52,19 @@ public class MCServer extends AbstractServer { @Override public boolean isOp(IPlayer player) { - return MinecraftServer.getServer().getConfigurationManager().getOps().isEmpty() - || MinecraftServer.getServer().getConfigurationManager().getOps().contains(player.getName()); + return (MinecraftServer.getServer().getConfigurationManager().getOps().isEmpty() + || MinecraftServer.getServer().getConfigurationManager().getOps().contains(player.getName())) + || player == ServerPlayer.INSTANCE; } private static IPlayer getPlayer(ICommandSender commandSender) { if (commandSender instanceof EntityPlayer) { return MineTweakerMC.getIPlayer((EntityPlayer) commandSender); + } else if (commandSender instanceof DedicatedServer) { + return ServerPlayer.INSTANCE; } else { + System.out.println("Unsupported command sender: " + commandSender); + System.out.println("player name: " + commandSender.getCommandSenderName()); return null; } } diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/ServerPlayer.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/ServerPlayer.java new file mode 100644 index 0000000..2b16e3a --- /dev/null +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/server/ServerPlayer.java @@ -0,0 +1,93 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.mc172.server; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.util.logging.Level; +import java.util.logging.Logger; +import minetweaker.api.chat.IChatMessage; +import minetweaker.api.data.IData; +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.util.IChatComponent; + +/** + * + * @author Stan + */ +public class ServerPlayer implements IPlayer { + public static final ServerPlayer INSTANCE = new ServerPlayer(); + + private ServerPlayer() { + + } + + @Override + public String getId() { + return "server"; + } + + @Override + public String getName() { + return "Server"; + } + + @Override + public IData getData() { + // TODO: implement + return null; + } + + @Override + public void update(IData data) { + // TODO: implement + } + + @Override + public void sendChat(IChatMessage message) { + DedicatedServer.getServer().addChatMessage((IChatComponent) message.getInternal()); + } + + @Override + public int getHotbarSize() { + return 0; + } + + @Override + public IItemStack getHotbarStack(int i) { + return null; + } + + @Override + public int getInventorySize() { + return 0; + } + + @Override + public IItemStack getInventoryStack(int i) { + return null; + } + + @Override + public IItemStack getCurrentItem() { + return null; + } + + @Override + public void openBrowser(String url) { + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(URI.create(url)); + } catch (IOException ex) { + Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex); + } + } + } +} diff --git a/MineTweaker3-Web/images/icon48.png b/MineTweaker3-Web/images/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..be4dc75610bd180e46c323068fcd66bba42375f2 GIT binary patch literal 5596 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 qpTFntJ&pW7SnTM3@!x2)wEhQkf literal 0 HcmV?d00001 diff --git a/ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringContains.java b/ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringContains.java new file mode 100644 index 0000000..ad1c1b9 --- /dev/null +++ b/ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringContains.java @@ -0,0 +1,42 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package stanhebben.zenscript.expression; + +import stanhebben.zenscript.compiler.IEnvironmentMethod; +import stanhebben.zenscript.type.ZenType; +import stanhebben.zenscript.util.ZenPosition; + +/** + * + * @author Stan + */ +public class ExpressionStringContains extends Expression { + private final Expression haystack; + private final Expression needle; + + public ExpressionStringContains(ZenPosition position, Expression haystack, Expression needle) { + super(position); + + this.haystack = haystack; + this.needle = needle; + } + + @Override + public ZenType getType() { + return ZenType.STRING; + } + + @Override + public void compile(boolean result, IEnvironmentMethod environment) { + haystack.compile(result, environment); + needle.compile(result, environment); + + if (result) { + environment.getOutput().invokeVirtual(String.class, "contains", CharSequence.class); + } + } +} diff --git a/ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringIndex.java b/ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringIndex.java new file mode 100644 index 0000000..c7dd845 --- /dev/null +++ b/ZenScript/src/main/java/stanhebben/zenscript/expression/ExpressionStringIndex.java @@ -0,0 +1,45 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package stanhebben.zenscript.expression; + +import stanhebben.zenscript.compiler.IEnvironmentMethod; +import stanhebben.zenscript.type.ZenType; +import stanhebben.zenscript.util.ZenPosition; + +/** + * + * @author Stan + */ +public class ExpressionStringIndex extends Expression { + private final Expression source; + private final Expression index; + + public ExpressionStringIndex(ZenPosition position, Expression source, Expression index) { + super(position); + + this.source = source; + this.index = index; + } + + @Override + public ZenType getType() { + return ZenType.STRING; + } + + @Override + public void compile(boolean result, IEnvironmentMethod environment) { + source.compile(result, environment); + index.compile(result, environment); + + if (result) { + environment.getOutput().dup(); + environment.getOutput().iConst1(); + environment.getOutput().iAdd(); + environment.getOutput().invokeVirtual(String.class, "substring", String.class, int.class, int.class); + } + } +} diff --git a/ZenScript/src/main/java/stanhebben/zenscript/util/AnyClassWriter.java b/ZenScript/src/main/java/stanhebben/zenscript/util/AnyClassWriter.java new file mode 100644 index 0000000..c71b8ab --- /dev/null +++ b/ZenScript/src/main/java/stanhebben/zenscript/util/AnyClassWriter.java @@ -0,0 +1,425 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package stanhebben.zenscript.util; + +import java.util.Iterator; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; +import stanhebben.zenscript.type.natives.JavaMethod; +import static stanhebben.zenscript.util.ZenTypeUtil.EMPTY_REGISTRY; +import static stanhebben.zenscript.util.ZenTypeUtil.internal; +import static stanhebben.zenscript.util.ZenTypeUtil.signature; +import stanhebben.zenscript.value.IAny; + +/** + * + * @author Stan + */ +public class AnyClassWriter { + public static final JavaMethod METHOD_NOT = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "not"); + public static final JavaMethod METHOD_NEG = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "neg"); + public static final JavaMethod METHOD_ADD = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "add", IAny.class); + public static final JavaMethod METHOD_CAT = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "cat", IAny.class); + public static final JavaMethod METHOD_SUB = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "sub", IAny.class); + public static final JavaMethod METHOD_MUL = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "mul", IAny.class); + public static final JavaMethod METHOD_DIV = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "div", IAny.class); + public static final JavaMethod METHOD_MOD = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "mod", IAny.class); + public static final JavaMethod METHOD_AND = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "and", IAny.class); + public static final JavaMethod METHOD_OR = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "or", IAny.class); + public static final JavaMethod METHOD_XOR = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "xor", IAny.class); + public static final JavaMethod METHOD_RANGE = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "range", IAny.class); + public static final JavaMethod METHOD_COMPARETO = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "compareTo", IAny.class); + public static final JavaMethod METHOD_CONTAINS = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "contains", IAny.class); + public static final JavaMethod METHOD_MEMBERGET = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "memberGet", String.class); + public static final JavaMethod METHOD_MEMBERSET = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "memberSet", String.class, IAny.class); + public static final JavaMethod METHOD_MEMBERCALL = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "memberCall", String.class, IAny[].class); + public static final JavaMethod METHOD_INDEXGET = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "indexGet", IAny.class); + public static final JavaMethod METHOD_INDEXSET = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "indexSet", IAny.class, IAny.class); + public static final JavaMethod METHOD_CALL = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "call", IAny[].class); + public static final JavaMethod METHOD_ASBOOL = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asBool"); + public static final JavaMethod METHOD_ASBYTE = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asByte"); + public static final JavaMethod METHOD_ASSHORT = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asShort"); + public static final JavaMethod METHOD_ASINT = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asInt"); + public static final JavaMethod METHOD_ASLONG = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asLong"); + public static final JavaMethod METHOD_ASFLOAT = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asFloat"); + public static final JavaMethod METHOD_ASDOUBLE = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asDouble"); + public static final JavaMethod METHOD_ASSTRING = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "asString"); + public static final JavaMethod METHOD_AS = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "as", Class.class); + public static final JavaMethod METHOD_IS = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "is", Class.class); + public static final JavaMethod METHOD_CANCASTIMPLICIT = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "canCastImplicit", Class.class); + public static final JavaMethod METHOD_GETNUMBERTYPE = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "getNumberType"); + public static final JavaMethod METHOD_ITERATORSINGLE = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "iteratorSingle"); + public static final JavaMethod METHOD_ITERATORMULTI = JavaMethod.get(EMPTY_REGISTRY, IAny.class, "iteratorMulti", int.class); + + private static final String SIG_ANY = "()" + signature(IAny.class); + private static final String SIG_ANY_ANY = "(" + signature(IAny.class) + ")" + signature(IAny.class); + private static final String SIG_ANY_INT = "(" + signature(IAny.class) + ")I"; + private static final String SIG_ANY_BOOL = "(" + signature(IAny.class) + ")Z"; + private static final String SIG_STRING_ANY = "(" + signature(String.class) + ")" + signature(IAny.class); + private static final String SIG_STRING_ANY_VOID = "(" + signature(String.class) + signature(IAny.class) + ")V"; + private static final String SIG_STRING_ANYARRAY_ANY = "(" + signature(String.class) + signature(IAny[].class) + ")" + signature(IAny.class); + private static final String SIG_ANY_ANY_VOID = "(" + signature(IAny.class) + signature(IAny.class) + ")V"; + private static final String SIG_ANYARRAY_ANY = "(" + signature(IAny[].class) + ")" + signature(IAny.class); + + private AnyClassWriter() {} + + public static byte[] construct(IAnyDefinition definition, String name, Type asmType) { + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + writer.visit( + Opcodes.V1_6, + Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, + name, + null, + internal(Object.class), + new String[] { internal(IAny.class) }); + + definition.defineMembers(writer); + + MethodOutput outputStaticCanCastImplicit = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, + "rtCanCastImplicit", + "(Ljava/lang/Class;)Z", + "(Ljava/lang/Class<*>;)Z", + null); + outputStaticCanCastImplicit.start(); + definition.defineStaticCanCastImplicit(outputStaticCanCastImplicit); + outputStaticCanCastImplicit.end(); + + MethodOutput outputStaticAs = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, + "rtAs", + "(ILjava/lang/Class;)Ljava/lang/Object;", + "(ILjava/lang/Class<*>;)Ljava/lang/Object;", + null); + outputStaticAs.start(); + definition.defineStaticAs(outputStaticAs); + outputStaticAs.end(); + + MethodOutput outputNot = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "not", + SIG_ANY, + null, + null); + outputNot.start(); + definition.defineNot(outputNot); + outputNot.end(); + + MethodOutput outputNeg = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "neg", + SIG_ANY, + null, + null); + outputNeg.start(); + definition.defineNeg(outputNeg); + outputNeg.end(); + + MethodOutput outputAdd = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "add", + SIG_ANY_ANY, + null, + null); + outputAdd.start(); + definition.defineAdd(outputAdd); + outputAdd.end(); + + MethodOutput outputSub = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "sub", + SIG_ANY_ANY, + null, + null); + outputSub.start(); + definition.defineSub(outputSub); + outputSub.end(); + + MethodOutput outputCat = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "cat", + SIG_ANY_ANY, + null, + null); + outputCat.start(); + definition.defineCat(outputCat); + outputCat.end(); + + MethodOutput outputMul = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "mul", + SIG_ANY_ANY, + null, + null); + outputMul.start(); + definition.defineMul(outputMul); + outputMul.end(); + + MethodOutput outputDiv = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "div", + SIG_ANY_ANY, + null, + null); + outputDiv.start(); + definition.defineDiv(outputDiv); + outputDiv.end(); + + MethodOutput outputMod = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "mod", + SIG_ANY_ANY, + null, + null); + outputMod.start(); + definition.defineMod(outputMod); + outputMod.end(); + + MethodOutput outputAnd = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "and", + SIG_ANY_ANY, + null, + null); + outputAnd.start(); + definition.defineAnd(outputAnd); + outputAnd.end(); + + MethodOutput outputOr = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "or", + SIG_ANY_ANY, + null, + null); + outputOr.start(); + definition.defineOr(outputOr); + outputOr.end(); + + MethodOutput outputXor = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "xor", + SIG_ANY_ANY, + null, + null); + outputXor.start(); + definition.defineXor(outputXor); + outputXor.end(); + + MethodOutput outputRange = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "range", + SIG_ANY_ANY, + null, + null); + outputRange.start(); + definition.defineRange(outputRange); + outputRange.end(); + + MethodOutput outputCompare = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "compareTo", + SIG_ANY_INT, + null, + null); + outputCompare.start(); + definition.defineCompareTo(outputCompare); + outputCompare.end(); + + MethodOutput outputContains = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "contains", + SIG_ANY_BOOL, + null, + null); + outputContains.start(); + definition.defineContains(outputContains); + outputContains.end(); + + MethodOutput outputMemberGet = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "memberGet", SIG_STRING_ANY, null, null); + outputMemberGet.start(); + definition.defineMemberGet(outputMemberGet); + outputMemberGet.end(); + + MethodOutput outputMemberSet = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "memberSet", SIG_STRING_ANY_VOID, null, null); + outputMemberSet.start(); + definition.defineMemberSet(outputMemberSet); + outputMemberSet.end(); + + MethodOutput outputMemberCall = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "memberCall", SIG_STRING_ANYARRAY_ANY, null, null); + outputMemberCall.start(); + definition.defineMemberCall(outputMemberCall); + outputMemberCall.end(); + + MethodOutput outputIndexGet = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "indexGet", SIG_ANY_ANY, null, null); + outputIndexGet.start(); + definition.defineIndexGet(outputIndexGet); + outputIndexGet.end(); + + MethodOutput outputIndexSet = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "indexSet", SIG_ANY_ANY_VOID, null, null); + outputIndexSet.start(); + definition.defineIndexSet(outputIndexSet); + outputIndexSet.end(); + + MethodOutput outputCall = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "call", SIG_ANYARRAY_ANY, null, null); + outputCall.start(); + definition.defineCall(outputCall); + outputCall.end(); + + MethodOutput outputAsBool = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asBool", "()Z", null, null); + outputAsBool.start(); + definition.defineAsBool(outputAsBool); + outputAsBool.end(); + + MethodOutput outputAsByte = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asByte", "()B", null, null); + outputAsByte.start(); + definition.defineAsByte(outputAsByte); + outputAsByte.end(); + + MethodOutput outputAsShort = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asShort", "()S", null, null); + outputAsShort.start(); + definition.defineAsShort(outputAsShort); + outputAsShort.end(); + + MethodOutput outputAsInt = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asInt", "()I", null, null); + outputAsInt.start(); + definition.defineAsInt(outputAsInt); + outputAsInt.end(); + + MethodOutput outputAsLong = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asLong", "()J", null, null); + outputAsLong.start(); + definition.defineAsLong(outputAsLong); + outputAsLong.end(); + + MethodOutput outputAsFloat = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asFloat", "()F", null, null); + outputAsFloat.start(); + definition.defineAsFloat(outputAsFloat); + outputAsFloat.end(); + + MethodOutput outputAsDouble = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asDouble", "()D", null, null); + outputAsDouble.start(); + definition.defineAsDouble(outputAsDouble); + outputAsDouble.end(); + + MethodOutput outputAsString = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "asString", "()Ljava/lang/String;", null, null); + outputAsString.start(); + definition.defineAsString(outputAsString); + outputAsString.end(); + + MethodOutput outputAs = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "as", + "(Ljava/lang/Class;)" + signature(IAny.class), + "(Ljava/lang/Class;)TT;", + null); + outputAs.start(); + definition.defineAs(outputAs); + outputAs.end(); + + MethodOutput outputIs = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "is", + "(Ljava/lang/Class;)Z", + "(Ljava/lang/Class<*>;)Z", + null); + outputIs.start(); + definition.defineIs(outputIs); + outputIs.end(); + + MethodOutput outputCanCastImplicit = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "canCastImplicit", "(" + signature(Class.class) + ")Z", "(Ljava/lang/Class<*>;)Z", null); + outputCanCastImplicit.start(); + outputCanCastImplicit.loadObject(1); + outputCanCastImplicit.invokeStatic(name, "rtCanCastImplicit", "(Ljava/lang/Class;)Z"); + outputCanCastImplicit.returnInt(); + outputCanCastImplicit.end(); + + MethodOutput outputGetNumberType = new MethodOutput(writer, Opcodes.ACC_PUBLIC, "getNumberType", "()I", null, null); + outputGetNumberType.start(); + definition.defineGetNumberType(outputGetNumberType); + outputGetNumberType.end(); + + MethodOutput outputIteratorSingle = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "iteratorSingle", + "()" + signature(Iterator.class), + "()Ljava/util/Iterator;", + null); + outputIteratorSingle.start(); + definition.defineIteratorSingle(outputIteratorSingle); + outputIteratorSingle.end(); + + MethodOutput outputIteratorMulti = new MethodOutput( + writer, + Opcodes.ACC_PUBLIC, + "iteratorMulti", + "(I)Ljava/util/Iterator;", + "(I)Ljava/util/Iterator<[Lstanhebben/zenscript/value/IAny;>;", + null); + outputIteratorMulti.start(); + definition.defineIteratorMulti(outputIteratorMulti); + outputIteratorMulti.end(); + + writer.visitEnd(); + return writer.toByteArray(); + } + + public static void throwUnsupportedException(MethodOutput output, String fromType, String operation) { + // throw new UnsupportedOperationException(fromType + " does not support the " + operation + " operator"); + output.newObject(UnsupportedOperationException.class); + output.dup(); + output.constant(fromType + " does not support the " + operation + " operator"); + output.construct(UnsupportedOperationException.class, String.class); + output.aThrow(); + } + + public static void throwCastException(MethodOutput output, String fromType, String toType) { + // throw new ClassCastException("Cannot cast " + fromType + " to " + [local:Class].getName()) + output.newObject(ClassCastException.class); + output.dup(); + output.constant("Cannot cast " + fromType + " to " + toType); + output.construct(ClassCastException.class, String.class); + output.aThrow(); + } + + public static void throwCastException(MethodOutput output, String fromType, int local) { + // throw new ClassCastException("Cannot cast " + fromType + " to " + [local:Class].getName()) + output.newObject(ClassCastException.class); + output.dup(); + + output.newObject(StringBuilder.class); + output.dup(); + output.construct(StringBuilder.class); + output.constant("Cannot cast " + fromType + " to "); + output.invokeVirtual(StringBuilder.class, "append", StringBuilder.class, String.class); + output.loadObject(local); + output.invokeVirtual(Class.class, "getName", String.class); + output.invokeVirtual(StringBuilder.class, "append", StringBuilder.class, String.class); + output.invokeVirtual(StringBuilder.class, "toString", String.class); + + output.construct(ClassCastException.class, String.class); + output.aThrow(); + } +} diff --git a/ZenScript/src/main/java/stanhebben/zenscript/util/IAnyDefinition.java b/ZenScript/src/main/java/stanhebben/zenscript/util/IAnyDefinition.java new file mode 100644 index 0000000..4f17c74 --- /dev/null +++ b/ZenScript/src/main/java/stanhebben/zenscript/util/IAnyDefinition.java @@ -0,0 +1,87 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package stanhebben.zenscript.util; + +import org.objectweb.asm.ClassVisitor; + +/** + * + * @author Stan + */ +public interface IAnyDefinition { + public void defineMembers(ClassVisitor output); + + public void defineStaticCanCastImplicit(MethodOutput output); + + public void defineStaticAs(MethodOutput output); + + public void defineNot(MethodOutput output); + + public void defineNeg(MethodOutput output); + + public void defineAdd(MethodOutput output); + + public void defineSub(MethodOutput output); + + public void defineCat(MethodOutput output); + + public void defineMul(MethodOutput output); + + public void defineDiv(MethodOutput output); + + public void defineMod(MethodOutput output); + + public void defineAnd(MethodOutput output); + + public void defineOr(MethodOutput output); + + public void defineXor(MethodOutput output); + + public void defineRange(MethodOutput output); + + public void defineCompareTo(MethodOutput output); + + public void defineContains(MethodOutput output); + + public void defineMemberGet(MethodOutput output); + + public void defineMemberSet(MethodOutput output); + + public void defineMemberCall(MethodOutput output); + + public void defineIndexGet(MethodOutput output); + + public void defineIndexSet(MethodOutput output); + + public void defineCall(MethodOutput output); + + public void defineAsBool(MethodOutput output); + + public void defineAsByte(MethodOutput output); + + public void defineAsShort(MethodOutput output); + + public void defineAsInt(MethodOutput output); + + public void defineAsLong(MethodOutput output); + + public void defineAsFloat(MethodOutput output); + + public void defineAsDouble(MethodOutput output); + + public void defineAsString(MethodOutput output); + + public void defineAs(MethodOutput output); + + public void defineIs(MethodOutput output); + + public void defineGetNumberType(MethodOutput output); + + public void defineIteratorSingle(MethodOutput output); + + public void defineIteratorMulti(MethodOutput output); +} diff --git a/ZenScript/src/main/java/stanhebben/zenscript/value/builtin/expansion/IByteExpansion.java b/ZenScript/src/main/java/stanhebben/zenscript/value/builtin/expansion/IByteExpansion.java new file mode 100644 index 0000000..5cfc994 --- /dev/null +++ b/ZenScript/src/main/java/stanhebben/zenscript/value/builtin/expansion/IByteExpansion.java @@ -0,0 +1,17 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package stanhebben.zenscript.value.builtin.expansion; + +import stanhebben.zenscript.value.IAny; + +/** + * + * @author Stan + */ +public interface IByteExpansion { + public IAny member(byte value, String member); +}