Skip to content

Commit cfd8052

Browse files
committed
Change init to not use the super constructor arguments
1 parent b1108c0 commit cfd8052

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

polymod/hscript/_internal/HScriptedClassMacro.hx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class HScriptedClassMacro
123123
for (arg in args)
124124
{name: arg.name, opt: arg.opt, type: Context.toComplexType(arg.t)}
125125
];
126-
var initField:Field = buildScriptedClassInit(cls, superCls, constArgs);
126+
var initField:Field = buildScriptedClassInit(cls, superCls);
127127
fields.push(initField);
128128
constructor = buildScriptedClassConstructor(constArgs);
129129
case TLazy(builder):
@@ -136,7 +136,7 @@ class HScriptedClassMacro
136136
for (arg in args)
137137
{name: arg.name, opt: arg.opt, type: Context.toComplexType(arg.t)}
138138
];
139-
var initField:Field = buildScriptedClassInit(cls, superCls, constArgs);
139+
var initField:Field = buildScriptedClassInit(cls, superCls);
140140
fields.push(initField);
141141
constructor = buildScriptedClassConstructor(constArgs);
142142
default:
@@ -151,7 +151,7 @@ class HScriptedClassMacro
151151
constructor = buildEmptyScriptedClassConstructor();
152152
// Create scripted class utility functions.
153153
Context.info(' Creating scripted class utils...', Context.currentPos());
154-
var initField:Field = buildScriptedClassInit(cls, superCls, []);
154+
var initField:Field = buildScriptedClassInit(cls, superCls);
155155
fields.push(initField);
156156
fields.push(constructor);
157157
}
@@ -166,13 +166,10 @@ class HScriptedClassMacro
166166
return fields;
167167
}
168168

169-
static function buildScriptedClassInit(cls:haxe.macro.Type.ClassType, superCls:haxe.macro.Type.ClassType, superConstArgs:Array<FunctionArg>):Field
169+
static function buildScriptedClassInit(cls:haxe.macro.Type.ClassType, superCls:haxe.macro.Type.ClassType):Field
170170
{
171171
// Context.info(' Building scripted class init() function', Context.currentPos());
172172
var clsTypeName:String = cls.pack.join('.') != '' ? '${cls.pack.join('.')}.${cls.name}' : cls.name;
173-
var superClsTypeName:String = superCls.pack.join('.') != '' ? '${superCls.pack.join('.')}.${superCls.name}' : superCls.name;
174-
175-
var constArgs = [for (arg in superConstArgs) macro $i{arg.name}];
176173
var typePath:haxe.macro.TypePath = {
177174
pack: cls.pack,
178175
name: cls.name,
@@ -184,7 +181,7 @@ class HScriptedClassMacro
184181
meta: null,
185182
pos: cls.pos,
186183
kind: FFun({
187-
args: [{name: 'clsName', type: macro :String},].concat(superConstArgs),
184+
args: [{name: 'clsName', type: macro :String}, {name: 'args', type: macro :...Dynamic}],
188185
params: null,
189186
ret: Context.toComplexType(Context.getType(clsTypeName)),
190187
expr: macro
@@ -198,7 +195,9 @@ class HScriptedClassMacro
198195
}
199196

200197
try {
201-
var result = clsRef.instantiate([$a{constArgs}]);
198+
if (args == null) args = haxe.Rest.of([]);
199+
200+
var result = clsRef.instantiate(args.toArray());
202201
if (result == null)
203202
{
204203
polymod.Polymod.error(SCRIPT_RUNTIME_EXCEPTION, 'Could not construct instance of scripted class (${clsName} extends ' + $v{clsTypeName} + '):\nUnknown error instantiating class');

polymod/hscript/_internal/PolymodInterpEx.hx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,14 @@ class PolymodInterpEx extends Interp
11841184
if (o == null)
11851185
errorEx(ENullObjectReference(f));
11861186

1187+
// Backwards compatibility for HScriptedClass.init since Haxe.Rest doesn't work with reflection.
1188+
// Std.isOfType(o, HScriptedClass) doesn't work if the type was retrieved from Type.resolveClass
1189+
// so to double check, we see if the function scriptStaticGet exists
1190+
if (f == 'init' && o.scriptStaticGet != null)
1191+
{
1192+
return Reflect.makeVarArgs((args:Array<Dynamic>) -> return o.init(args[0], args.slice(1)));
1193+
}
1194+
11871195
var oCls:String = Util.getTypeName(Type.typeof(o));
11881196

11891197
// Check if the field is a blacklisted static field.

0 commit comments

Comments
 (0)