1/* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { 17 EcmaCallarg0dyn, 18 EcmaCallarg1dyn, 19 EcmaCallargs2dyn, 20 EcmaCallargs3dyn, 21 EcmaCallirangedyn, 22 EcmaCallithisrangedyn, 23 EcmaCloseiterator, 24 EcmaCopydataproperties, 25 EcmaCopymodule, 26 EcmaCreatearraywithbuffer, 27 EcmaCreateemptyarray, 28 EcmaCreateemptyobject, 29 EcmaCreateobjecthavingmethod, 30 EcmaCreateobjectwithbuffer, 31 EcmaCreateobjectwithexcludedkeys, 32 EcmaCreateregexpwithliteral, 33 EcmaDebugger, 34 EcmaDefineasyncfunc, 35 EcmaDefineclasswithbuffer, 36 EcmaDefinefuncdyn, 37 EcmaDefinegeneratorfunc, 38 EcmaDefinegettersetterbyvalue, 39 EcmaDefinemethod, 40 EcmaDefinencfuncdyn, 41 EcmaDelobjprop, 42 EcmaGetiterator, 43 EcmaGetiteratornext, 44 EcmaGetnextpropname, 45 EcmaGetpropiterator, 46 EcmaImportmodule, 47 EcmaIsfalse, 48 EcmaIstrue, 49 EcmaLdglobalvar, 50 EcmaLdhomeobject, 51 EcmaLdlexenvdyn, 52 EcmaLdlexvardyn, 53 EcmaLdmodvarbyname, 54 EcmaLdobjbyindex, 55 EcmaLdobjbyname, 56 EcmaLdobjbyvalue, 57 EcmaLdsuperbyname, 58 EcmaLdsuperbyvalue, 59 EcmaNewlexenvdyn, 60 EcmaNewlexenvwithnamedyn, 61 EcmaNewobjdynrange, 62 EcmaPoplexenvdyn, 63 EcmaReturnundefined, 64 EcmaSetobjectwithproto, 65 EcmaStarrayspread, 66 EcmaStclasstoglobalrecord, 67 EcmaStconsttoglobalrecord, 68 EcmaStglobalvar, 69 EcmaStlettoglobalrecord, 70 EcmaStlexvardyn, 71 EcmaStmodulevar, 72 EcmaStobjbyindex, 73 EcmaStobjbyname, 74 EcmaStobjbyvalue, 75 EcmaStownbyindex, 76 EcmaStownbyname, 77 EcmaStownbynamewithnameset, 78 EcmaStownbyvalue, 79 EcmaStownbyvaluewithnameset, 80 EcmaStsuperbyname, 81 EcmaStsuperbyvalue, 82 EcmaSupercall, 83 EcmaSupercallspread, 84 EcmaThrowconstassignment, 85 EcmaThrowdeletesuperproperty, 86 EcmaThrowdyn, 87 EcmaThrowifnotobject, 88 EcmaThrowifsupernotcorrectcall, 89 EcmaThrowpatternnoncoercible, 90 EcmaThrowthrownotexists, 91 EcmaThrowundefinedifhole, 92 EcmaTryldglobalbyname, 93 EcmaTrystglobalbyname, 94 FldaiDyn, 95 Imm, 96 IRNode, 97 Jmp, 98 Label, 99 LdaDyn, 100 LdaiDyn, 101 LdaStr, 102 MovDyn, 103 StaDyn, 104 EcmaLdbigint, 105 VReg 106} from "../irnodes"; 107 108export function loadAccumulatorInt(value: number): IRNode { 109 return new LdaiDyn(new Imm(value)); 110} 111 112export function loadAccumulatorFloat(value: number): IRNode { 113 return new FldaiDyn(new Imm(value)); 114} 115 116export function loadAccumulatorString(value: string): IRNode { 117 return new LdaStr(value); 118} 119 120export function loadAccumulator(vreg: VReg): IRNode { 121 return new LdaDyn(vreg); 122} 123 124export function storeAccumulator(vreg: VReg): IRNode { 125 return new StaDyn(vreg); 126} 127 128export function deleteObjProperty(obj: VReg, prop: VReg): IRNode { 129 return new EcmaDelobjprop(obj, prop); 130} 131 132export function moveVreg(vd: VReg, vs: VReg): IRNode { 133 return new MovDyn(vd, vs); 134} 135 136export function jumpTarget(target: Label): IRNode { 137 return new Jmp(target); 138} 139 140export function creatDebugger(): IRNode { 141 return new EcmaDebugger(); 142} 143 144export function throwException(): IRNode { 145 return new EcmaThrowdyn(); 146} 147 148export function throwConstAssignment(name: VReg) { 149 return new EcmaThrowconstassignment(name); 150} 151 152export function throwUndefinedIfHole(hole: VReg, name: VReg) { 153 return new EcmaThrowundefinedifhole(hole, name); 154} 155 156export function throwThrowNotExists() { 157 return new EcmaThrowthrownotexists(); 158} 159 160export function throwDeleteSuperProperty() { 161 return new EcmaThrowdeletesuperproperty(); 162} 163 164export function newLexicalEnv(numVars: number, scopeInfoIdx: number | undefined) { 165 if (scopeInfoIdx == undefined) { 166 return new EcmaNewlexenvdyn(new Imm(numVars)); 167 } 168 return new EcmaNewlexenvwithnamedyn(new Imm(numVars), new Imm(scopeInfoIdx)); 169} 170 171export function loadLexicalEnv() { 172 return new EcmaLdlexenvdyn(); 173} 174 175export function popLexicalEnv() { 176 return new EcmaPoplexenvdyn(); 177} 178 179export function loadLexicalVar(level: number, slot: number) { 180 return new EcmaLdlexvardyn(new Imm(level), new Imm(slot)); 181} 182 183export function storeLexicalVar(level: number, slot: number, value: VReg) { 184 return new EcmaStlexvardyn(new Imm(level), new Imm(slot), value); 185} 186 187export function tryLoadGlobalByName(key: string) { 188 return new EcmaTryldglobalbyname(key); 189} 190 191export function tryStoreGlobalByName(key: string) { 192 return new EcmaTrystglobalbyname(key); 193} 194 195export function loadGlobalVar(name: string) { 196 return new EcmaLdglobalvar(name); 197} 198 199export function storeGlobalVar(name: string) { 200 return new EcmaStglobalvar(name); 201} 202 203export function loadObjByName(obj: VReg, key: string) { 204 return new EcmaLdobjbyname(key, obj); 205} 206 207export function storeObjByName(obj: VReg, key: string) { 208 return new EcmaStobjbyname(key, obj); 209} 210 211export function loadObjByIndex(obj: VReg, index: number) { 212 return new EcmaLdobjbyindex(obj, new Imm(index)); 213} 214 215export function storeObjByIndex(obj: VReg, index: number) { 216 return new EcmaStobjbyindex(obj, new Imm(index)); 217} 218 219export function loadObjByValue(obj: VReg, prop: VReg): IRNode { 220 return new EcmaLdobjbyvalue(obj, prop); 221} 222 223export function storeObjByValue(obj: VReg, prop: VReg): IRNode { 224 return new EcmaStobjbyvalue(obj, prop); 225} 226 227export function storeOwnByName(obj: VReg, key: string, nameSetting: boolean): IRNode { 228 return nameSetting ? new EcmaStownbynamewithnameset(key, obj) : new EcmaStownbyname(key, obj); 229} 230 231export function storeOwnByIndex(obj: VReg, index: number) { 232 return new EcmaStownbyindex(obj, new Imm(index)); 233} 234 235export function storeOwnByValue(obj: VReg, value: VReg, nameSetting: boolean) { 236 return nameSetting ? new EcmaStownbyvaluewithnameset(obj, value) : new EcmaStownbyvalue(obj, value); 237} 238 239export function throwIfSuperNotCorrectCall(num: number) { 240 return new EcmaThrowifsupernotcorrectcall(new Imm(num)); 241} 242 243export function call(args: VReg[], passThis: boolean) { 244 let length = args.length; 245 let insn: IRNode; 246 if (!passThis) { 247 switch (length) { 248 case 1: 249 insn = new EcmaCallarg0dyn(args[0]); 250 break; 251 case 2: 252 insn = new EcmaCallarg1dyn(args[0], args[1]); 253 break; 254 case 3: 255 insn = new EcmaCallargs2dyn(args[0], args[1], args[2]); 256 break; 257 case 4: 258 insn = new EcmaCallargs3dyn(args[0], args[1], args[2], args[3]); 259 break; 260 default: 261 insn = new EcmaCallirangedyn(new Imm(length - 1), args); 262 } 263 } else { 264 insn = new EcmaCallithisrangedyn(new Imm(length - 1), args); 265 } 266 267 return insn; 268} 269 270export function newObject(args: VReg[]) { 271 return new EcmaNewobjdynrange(new Imm(args.length), args); 272} 273 274export function getPropIterator() { 275 return new EcmaGetpropiterator(); 276} 277 278export function getNextPropName(iter: VReg) { 279 return new EcmaGetnextpropname(iter); 280} 281 282export function returnUndefined() { 283 return new EcmaReturnundefined(); 284} 285 286export function createEmptyObject() { 287 return new EcmaCreateemptyobject(); 288} 289 290export function createObjectHavingMethod(idx: number) { 291 return new EcmaCreateobjecthavingmethod(new Imm(idx)); 292} 293 294export function createObjectWithBuffer(idx: number) { 295 return new EcmaCreateobjectwithbuffer(new Imm(idx)); 296} 297 298export function setObjectWithProto(proto: VReg, object: VReg) { 299 return new EcmaSetobjectwithproto(proto, object); 300} 301 302export function copyDataProperties(dstObj: VReg, srcObj: VReg) { 303 return new EcmaCopydataproperties(dstObj, srcObj); 304} 305 306export function defineGetterSetterByValue(obj: VReg, name: VReg, getter: VReg, setter: VReg) { 307 return new EcmaDefinegettersetterbyvalue(obj, name, getter, setter); 308} 309 310export function createEmptyArray() { 311 return new EcmaCreateemptyarray(); 312} 313 314export function createArrayWithBuffer(idx: number) { 315 return new EcmaCreatearraywithbuffer(new Imm(idx)); 316} 317 318export function storeArraySpread(array: VReg, index: VReg) { 319 return new EcmaStarrayspread(array, index); 320} 321 322export function defineClassWithBuffer(id: string, idx: number, parameterLength: number, env: VReg, base: VReg) { 323 return new EcmaDefineclasswithbuffer(id, new Imm(idx), new Imm(parameterLength), env, base); 324} 325 326export function createObjectWithExcludedKeys(obj: VReg, args: VReg[]) { 327 return new EcmaCreateobjectwithexcludedkeys(new Imm(args.length - 1), obj, args); 328} 329 330export function throwObjectNonCoercible() { 331 return new EcmaThrowpatternnoncoercible(); 332} 333 334export function throwIfNotObject(v: VReg) { 335 return new EcmaThrowifnotobject(v); 336} 337 338export function getIterator() { 339 return new EcmaGetiterator(); 340} 341 342export function getIteratorNext(iter: VReg, nextMethod: VReg) { 343 return new EcmaGetiteratornext(iter, nextMethod); 344} 345 346export function closeIterator(iter: VReg) { 347 return new EcmaCloseiterator(iter); 348} 349 350export function superCall(num: number, start: VReg) { 351 return new EcmaSupercall(new Imm(num), start); 352} 353 354export function superCallSpread(vs: VReg) { 355 return new EcmaSupercallspread(vs); 356} 357 358export function ldSuperByName(obj: VReg, key: string) { 359 return new EcmaLdsuperbyname(key, obj); 360} 361 362export function stSuperByName(obj: VReg, key: string) { 363 return new EcmaStsuperbyname(key, obj); 364} 365 366export function stSuperByValue(obj: VReg, prop: VReg) { 367 return new EcmaStsuperbyvalue(obj, prop); 368} 369 370export function ldSuperByValue(obj: VReg, prop: VReg): IRNode { 371 return new EcmaLdsuperbyvalue(obj, prop); 372} 373 374export function importModule(name: string) { 375 return new EcmaImportmodule(name); 376} 377 378export function loadModuleVarByName(name: string, module: VReg) { 379 return new EcmaLdmodvarbyname(name, module); 380} 381 382export function storeModuleVariable(name: string) { 383 return new EcmaStmodulevar(name); 384} 385 386export function copyModuleIntoCurrentModule(mod: VReg) { 387 return new EcmaCopymodule(mod); 388} 389 390export function loadHomeObject() { 391 return new EcmaLdhomeobject(); 392} 393 394export function defineFunc(name: string, env: VReg, paramLength: number) { 395 return new EcmaDefinefuncdyn(name, new Imm(paramLength), env); 396} 397 398export function defineAsyncFunc(name: string, env: VReg, paramLength: number) { 399 return new EcmaDefineasyncfunc(name, new Imm(paramLength), env); 400} 401 402export function defineGeneratorFunc(name: string, env: VReg, paramLength: number) { 403 return new EcmaDefinegeneratorfunc(name, new Imm(paramLength), env); 404} 405 406export function defineNCFunc(name: string, env: VReg, paramLength: number) { 407 return new EcmaDefinencfuncdyn(name, new Imm(paramLength), env); 408} 409 410export function defineMethod(name: string, env: VReg, paramLength: number) { 411 return new EcmaDefinemethod(name, new Imm(paramLength), env); 412} 413 414export function isTrue() { 415 return new EcmaIstrue(); 416} 417 418export function isFalse() { 419 return new EcmaIsfalse(); 420} 421 422export function createRegExpWithLiteral(pattern: string, flags: number) { 423 return new EcmaCreateregexpwithliteral(pattern, new Imm(flags)); 424} 425 426export function stLetToGlobalRecord (name: string) { 427 return new EcmaStlettoglobalrecord(name); 428} 429 430export function stConstToGlobalRecord (name: string) { 431 return new EcmaStconsttoglobalrecord(name); 432} 433 434export function stClassToGlobalRecord (name: string) { 435 return new EcmaStclasstoglobalrecord(name); 436} 437 438export function loadAccumulatorBigInt(value: string): IRNode { 439 return new EcmaLdbigint(value); 440}