diff --git a/src/main/js/lib/events-canary.js b/src/main/js/lib/events-canary.js index 19b264e..1b90657 100644 --- a/src/main/js/lib/events-canary.js +++ b/src/main/js/lib/events-canary.js @@ -1,3 +1,4 @@ +/*global nashorn, exports, require, Packages, __plugin*/ var cmPriority = Packages.net.canarymod.plugin.Priority, cmCanary = Packages.net.canarymod.Canary, cmDispatcher = Packages.net.canarymod.hook.Dispatcher, @@ -40,13 +41,10 @@ exports.on = function( The workaround is to make the ScriptCraftPlugin java class a Listener. Should only unregister() registered plugins in ScriptCraft js code. */ - try { + if (nashorn){ // nashorn - eventType = eventType.class; - } catch ( e ){ - // non-nashorn - eventType = eventType; - } + eventType = require('nashorn-type')(eventType); + } regd = new cmPluginListener({}); cmHookExecutor.registerHook(regd, __plugin, eventType, eventExecutor, priority); result.unregister = function(){ diff --git a/src/main/js/lib/nashorn-type.js b/src/main/js/lib/nashorn-type.js new file mode 100644 index 0000000..ad3f731 --- /dev/null +++ b/src/main/js/lib/nashorn-type.js @@ -0,0 +1,8 @@ +/* + The .class operator causes problems for non-nashorn Java on Mac OS X and some other + environments. So need to have it in a separate module which should only be loaded in + nashorn environment. +*/ +module.exports = function(t){ + return t.class; +}; diff --git a/src/main/js/lib/scriptcraft.js b/src/main/js/lib/scriptcraft.js index 73ee136..7261b9f 100644 --- a/src/main/js/lib/scriptcraft.js +++ b/src/main/js/lib/scriptcraft.js @@ -383,6 +383,7 @@ This function takes a single parameter and returns true if it's an operator or h */ var global = this; var server; +global.nashorn = typeof Java !== 'undefined'; /* private implementation */ @@ -624,7 +625,7 @@ function __onEnable ( __engine, __plugin, __script ) { /* wph 20140312 don't delete self on nashorn until https://bugs.openjdk.java.net/browse/JDK-8034055 is fixed */ - if ( typeof Java === 'undefined' ) { // Java is an object in Nashorn + if ( !nashorn ) { delete global.self; delete global.__engine; } diff --git a/src/main/js/modules/canary/items.js b/src/main/js/modules/canary/items.js index 7fabbac..b1c714f 100644 --- a/src/main/js/modules/canary/items.js +++ b/src/main/js/modules/canary/items.js @@ -29,11 +29,11 @@ function getMaterialHandler( material ){ } }; } -try { +if (nashorn){ /* nashorn */ - var itemTypeClass = ItemType.class; + var itemTypeClass = require('nashorn-type')(ItemType); var materials = itemTypeClass.getDeclaredFields(); for (var i = 0;i < materials.length; i++ ){ @@ -48,19 +48,18 @@ try { items[name] = getMaterialHandler(materialField.get(ItemType)); } -} catch ( e ){ +} else { // non-nashorn for (var field in ItemType){ if (ItemType[field] === undefined){ continue; } - if (ItemType[field].class != ItemType){ + if (!(ItemType[field] instanceof ItemType)){ continue; } var name = (''+field).replace(/^(.)/,function(a){ return a.toLowerCase(); }); - console.log(name); items[name] = getMaterialHandler(ItemType[field]); } }